就使用nvcc
而言,需要结合使用相应的gcc
(我相信目前最大为5.4)。这当然会在某种程度上阻止人们在主机端使用 C++17。
因为 C++17 可以使用 clang 5
和更高版本编译(参见 here ),并且也可以编译 cuda 代码(参见 here ),是不是是否可以同时使用 C++17 和 CUDA(或者是否会出现问题,例如 CUDA 运行时)?
最佳答案
是的,正如您已经猜到的那样,CUDA clang 前端在 C++ 功能支持方面确实领先,甚至在设备代码方面也是如此。这已经是过去了,在 NVCC 之前引入了 C++14 特性,社区大多没有注意到。
以这个 C++17 为例,不必要地修改了 if constexpr
,片段:Fibo
#include <cuda_runtime.h>
#include <cstdio>
constexpr unsigned
fibonacci(const unsigned x) {
if constexpr (false)
{
return 0u;
}
if( x <= 1 )
return 1;
return fibonacci(x - 1) + fibonacci(x - 2);
}
__global__
void k()
{
constexpr unsigned arg = fibonacci(5);
printf("%u", arg);
}
int main()
{
k<<<1,1>>>();
return 0;
}
它已经使用 clang++ -std=c++17 -x cuda
运行:https://cuda.godbolt.org/z/GcIqeW
然而,对于这个特定示例,C++17 扩展的 lambda 和 C++14 宽松的 constexpr 在现代 C++ 中非常重要,即使在 NVCC 8.0+ 标志的 C++11 和 C++14 模式中也被添加已经启用这些功能:https://devblogs.nvidia.com/new-compiler-features-cuda-8/
这意味着在删除演示 C++17 if constexpr
构造并添加 -std 时,即使没有
标志。__device__
限定符,上面的示例也可以使用 NVCC 9.2 进行编译=c++14 --expt-relaxed-constexpr
以下是设备端对 nvcc
和 clang -x cuda
的 C++ 标准支持列表:https://gist.github.com/ax3l/9489132#device-side-c-standard-support (NVCC 11.0 现在支持设备端 C++17。)
关于c++ - 可以使用 clang 将 C++17 与 CUDA 一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47959767/