C 17可以与CUDA一起使用Clang

Can C++17 be used together with CUDA using clang?

本文关键字:一起 Clang CUDA      更新时间:2023-10-16

就使用 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__预选赛。

这是有关nvccclang -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

您可以看到要点是构建它们