cuda 5.0 和 7.5 之间的默认 CUDA 添加舍入模式

Default CUDA addition rounding mode between cuda 5.0 and 7.5

我有一个 cuda 循环,其中变量 cumul 以双精度存储累加:

double cumulative_value = (double)0;
loop(...)
{
    // ...
    double valueY = computeValueY();
    // ...
    cumulative_value += valueY
}

这段代码是在不同的SDK和运行两台电脑上编译的:

 M1 : TeslaM2075 CUDA 5.0
 M2 : TeslaM2075 CUDA 7.5

第10步,结果不同。此加法的值(十六进制双精度表示)为:

   0x 41 0d d3 17 34 79 27 4d    => cumulative_value
+  0x 40 b6 60 1d 78 6f 09 b0    => valueY
-------------------------------------------------------
=    
  0x 41 0e 86 18 20 3c 9f 9b (for M1)
  0x 41 0e 86 18 20 3c 9f 9a (for M2)

正如我在 ptx cuda 文件 (== add.f64) 中看到的那样,没有指定舍入模式,但 M1 似乎使用舍入来加上 Infinity,而 M1 似乎使用另一种模式。

如果我为此指令强制使用 4 种舍入模式之一 (__dadd_XX()),cumulative_value 始终不同于 M1,甚至在第 10 步之前也是如此。
但是如果我强制M1和M2使用相同的舍入模式,结果是相同的但不等于修改前的M1。

我的目标是在 M2 机器 (cuda 7.5) 上获得 M1 (cuda 5.0) 结果,但我不了解 运行 时的默认舍入模式行为。我想知道如果未指定,路由模式是否在 运行 时间是动态的。你有什么想法吗?

在另一次 ptx 分析之后,在我的例子中,valueY 是根据 cuda 5.0 上的 FMA 指令计算的,而 cuda 7.5 编译器使用 MUL 和 ADD 指令。 Cuda 文档解释了使用单个 FMA 指令只有一个舍入步骤,而使用 MUL 和 ADD 有两个舍入步骤。非常感谢你帮助我 :)