gpt4 book ai didi

c++ - concurrency::fast_math::tanh() 在 parallel_for_each (C++ AMP) 处返回 NaN

转载 作者:行者123 更新时间:2023-11-30 03:45:35 38 4
gpt4 key购买 nike

我用c++ amp计算了这个值。环境:VS2015,Win8。
当运行 parallel_for_each 函数时,值为 NaN。原因是 concurrency::fast_math::tanh 函数。

concurrency::fast_math::tanh 函数在运行 parallel_for_each 时参数大于 1000 时返回 NaN:

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;

输出

1e+07,nan

案例 2,如果不运行 parallel_for_each:

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;

输出:

1e+07,1

这是我意料之中的结果。如果将 tanh 更改为 tanhf 结果是相同的。

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

最佳答案

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

要解决此问题,您可以调用 precise_math 下的函数,

concurrency::precise_math::tanh(t);

如果这太慢并且 fast_math::tanh 的精度足够了,您可以尝试类似的方法

double myTanh(double t){
return (concurrency::fast_math::fabs(t)>100) ? concurrency::precise_math::copysign(1,t) : concurrency::fast_math::tanh(t);
}

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

关于c++ - concurrency::fast_math::tanh() 在 parallel_for_each (C++ AMP) 处返回 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34718656/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com