我正在尝试使用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的更多信息?
答案 0 :(得分:1)
问题在于此行将__decfloat32
定义为float __attribute__ mode((SD))
。所有这些下划线表明您正在使用特定于编译器的名称。情况确实如此:__decfloat32
是GCC扩展。这在GCC在具有十进制浮点硬件的AIX系统上运行时非常有用。
NVCC显然没有针对AIX。即使他们实施与GCC相同的__attribute__((mode))
,他们仍然会将其限制为SF
和DF
。即使TF
(128位)也会丢失,因为NVidia不支持。他们肯定不会花费几个月来实现十进制浮点数,因此mode(SD)
也不会被实现。
尽管如此,我仍然99%确定这是一个XY问题。十进制和二进制浮点都是有限精度近似,64位二进制FP数比32位十进制FP更精确,更快。