GNU十进制浮点类型和NVCC

时间:2015-09-15 09:49:28

标签: c++ gcc cuda nvcc

我正在尝试使用GNCC十进制浮点数和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时代码运行良好。

此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并且它不再编译。我可以将设备/主机代码分开,但我正在调查GCC十进制库如何与NVCC结合使用。

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

1 个答案:

答案 0 :(得分:1)

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

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

尽管如此,我仍然99%确定这是一个XY问题。十进制和二进制浮点都是有限精度近似,64位二进制FP数比32位十进制FP更精确,更快。