gpt4 book ai didi

c++ - 如何摆脱CUDA和CPU之间不同的对数结果?

转载 作者:搜寻专家 更新时间:2023-10-30 23:58:20 25 4
gpt4 key购买 nike

我想使用 CUDA 在 GPU 中实现一个算法。同时,我用C++写了一个CPU版来验证GPU版的结果。但是,在 CPU 和 GPU 中使用 log() 时遇到了麻烦。一个非常简单的算法(在 CPU 和 GPU 上都使用)如下所示:

float U;
float R = U * log(U);

但是,当我比较 CPU 端的结果时,我发现有很多结果(1843161 中有 459883 个)差异很小(最大差异为 0.5)。部分结果如下所示:

U       -- R (CPU side)  -- R (GPU side)  -- R using Python (U * math.log(U))

86312.0 -- 980998.375000 -- 980998.3125 -- 980998.3627440572
67405.0 -- 749440.750000 -- 749440.812500 -- 749440.7721980268
49652.0 -- 536876.875000 -- 536876.812500 -- 536876.8452369706
32261.0 -- 334921.250000 -- 334921.281250 -- 334921.2605240216
24232.0 -- 244632.437500 -- 244632.453125 -- 244632.4440747978

有人可以给我一些建议吗?我应该相信哪一个?

最佳答案

Which one should I trust?

您应该相信 Python 计算的 double 结果,您也可以使用 CUDA 或 C++ 计算 double 以获得非常相似(尽管可能仍然不相同)的值。

重新表述 aland 的第一条评论,如果您关心 980998 中的 0.0625 错误,则您一开始就不应该使用单精度。对于该精度级别,CPU 和 GPU 结果都是“错误的”。在您的示例中,CPU 结果恰好更准确,但您可以看到两个单精度结果与更准确的 double Python 结果相去甚远。这仅仅是使用允许 24 位有效二进制数字(大约 7 位十进制数字)的格式的结果,不仅用于输入和最终结果,还用于中间计算。

如果输入以 float 的形式提供,并且您想要 R 的最准确的 float 结果,请计算 U * log( U) 使用 double 并仅在最后四舍五入为 float。那么 CPU 和 GPU 之间的结果几乎总是相同的。

关于c++ - 如何摆脱CUDA和CPU之间不同的对数结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20887617/

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