我正在使用具有固有CUDA支持(如果需要,版本> = 3.8或更高版本)的最新CMake,使用CUDA代码构建项目。
如何告诉CMake(也)为各种内核生成PTX文件?
从CMake 3.9开始,我们可以使用CUDA_PTX_COMPILATION
property将对象库定义为具有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。不知道为什么。
答案 0 :(得分:1)
您可以将--keep
命令行选项传递给nvcc,这将使其将所有中间文件保留在用于其他输出的同一目录中。对于较新的CMake版本,您将编写:
target_compile_options(
some_target
another_target
yet_another_target_etc
PRIVATE
"--keep"
)
,应该这样做。看来.ptx
最终在二进制文件所在的位置。但是-请注意,您还将获得大量其他文件:.cpp4.ii
,.cudafe1.c
,.cudafe1.cpp
,.fatbin
,依此类推。因此,尽管可行,但这并不是一个很好的解决方案。
答案 1 :(得分:1)
尝试打开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