我用c++放大器计算了它的值。环境: VS2015、Win8。
运行parallel_for_each函数时,值为NaN。原因是concurrency::fast_math::tanh函数。
当通过concurrency::fast_math::tanh运行时,当参数大于1000时,parallel_for_each函数返回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如果未运行parallel_for_each,则为case2:
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?请告诉我问题的原因和解决方法。
发布于 2016-01-11 18:58:48
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);
}它可能会比精确版本运行得更快,也可能不会,这取决于硬件。所以你需要运行一些测试。
https://stackoverflow.com/questions/34718656
复制相似问题