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

问题描述 投票:0回答:3

我正在使用 CUDA 代码构建一个项目,使用最近的 CMake,它具有内在的 CUDA 支持(版本 >= 3.8 或更高版本,如果需要)。

如何告诉 CMake(同时)为我的各种内核生成 PTX 文件?

我尝试过但不起作用的东西:

从 CMake 3.9 开始,我们可以使用

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 不会运行。不知道为什么。

build cmake cuda ptx
3个回答
2
投票

尝试打开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


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
等等。因此,虽然这有效,但这并不是一个很好的解决方案。


0
投票

正如其他答案提到的,您可以将

--keep
命令行选项传递给 nvcc。但是cmake文件应该这样写:

target_compile_options(youtarget PRIVATE $<$<COMPILE_LANGUAGE:CUDA>:--keep>)
© www.soinside.com 2019 - 2024. All rights reserved.