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

Posted

技术标签:

【中文标题】我应该如何让 CMake 也为我的内核创建 PTX 文件【英文标题】:How should I get CMake to also create PTX files for my kernels 【发布时间】:2019-05-05 15:47:51 【问题描述】:

我正在使用具有内在 CUDA 支持的最新 CMake(如果需要,版本 >= 3.8 或更高版本)使用 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; 

我们运行cmakemake 并使用以下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。不知道为什么。

【问题讨论】:

@Tsyvarev:将半答案移到问题中。 您想要 PTX 做什么?适当编译的二进制有效载荷包含 PTX 和 SASS。这还不够吗? @talonmies:我不介意 PTX 是否是从二进制后验中提取的。我只想检查 PTX 代码以及构建二进制文件。 【参考方案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 等等。因此,虽然这可行,但它并不是一个很好的解决方案。

【讨论】:

【参考方案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

【讨论】:

以上是关于我应该如何让 CMake 也为我的内核创建 PTX 文件的主要内容,如果未能解决你的问题,请参考以下文章

我应该为我的库和应用程序使用哪些编译器标志以获得最佳性能 NDK (CMake)

CMAKE Cuda/ptx 项目上的重复代码生成标志

如何在 CMake 中隐藏某些目标?

OpenCL 内核的 LLVM IR 到 PTX 到二进制

我可以将“静态”CUDA 内核启动与 PTX 代码结合起来并获得一个工作二进制文件吗?

如何让 CMake 在 Windows 上找到 google protobuf?