gpt4 book ai didi

CUDA 浮点加法给出错误答案(与 CPU 浮点运算相比)

转载 作者:行者123 更新时间:2023-12-04 21:34:00 24 4
gpt4 key购买 nike

关闭。这个问题需要debugging details .它目前不接受答案。












想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。

4年前关闭。




Improve this question




我是 CUDA 的新手。我正在使用 cuda 来查找浮点向量的点阵,我在 cuda 中遇到了浮点加法问题。本质上,下面是简单的内核。我正在使用 -arch=sm_50
所以基本思想是让 thread_0 将向量 a 的值相加。

__global__ void temp(float *a, float *b, float *c) {

if (0 == threadIdx.x && blockIdx.x == 0 && blockIdx.y ==0 ) {
float xx = 0.0f;
for (int i = 0; i < LENGTH; i++){
xx += a[i];
}
*c = xx;
}
}

当我用 1.0 的 1000 个元素初始化 'a' 时,我得到了 1000.00 的期望结果

但是当我用 1.1 初始化 'a' 时,我应该得到 1100.00xx 但相反,我得到了 1099.989014。 cpu 实现简单地产生 1100.000024

我试图了解这里的问题! :-(

我什至尝试计算 a 向量中 1.1 个元素的数量,结果为 1000,这是预期的。我什至使用了 atomicAdd ,但仍然有同样的问题。

如果有人能在这里帮助我,将不胜感激!

最好的事物

编辑:
这里最大的问题是 CPU 结果与 GPU 结果的差异!我知道浮点数可能会偏离一些小数点。但是GPU误差非常显着! :-(

最佳答案

使用 IEEE-754 浮点表示法无法准确表示 1.1。正如@RobertCrovella 在他的评论中提到的那样,在 CPU 上执行的计算使用的 IEEE-754 设置与 GPU 设置不同。

实际上,浮点数中的 1.1 存储为 0x3F8CCCCD = 即 1.10000002384185。对 1000 个元素执行求和,最后一位在路由中丢失 ,第一次加法的一位,四位之后的两位,等等,直到 1000 之后的 10 位。根据舍入模式,您可以截断后半部分的 10 位,因此最终求和 0x3F8CCC00,即 1.09997558。

CUDA除以1000的结果是0x3F8CCC71,与32位计算一致。

在 CPU 上编译时,根据优化标志,您可能正在使用快速数学,它使用内部寄存器精度。如果不指定向量寄存器,则可以使用 80 位精度的 x87 FPU。在这种情况下,计算将读取浮点数中的 1.1,即 1.10000002384185,使用更高的精度将其相加 1000 次,因此在舍入时不会丢失任何位,从而得到 1100.00002384185,并显示 1100.000024,这是它的舍入值。

根据编译标志,Cpu 上的实际等效计算可能需要执行 32 位浮点运算,这可以使用 addss 来完成。以 SSE2 指令集为例。

你也可以玩/fp:选项或 -mfpmath与编译器和探索发出指令。在那种情况下,组装说明 fadd是 80 位精度加法。

所有这些都与 GPU 浮点精度无关。这是对 IEEE-754 规范和传统 x87 FPU 行为的一些误解。

关于CUDA 浮点加法给出错误答案(与 CPU 浮点运算相比),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43290002/

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