[英]Can C++17 be used together with CUDA using clang?
是的,正如您已经猜到的,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 : clang++ -std=c++17 -x cuda
尽管如此,对于这个特定的例子,C++17 扩展的 lambdas 和 C++14 宽松的 constexpr 在现代 C++ 中很重要,即使在 C++11 和 C++14 模式下,NVCC 8.0+ 标志也被添加来启用这些功能已经: https : //devblogs.nvidia.com/new-compiler-features-cuda-8/
这意味着在删除演示 C++17 if constexpr
构造并添加-std=c++14 --expt-relaxed-constexpr
标志时,即使没有__device__
限定符,上面的示例也可以使用 NVCC 9.2 进行编译。
以下是有关nvcc
和clang -x cuda
设备端 C++ 标准支持的列表: https ://gist.github.com/ax3l/9489132#device-side-c-standard-support(NVCC 11.0 支持设备端现在是 C++17。)
目前设备代码最多支持 C++14(在CUDA 9 中引入)
--std {c++03|c++11|c++14}
但是,如果您的主机仅使用 C++17,则应该可以使用单独的编译并将它们与库链接。 CUDA C++设备代码的单独编译链接
更新:格式和更多信息
我遇到了同样的问题,这里有一个简单的例子,供任何遇到同样问题的人使用。
假设有 3 个文件: main.cpp
cuda_calling.cpp
cuda_calling.h
,其中main.cpp
使用c++17
或您的nvcc
不支持的任何内容。 顾名思义, cuda_calling.cpp
必须由nvcc
编译。
首先,将cuda_calling.cpp
构建为 lib(在实际情况下,可能有很多文件在调用 cuda。否则,构建为目标文件即cuda_calling.o
)。 输出文件假定为lib_cudacalling.a
。 然后将main.cpp
和整个项目构建为一个 cmake 文件:
cmake_minimun_required(VERSION 3.5)
project(separate)
add_compile_options(-std=c++17)
find_package(CUDA REQUIRED)
add_library(${PROJECT_NAME}.o OBJECT main.cpp) # build as an object file first
add_executable(${PROJECT_NAME} $<TARGET_OBJECTS:${PROJECT_NAME}.o>)
target_link_libraries(${PROJECT_NAME} cuda_calling) # you may need to specify the path
你可以看到,关键的一点是单独构建它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.