首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >concurrency::fast_math::tanh()返回parallel_for_each的NaN (C++ AMP)

concurrency::fast_math::tanh()返回parallel_for_each的NaN (C++ AMP)
EN

Stack Overflow用户
提问于 2016-01-11 18:02:30
回答 1查看 483关注 0票数 1

我用c++放大器计算了它的值。环境: VS2015、Win8。

运行parallel_for_each函数时,值为NaN。原因是concurrency::fast_math::tanh函数。

当通过concurrency::fast_math::tanh运行时,当参数大于1000时,parallel_for_each函数返回NaN

代码语言:javascript
复制
float arr[2];
concurrency::array_view<float> arr_view(2, arr);
concurrency::extent<1> ex;
ex[0] = 1;
parallel_for_each(ex, [=](Concurrency::index<1> idx) restrict(amp){
    float t = 10000000;
    arr_view[0] = concurrency::fast_math::fabs(t);
    arr_view[1] = concurrency::fast_math::tanh(t);
});

arr_view.synchronize();
std::cout << arr[0] << "," << arr[1] << std::endl;

输出

代码语言:javascript
复制
1e+07,nan

如果未运行parallel_for_each,则为case2:

代码语言:javascript
复制
float arr[2];
concurrency::array_view<float> arr_view(2, arr);
concurrency::extent<1> ex;
ex[0] = 1;
float t = 10000000;
arr_view[0] = concurrency::fast_math::fabs(t);
arr_view[1] = concurrency::fast_math::tanh(t);

arr_view.synchronize();
std::cout << arr[0] << "," << arr[1] << std::endl;

输出:

代码语言:javascript
复制
1e+07,1

这是我所期待的结果。如果将tanh更改为tanhf,则结果相同。

为什么tanh函数返回NaN?为什么只在运行parrallel_for_each时返回NaN?请告诉我问题的原因和解决方法。

EN

回答 1

Stack Overflow用户

发布于 2016-01-11 18:58:48

fast_math中定义的函数优先考虑速度而不是精度。实现和精度依赖于硬件。如果不使用parallel_for_each语法,代码将在CPU上运行,CPU只实现一个“精确”的tanh函数,因此会给出正确的答案。

要修复此问题,您可以调用precise_math下的函数,

代码语言:javascript
复制
concurrency::precise_math::tanh(t);

如果这样做太慢,而且fast_math::tanh的精度也足够,您可以尝试如下所示的方法

代码语言:javascript
复制
double myTanh(double t){
  return (concurrency::fast_math::fabs(t)>100) ? concurrency::precise_math::copysign(1,t) : concurrency::fast_math::tanh(t);
}

它可能会比精确版本运行得更快,也可能不会,这取决于硬件。所以你需要运行一些测试。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34718656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档