540 字
3 分钟
cuda和cpu
2024-08-11

现象#

import torch
from pycox.models.loss import CoxPHLoss

loss = CoxPHLoss()
predic_risk = torch.tensor([0.1, -2.1, 0.5], dtype=torch.float32)#.to("cuda")
target = torch.tensor([0, 0, 0], dtype=torch.float32)#.to("cuda")
os = torch.tensor([13.7, 1.2, 12.7], dtype=torch.float32)#.to("cuda")
print(loss(predic_risk, target, os))

在运行代码的时候,我观察到这段代码的to cudatensor(0.5910, device='cuda:0')和to cputensor(0.3563)的计算结果不一致,根据NVIDIA的文档,CPU和GPU计算结果不一致的原因主要与浮点数的表示和运算方式有关。总结如下:

1、浮点数表示差异:CPU和GPU使用不同的浮点数表示标准,如IEEE 754。这些标准在处理浮点数时可能会有细微的差异,尤其是在处理极端情况或边界值时。

2、舍入误差:在浮点数运算中,由于精度限制,舍入误差是不可避免的。CPU和GPU可能在舍入策略上有所不同,导致结果的微小差异。

3、运算精度:CPU和GPU可能在支持的运算精度上有所不同。例如,某些GPU可能更倾向于使用单精度浮点数,而CPU可能更倾向于使用双精度浮点数。这种差异可能导致计算结果的不同。

4、硬件架构差异:CPU和GPU的硬件架构差异可能导致它们在执行相同计算任务时的性能和准确性有所不同。GPU通常设计为并行处理大量数据,而CPU则更侧重于通用计算。

5、优化和近似算法:在某些情况下,GPU可能会使用特定的优化或近似算法来提高性能,这可能会影响计算结果的准确性。

6、软件和驱动程序差异:CPU和GPU的软件栈和驱动程序也可能导致计算结果的差异。不同的编译器优化、库函数实现等都可能影响最终的计算结果。

比如在exp计算上的差异就很大,所以不必担心

总结#

在一般使用中,可以不必追求cpu和gpu计算的结果一致性,也也避免不了,且cpu和gpu导致的细小差别,在训练的效果上几乎没有区别。

cuda和cpu
https://fuwari.vercel.app/posts/硬件知识/cuda和cpu/
作者
FlyingWhite
发布于
2024-08-11
许可协议
CC BY-NC-SA 4.0