我应该如何让CMake也为我的内核创建PTX文件

时间:2019-05-05 15:47:52

标签: build cmake cuda ptx

我正在使用具有固有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运行makeCMakeLists.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。不知道为什么。

2 个答案:

答案 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