C++ 17可以和CUDA一起使用clang吗?

GPM*_*ler 11 c++ cuda clang c++17

就使用而言nvcc,需要使用相应的gcc(当前最大5.4我相信).这当然有点妨碍了在主机端使用C++ 17.

由于C++ 17可以使用clang 5向上编译(参见此处),也可以编译cuda代码(参见此处),是否可以同时使用C++ 17和CUDA(或者可以使用问题,例如CUDA运行时)?

Ax3*_*x3l 6

是的,您已经猜到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;
}
Run Code Online (Sandbox Code Playgroud)

它已经运行了clang++ -std=c++17 -x cudahttps : //cuda.godbolt.org/z/GcIqeW

不过,对于这个特定示例,C ++ 17扩展的lambda和C ++ 14宽松的constexpr在现代C ++中非常重要,即使在C ++ 11和C ++ 14模式下,都添加了NVCC 8.0+标志以启用这些功能。功能已经存在:https : //devblogs.nvidia.com/new-compiler-features-cuda-8/

这意味着上面的示例__device__在删除演示性的C ++ 17 if constexpr构造并添加-std=c++14 --expt-relaxed-constexpr标志时,即使没有限定符,也可以使用NVCC 9.2进行编译。

以下是nvcc和的设备端有关C ++标准支持的列表clang -x cudahttps : //gist.github.com/ax3l/9489132#device-side-c-standard-support


You*_* Nj 5

目前设备代码最高支持 C++14(在CUDA 9中引入)

--std {c++03|c++11|c++14}
Run Code Online (Sandbox Code Playgroud)

用于指定编译器/链接器行为的选项

但是,如果您的主机仅使用 C++17,则应该可以使用单独的编译并将它们与库链接。单独编译和链接 CUDA C++ 设备代码

更新:格式和更多信息