就使用 nvcc
而言,需要在连词中使用相应的 gcc
(我相信当前最大值5.4)。当然,这在某种程度上阻止了一个在主机侧使用C 17。
由于C 17可以使用clang 5
及向上编译(请参阅此处),并且也可以编译CUDA代码(请参阅此处),可以同时使用C 17和CUDA同一时间(或者是否存在问题,例如使用CUDA运行时)?
是的,正如您已经猜到Cuda Clang Frontend的确在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扩展的lambdas和c 14放松的constexpr在现代C 中很重要,即使在C 11和C 14模式中也添加了NVCC 8.0 标志的模式为了启用这些功能:https://devblogs.nvidia.com/new-compiler-features-cuda-8/
这意味着上面的示例例如使用NVCC 9.2编译,即使在删除演示C 17 if constexpr
构造并添加-std=c++14 --expt-relaxed-constexpr
标志时,即使没有__device__
预选赛。
这是有关nvcc
和clang -x cuda
设备方面的C 标准支持的列表:https://gist.github.com/ax3l/9489132#device-side-c-side-c-standard-support(NVCC 11.0C 现在。)
当前在设备代码中支持至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
您可以看到要点是构建它们。