CMake за генериране на MSVC CUDA проект, който е насочен към по-нови устройства

Моят компютър има GTX 580 (компютърни възможности 2.0).

Искам да компилирам източник на CUDA, който използва динамичен паралелизъм, функция, въведена в изчислителната способност 3.5.

Знам, че няма да мога да стартирам програмата на моя GPU, но трябва да е възможно да компилирам този код на моята машина. Предполагам това, защото мога да компилирам без проблеми 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.


person Marco    schedule 09.07.2014    source източник
comment
Забравих да кажа: Използвам CMake 2.8.12.2.   -  person Marco    schedule 10.07.2014
comment
Вероятно свързано с този бъг на FindCUDA.cmake: public.kitware.com/Bug/ view.php?id=15016   -  person Marco    schedule 11.07.2014


Отговори (2)


От 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

person Stone    schedule 21.12.2014

Оказа се грешка в 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 (бъгът е по-добре описан там)

person Marco    schedule 11.07.2014