c++ - 可以使用 clang 将 C++17 与 CUDA 一起使用吗?

标签 c++ cuda clang c++17

就使用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 标志。

以下是设备端对 nvccclang -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/

相关文章:

c++ - cin 和循环的问题

c++ - CUDA 内核中的 While 循环失败

gcc - boost::variant 与多态性,clang 和 gcc 的性能结果非常不同

c - 有没有办法检测,C 文件被直接编译成可执行文件?

vim - clang_complete 和 iOS

C++ Fstream 输出不起作用

c++ - 是否可以从 C printf() 捕获错误?

c++ - Thrust/CUDA reduce_by_key 给出不确定的结果

c++ - 在我的命名空间中隐藏 DirectX 命名空间

profiling - gnuplot的宽度图