0

我的電腦有一個GTX 580(計算能力2.0)。CMake生成一個針對較新設備的MSVC CUDA項目

我想編譯一個使用動態並行性的CUDA源代碼,這是計算能力3.5中引入的一項功能。

我知道我將無法在我的GPU上運行該程序,但是,應該可以在我的機器上編譯此代碼。我假設這是因爲我可以毫無問題地編譯使用3.5功能的CUDA示例。這些示例帶有「手動生成」的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

不知道從哪裏走了。感謝任何幫助。

我使用的是Windows 7的

+0

忘了說:我使用的CMake 2.8.12.2。 –

+0

可能與FindCUDA.cmake上的這個錯誤有關:http://public.kitware.com/Bug/view.php?id=15016 –

回答

1

原來CUDA SDK 6.0是在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的bug跟蹤系統的一個問題: http://public.kitware.com/Bug/view.php?id=15016 (錯誤是更好的描述存在)

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