我正在使用 CUDA 代码构建一个项目,使用最近的 CMake,它具有内在的 CUDA 支持(版本 >= 3.8 或更高版本,如果需要)。
如何告诉 CMake(同时)为我的各种内核生成 PTX 文件?
CUDA_PTX_COMPILATION
属性: 定义一个对象库来包含 PTX 而不是各种对象
add_library(myptx OBJECT a.cu b.cu)
set_property(TARGET myptx PROPERTY CUDA_PTX_COMPILATION ON)
然而,这并不是问题的正确解决方案——缺少了一些东西。假设我们有
a.cu
:
__global__ void foo() { return; }
和
b.cu
:
__global__ void bar(int* a) { *a = 5; }
我们使用以下
cmake
运行 make
和 CMakeLists.txt
:
cmake_minimum_required(VERSION 3.9)
add_library(myptx OBJECT a.cu b.cu)
set_property(TARGET myptx PROPERTY CUDA_PTX_COMPILATION ON)
不会生成 PTX 文件,并且 nvcc 不会运行。不知道为什么。
尝试打开CUDA语言。
cmake_minimum_required(VERSION 3.9)
enable_language(CUDA)
add_library(myptx OBJECT a.cu b.cu)
set_property(TARGET myptx PROPERTY CUDA_PTX_COMPILATION ON)
PTX 位于
${CMAKE_BINARY_DIR}/CMakeFiles/myptx.dir
您可以将
--keep
命令行选项传递给 nvcc,这将使所有中间文件保留在用于其他输出的同一目录中。使用较新的 CMake 版本,您可以编写:
target_compile_options(
some_target
another_target
yet_another_target_etc
PRIVATE
"--keep"
)
这样就可以了。看起来
.ptx
最终出现在二进制文件所在的位置。但是 - 请注意,您还会获得无数其他文件:.cpp4.ii
、.cudafe1.c
、.cudafe1.cpp
、.fatbin
等等。因此,虽然这有效,但这并不是一个很好的解决方案。
正如其他答案提到的,您可以将
--keep
命令行选项传递给 nvcc。但是cmake文件应该这样写:
target_compile_options(youtarget PRIVATE $<$<COMPILE_LANGUAGE:CUDA>:--keep>)