CMake для создания проекта MSVC CUDA, предназначенного для новых устройств

Мой компьютер имеет GTX 580 (вычислительная способность 2.0).

Я хочу скомпилировать исходный код CUDA, использующий динамический параллелизм, функцию, представленную в вычислительных возможностях 3.5.

Я знаю, что не смогу запустить программу на своем графическом процессоре, однако должна быть возможность скомпилировать этот код на моей машине. Я предполагаю это, потому что я могу без проблем скомпилировать примеры CUDA, которые используют возможность 3.5. Эти примеры поставляются с проектами Visual Studio, которые были "сгенерированы вручную" (я думаю).

Я считаю, что моя проблема с CMake. Я использую CMake для создания проекта Visual Studio 2012.

Мой первый CMakeLists.txt выглядел так:

PROJECT(sample-cuda-tests)

FIND_PACKAGE(CUDA REQUIRED)

INCLUDE_DIRECTORIES(${CUDA_INCLUDE_DIRS})
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)

FILE(GLOB_RECURSE includes ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h )
FILE(GLOB_RECURSE sources ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cu )

CUDA_ADD_EXECUTABLE(sample-cuda-tests ${includes} ${sources})
TARGET_LINK_LIBRARIES(sample-cuda-tests ${CUDA_LIBRARIES})

Затем, при компиляции сгенерированного проекта Visual Studio 2012, я получил предупреждение с ошибкой:

warning : The 'compute_10' and 'sm_10' architectures are deprecated, and may be removed in a future release.

error : calling a __global__ function from a __global__ function is only allowed on the compute_35 architecture or above

Что и ожидалось. Потом я добавил

list(APPEND CUDA_NVCC_FLAGS -gencode arch=compute_35,code=sm_35)

в CMakeLists. Предупреждение исчезло, но я получил:

error : kernel launch from __device__ or __global__ functions requires separate compilation mode

Хорошо. Поэтому я добавил в CMakeLists:

set(CUDA_SEPARABLE_COMPILATION ON)

... и получил это:

fatal error : nvcc supports '--relocatable-device-code=true (-rdc=true)', '--device-c (-dc)', and '--device-link (-dlink)' only when targeting sm_20 or higher

Что странно, потому что я думал, что я нацелился на sm_35 (выше, чем sm_20).

Позже я обнаружил, что могу установить некоторые параметры непосредственно в команде CUDA_ADD_EXECUTABLE. Поэтому я удалил строку, которая добавляла значения в CUDA_NVCC_FLAGS, и изменил команду CUDA_ADD_EXECUTABLE на:

CUDA_ADD_EXECUTABLE(sample-cuda-tests ${includes} ${sources} OPTIONS -gencode arch=compute_35,code=sm_35)

То, что я получил, было:

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.0\bin\crt\link.stub : fatal error C1083: Cannot open compiler generated file: 'C:/Users/sms/Desktop/sample-cuda-tests/CMakeFiles/sample-cuda-tests.dir/Debug/sample-cuda-tests_intermediate_link.obj': No such file or directory

Не знаю, куда идти сейчас. Ценю любую помощь.

Я использую CUDA SDK 6.0 на Windows 7.

2 ответа

Решение

Оказалось, ошибка на FindCUDA.cmake.

Если для параметра CUDA_SEPARABLE_COMPILATION задано значение ON, если файлы.cu не находятся в той же папке, что и файл CMakeLists.txt, промежуточные объекты связи создаются в неправильной папке, что приводит к ошибке компиляции, которая в Visual Studio выглядит следующим образом:

Cannot open compiler generated file: 'project_path/CMakeFiles/project_name/Debug/project_name_intermediate_link.obj': No such file or directory.

Я открыл проблему в трекере ошибок CMake: http://public.kitware.com/Bug/view.php?id=15016(там лучше описана ошибка)

Начиная с CMake 3.1.0, сценарий CMake пропускает создание каталога для размещения промежуточного файла. Добавьте следующий фрагмент в FindCUDA.cmake

get_filename_component(output_file_path "${output_file}" PATH)
add_custom_command(
  TARGET ${cuda_target}
  PRE_LINK
  COMMAND ${CMAKE_COMMAND} -E make_directory ${output_file_path}
)

прямо перед

if (do_obj_build_rule)

в функции CUDA_LINK_SEPARABLE_COMPILATION_OBJECTS

Другие вопросы по тегам