Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cuda:cpu和gpu之间的不同答案减少了_Cuda_Thrust - Fatal编程技术网

cuda:cpu和gpu之间的不同答案减少了

cuda:cpu和gpu之间的不同答案减少了,cuda,thrust,Cuda,Thrust,我犯了一个很奇怪的错误。我用推力减少法对矩阵中的所有元素求和。它在大多数数据中运行良好,但在一组数据中出错 代码: 我还尝试不构建推力::设备_向量,而是使用原始指针。输出相同。我也试过cublas圆点产品。输出相同 我用matlab来确认上面的cpu结果是正确的 发生了什么事?这是GPU上的下溢吗?谢谢 我只能推测可能出现的错误,但我会假设这是一个下溢(或者具体地说,CPU和GPU处理IEEE-754非规范化数字的方式不同) 基本上,CPU根据IEEE-754标准处理它们,尽管效率很低 另一

我犯了一个很奇怪的错误。我用推力减少法对矩阵中的所有元素求和。它在大多数数据中运行良好,但在一组数据中出错

代码:

我还尝试不构建推力::设备_向量,而是使用原始指针。输出相同。我也试过cublas圆点产品。输出相同

我用matlab来确认上面的cpu结果是正确的


发生了什么事?这是GPU上的下溢吗?谢谢

我只能推测可能出现的错误,但我会假设这是一个下溢(或者具体地说,CPU和GPU处理IEEE-754非规范化数字的方式不同)

基本上,CPU根据IEEE-754标准处理它们,尽管效率很低

另一方面,GPU通常将它们等同于0。我不知道是否有一种CUDA方法可以强制CPU为开发目的刷新非规范化数字(我主要使用OpenCL),但C/C++方法通常是

_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);
或者,在gcc中,使用
-ffast math
编译

请勾选此问题:

结果到底有多错误?第二个数组中元素的最大绝对值是多少?也许这只是由于不同的求和顺序造成的?cpu结果3.4972e-14是正确的,经matlab验证。gpu和cpu中的内存布局是相同的:都是列格式,展开为长向量。所以两个和都是沿着列的,顺序是随机的。根据数组中值的大小,这可能重要,也可能不重要。例如1e40-1e40+1!=1e40+1-1e40@user2684645对不起,我误解了这个问题。当我使用FMAD的时候,你在做减量,所以我把事情搞混了。当然,禁用FMAD没有效果,因为代码中没有FMAD。看一看的第二个答案。它引用了一篇文章,指出了“大型数字集的求和容易出现严重的舍入错误”。您编译并运行的是什么GPU体系结构(计算能力)?您可以将
-ftz=true
传递给
nvcc
传递给,或者
-ftz=false
不将非规范化值刷新为零,对于单精度数字。在本例中,问题表示双精度。除了Robert Crovella所说的,-ftz=true是编译平台>=sm_20时的编译器默认值。看起来不同的求和顺序导致了不同的结果。要确定哪个结果更准确(CPU或GPU),必须使用更高精度的参考。
cpu: -568.691
gpu: -568.691

cpu: 3.4972e-14
gpu: 1.40998e-14

cpu: 0.234375
gpu: 0.234375
_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);