带有“M_PI”和“or”的 nvcc 编译错误

Posted

技术标签:

【中文标题】带有“M_PI”和“or”的 nvcc 编译错误【英文标题】:nvcc compilation errors with "M_PI" and "or" 【发布时间】:2019-05-27 03:55:30 【问题描述】:

尝试编译这段代码时:

#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

我正在使用带有 Visual Studio 的 cl.exe(x64 版本 19.16.27031.1)和 CUDA 工具包 10.1 的 Windows 10。

cmath 替换为math.h 并将or 替换为||(或者添加#include &lt;ciso646&gt;)时,错误消失。但是,是否有一些编译器选项或其他可能性,以便我可以保持代码不变?

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

【问题讨论】:

M_PI 也在cmath 中通过包含math.h 定义 【参考方案1】:

这里有两个问题:

    显然nvcc 包含cmath 在解析您的代码之前。正如在接受的答案here 中所讨论的,如果您包含cmath 并且您没有在此时实例化定义,您将不会得到M_PI 定义,随后包含cmath 不会解决这个问题,因为包括警卫。一种可能的解决方法是将-D_USE_MATH_DEFINES 添加到您的编译命令行中。这将定义从编译过程开始就到位,M_PI 就是这样定义的。

    与我读到的正确或标准行为相反,使用or 代替|| 似乎以包含ciso646 为条件(仅在Windows/Visual Studio 上使用nvcc .nvcc 在 linux 上似乎不需要这个)。是的,我知道它不应该那样工作,但它似乎是必要的。 This may be an issue with Visual Studio。如果您愿意,可以尝试使用/Za 开关。 (当我尝试时,它似乎没有帮助。)

使用 CUDA 10.1,在 VS2019 上,当我编译这个时:

#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 的类型保持一致。

如果您真的不想包含ciso646nvcc supports,请使用-include 开关直接从命令行包含文件。因此我可以编译这个:

#include <cstdio>

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 -include ciso646

没有错误或警告。

【讨论】:

谢谢,这非常有用!您是否了解为什么 -Xcompiler=/permissive- 不起作用?我希望它将 permissive- 选项传递给 cl 编译器。 PS:请原谅 printf 中的 d/f 错字。 我不知道你对那个开关有什么期望,“没有工作”或“没有帮助”对我来说没有任何意义。你读过docs吗?在这种情况下,您希望该开关做什么?什么没有奏效?请注意,末尾带有减号的permissive- 会使编译器限制更多。它禁用语言许可行为并尝试执行更严格的合规性。 还注意到上面链接的文档中permissive- 似乎是从更高版本的 VS2017 开始的默认行为。所以我不确定添加它会有什么不同;它已经默认开启。 更清楚地说,我的期望是使用 /permissive- 我不会收到有关使用 or 的错误,基于:***.com/questions/24414124/…

以上是关于带有“M_PI”和“or”的 nvcc 编译错误的主要内容,如果未能解决你的问题,请参考以下文章

带有 VS 2013 的 cuda v6.5 nvcc 失败,神秘的消息

Visual Studio 是不是使用 nvcc 编译 cuda 代码?

gcc7 的 NVCC 错误

CUDA compiler driver nvcc 散点 part 2

使用gcc和nvcc编译时,eigen :: matrix反转的行为不同

nvcc 在调试模式下编译失败:需要单个文件