C 17可以与CUDA一起使用Clang
Can C++17 be used together with CUDA using clang?
就使用 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
您可以看到要点是构建它们。
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 奇怪的结构&GCC&clang(void*返回类型)
- 与clang++一起使用的VS代码在构建良好的C++文件中显示错误
- 是否可以将 Clang-Tidy 与 QNX 一起使用?
- 如何将 Clang 静态分析器与 Cortex-M 项目一起使用?
- C 17可以与CUDA一起使用Clang
- 无法将libc++与clang++-5.0一起使用
- 可以与CMAKE-BUILD一起使用Clang静态分析仪(扫描构建)
- GCC 中的编译器错误,但在将 decltype 与具有尾随返回类型语法的模板化成员函数一起使用时没有 clang
- GCC vs Clang:将功能与-FPIC一起插入
- 将 boost/thread headers 与 clang++ (Windows) 一起使用时出现问题
- 将 TI 链接器命令文件与 Clang 一起使用
- 如何将Compiler实例和ASTConsumer与clang 3.6一起使用
- 在 ubuntu 12.04 上设置 Xerces 以与 cmake 和 clang 一起使用
- 不允许Clang格式与评论混在一起
- 将 clang 3.1 与初始值设定项列表一起使用
- Clang:将绑定或mem_fn与字符串::c_str和转换一起使用时出现问题
- 如何让c++ 0x / c++ 11风格的基于范围的for循环与clang一起工作
- c++ 11,枚举类,在c++中未定义引用,与clang++一起工作