【问题标题】:NVCC compile to ptx using CMAKE's cuda_compile_ptxNVCC 使用 CMAKE 的 cuda_compile_ptx 编译到 ptx
【发布时间】:2014-11-29 15:41:47
【问题描述】:

我在文件 kernel.cu 中有简单的内核

__global__ void add1( double * pi, double c ) 
{
    *pi += c;
}

并且可以很容易地将它编译成一个 ptx 文件 kernel.ptx:

nvcc -ptx kernel.cu

现在,我想使用带有以下 CMakeLists.txt 的 cmake 重现相同的行为:

cmake_minimum_required(VERSION 2.8)
project(cmake_ptx)
find_package(CUDA REQUIRED)
cuda_compile_ptx(
  test
  kernel.cu
)

但是当我输入时

cmake 。 && 制作

没有构建 ptx 文件。如何使用 cmake 重现上述 nvcc 命令的行为?具体来说,如何:

  • 将ptx文件的独立编译添加到目标(例如全部):我注意到当同一个CMakeFile中有另一个cuda_add_executable时,它也会构建ptx文件,否则不会.

  • 将文件命名为源文件,但以 .ptx 而不是 .cu 结尾: 与此问题相关: How do I change the output filename of cuda_compile_ptx in CMake?

【问题讨论】:

    标签: cuda cmake nvcc


    【解决方案1】:

    cuda_compile_ptx 仅创建生成文件的规则,但不将它们添加到任何目标。您需要添加自定义目标,这取决于 ptx 文件:

    cmake_minimum_required(VERSION 2.8)
    project(cmake_ptx)
    find_package(CUDA REQUIRED)
    cuda_compile_ptx(
      cuda_ptx_files
      kernel.cu
    )
    add_custom_target(ptx ALL
        DEPENDS ${cuda_ptx_files} kernel.cu
        SOURCES kernel.cu)
    

    现在如果您运行makemake ptx,它将生成ptx 文件。

    【讨论】:

    • 很好,可以,但它给了我一个名为 cuda_compile_ptx_generated_kernel.cu.ptx 的文件,因为 FindCUDA 中的这一行:(参见上面提到的 threadset(generated_file_basename "${cuda_target}_generated_${basename}.ptx") 因为我不明白如何仅使用我的 CMakeList 破解 FindCUDA 文件,有没有办法将存储在 ${cuda_ptx_files} 中的输出重命名为我想要使用 CMake 的格式?
    • 你可以用add_custom_command重命名它:add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/my_ptx.ptx COMMAND ${CMAKE_COMMAND} -E copy ${cuda_ptx_files} ${CMAKE_BINARY_DIR}/my_ptx.ptx DEPENDS ${cuda_ptx_files})并在add_custom_target中使用${CMAKE_BINARY_DIR}/my_ptx.ptx
    • @jet47:我可以使复制通用化,以便在生成 .o 文件的地方生成 .ptx 文件吗?或者在其他地方,但文件名与 .cu 相同?
    【解决方案2】:

    仅供参考,这适用于我的项目设置(我有一个 src/ 和一个 include/ 文件夹),使用已接受答案中的提示:

    cmake_minimum_required(VERSION 2.8)
    
    project(cmake_ptx)
    
    find_package(CUDA REQUIRED)
    include_directories(include/)
    
    cuda_compile_ptx(
      cuda_ptx_files
      src/common_kernels.cu
      OPTIONS -DCUDA_MATLAB
    )
    add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/common_kernels.ptx COMMAND ${CMAKE_COMMAND} -E rename ${cuda_ptx_files} ${CMAKE_BINARY_DIR}/common_kernels.ptx DEPENDS ${cuda_ptx_files}) 
    add_custom_target(ptx ALL
        DEPENDS ${CMAKE_BINARY_DIR}/common_kernels.ptx src/common_kernels.cu
        SOURCES src/common_kernels.cu
    )
    

    这给了我与调用完全相同的输出:

    nvcc -ptx src/common_kernels.cu -I include/ -DCUDA_MATLAB

    【讨论】:

      猜你喜欢
      • 2020-07-12
      • 2014-02-10
      • 2016-04-29
      • 2011-12-03
      • 2015-01-30
      • 1970-01-01
      • 2020-04-12
      • 2012-09-29
      • 2013-10-05
      相关资源
      最近更新 更多