GNU 十进制浮点类型和 NVCC

GNU decimal floating types and NVCC

我正在尝试将 GNU 十进制浮点数与 NVCC 一起使用,但出现以下错误:

/usr/include/c++/4.8/decimal/decimal(230): error: invalid argument to attribute "mode"

受影响的行如下:

typedef float __decfloat32 __attribute__((mode(SD)));

我假设 NVCC 不支持 SD 作为模式的参数。是否有任何解决方法,或者 NVCC 无法解决?为 CPU.

编译时代码运行良好

How/where这个SD有定义吗?

谢谢!


更新: 我可以找到为 GCC 定义 SD 的位置。这里有两个很好的答案:

What does GCC __attribute__((mode(XX)) actually do?

对于 GCC:gcc/gcc/machmode.def

/* Decimal floating point modes.  */ 
DECIMAL_FLOAT_MODE (SD, 4, decimal_single_format);
DECIMAL_FLOAT_MODE (DD, 8, decimal_double_format);
DECIMAL_FLOAT_MODE (TD, 16, decimal_quad_format);

在 *.cpp 文件中隔离主机代码工作正常。一旦代码进入 *.cu,就会使用 NVCC,并且不再编译。我可以将 device/host 代码分开,但我正在研究 GCC 十进制库如何在内部与 NVCC 结合工作。

在哪里可以找到有关与此相关的 NVCC 的更多信息?

问题在于此行将 __decfloat32 定义为 float __attribute__ mode((SD))。所有这些下划线表示您正在使用特定于编译器的名称。确实是这样:__decfloat32 是一个 GCC 扩展。这主要在 GCC 在具有十进制浮点硬件的 AIX 系统上运行时有用。

NVCC 显然不针对 AIX。即使他们会实现与 GCC 相同的 __attribute__((mode)),他们仍然会将其限制为 SFDF。甚至 TF(128 位)也会丢失,因为 NVidia 不支持它。他们肯定不会花几个月的时间来实现十进制浮点数,所以 mode(SD) 也不会实现。

不过,我 99% 确定这是一个 XY 问题。十进制和二进制浮点数都是有限精度的近似值,64 位二进制浮点数比 32 位十进制浮点数更精确、更快。