我的电脑有GTX 580(计算能力2.0)。
我想编译一个使用动态并行的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上使用CUDA SDK 6.0。
答案 0 :(得分: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
答案 1 :(得分:1)
原来是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 (那里的bug更好描述)