- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我用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/
我用c++ amp计算了这个值。环境:VS2015,Win8。 当运行 parallel_for_each 函数时,值为 NaN。原因是 concurrency::fast_math::tanh 函数
我是一名优秀的程序员,十分优秀!