Компиляция NVCC в ptx с помощью CMAKE cuda_compile_ptx

У меня простое ядро ​​в файле 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
)

но когда я печатаю

сделай . && делать

файл ptx не создается. Как я могу воспроизвести поведение указанной выше команды nvcc с помощью cmake? В частности, как:

  • добавить автономную компиляцию файлов ptx в цель (например, все): я заметил, что когда внутри того же CMakeFile есть другой исполняемый файл cuda_add_executable, он также создает файл ptx, иначе нет.

  • назовите файл как исходный файл, но с окончанием .ptx вместо .cu: относится к этому вопросу: Как изменить имя выходного файла cuda_compile_ptx в CMake?


person adrelino    schedule 04.10.2014    source источник


Ответы (2)


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)

Теперь, если вы запустите make или make ptx, он сгенерирует файлы ptx.

person jet47    schedule 05.10.2014
comment
отлично, это работает, но он дает мне файл с именем cuda_compile_ptx_generated_kernel.cu.ptx из-за этой строки в FindCUDA: (см. thread Я упоминал выше) set(generated_file_basename "${cuda_target}_generated_${basename}.ptx") поскольку я не понимаю, как взломать файл FindCUDA, просто используя мой CMakeList, есть ли способ переименовать вывод, хранящийся в ${cuda_ptx_files}, в формат, который я хочу использовать с помощью CMake? - person adrelino; 05.10.2014
comment
Вы можете переименовать его с помощью 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}) и использовать ${CMAKE_BINARY_DIR}/my_ptx.ptx в add_custom_target. - person jet47; 05.10.2014
comment
@jet47: Могу ли я сделать это копирование универсальным, чтобы файлы .ptx создавались там, где будут создаваться файлы .o? Или в другом месте, но с теми же именами файлов, что и у .cu? - person einpoklum; 29.02.2016

Просто для справки, это то, что сработало для настройки моего проекта (у меня есть папка 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 -включаю/ -DCUDA_MATLAB

person adrelino    schedule 05.10.2014