NVCC使用CMAKE的cuda_compile_ptx编译为ptx

时间:2014-10-04 23:52:17

标签: cuda cmake nvcc

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

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

并且可以使用:

轻松地将其编译为ptx文件kernel.ptx
  

nvcc -ptx kernel.cu

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

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?

2 个答案:

答案 0 :(得分:5)

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文件。

答案 1 :(得分:1)

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

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