nvcc编译错误,带有“ M_PI”和“或”

时间:2019-05-27 03:55:31

标签: cuda nvcc cl

当尝试编译这段代码时:

#define _USE_MATH_DEFINES
#include <cmath>
#include <cstdio>

void minimal_example(){
    int i=2;
    if(i==3 or i==4) printf("I want %d!\n",M_PI);
}

使用

nvcc -x cu -Xcompiler=/permissive- -dc cuda_nvcc_cl_test.cu -o cuda_nvcc_cl_test.obj

出现以下错误(在第7行中):

error: expected a ")"
error: identifier "M_PI" is undefined

我将Windows 10与Visual Studio的cl.exe(x64版本19.16.27031.1)和CUDA工具包10.1结合使用。

cmath替换为math.h,将or替换为||(或者添加#include <ciso646>)时,错误消失了。但是,是否有一些编译器选项或其他可能性,以便我可以按原样保留代码?

还有-Xcompiler=/permissive-为什么没有帮助?

1 个答案:

答案 0 :(得分:2)

这里有2个问题:

  1. 在解析代码之前,显然nvcc包含cmath。如接受的答案here中所讨论的,如果您包含cmath并且在那时没有实例化定义,则不会得到M_PI的定义,和< / em>由于包含防护,后续包含cmath的内容将无法解决。可能的解决方法是将-D_USE_MATH_DEFINES添加到编译命令行中。这样将从编译过程开始就将定义放在适当的位置,并且M_PI就是通过这种方式定义的。

  2. 与我理解为正确或标准行为相反,使用or代替||似乎取决于包含ciso646(在{{1 }}仅适用于Windows / VisualStudio。Linux上的nvcc似乎不需要)。是的,我知道不应以这种方式工作,但是似乎有必要。 This may be an issue with Visual Studio。如果愿意,可以尝试使用nvcc开关。 (尝试时似乎没有帮助。)

使用CUDA 10.1,在VS2019上,当我对此进行编译时:

/Za

使用以下命令行:

#include <cstdio>
#include <ciso646>

void minimal_example(){
    int i=2;
    if(i==3 or i==4) printf("I want %f!\n",M_PI);
}

我没有收到任何错误或警告。请注意,我还将nvcc -x cu -dc test.cu -o test.obj -D_USE_MATH_DEFINES 的格式说明符从printf更改为%d,以与%f的类型保持一致。

如果您确实不想包含M_PI,请使用ciso646的{​​{1}} supports来直接从命令行包含文件。因此,我可以将其编译为:

nvcc

像这样:

-include

没有错误或警告。