我有以下最小+
个文件
.cu
如您所见,#include <cuda_runtime_api.h>
#include <cublas_v2.h>
#include <cstdio>
__global__ void test()
{
cublasHandle_t handle = nullptr;
cublasCreate(&handle);
}
int main(int, char**)
{
void * data = nullptr;
auto err = cudaMalloc(&data, 256);
printf("%s\n", cudaGetErrorString(err));
return 0;
}
内核甚至未被调用,但test
返回cudaMalloc
(未知错误)。该文件正在使用可分离的编译(动态并行性所需)和计算能力5.2进行编译(也试过3.5和5.0,它没有改变任何东西)。删除对30
的调用会导致cublasCreate
返回cudaMalloc
(无错误)。
可能是什么原因?我该如何解决?我需要使用动态并行which is theoretically supported从内核调用CUBLAS,所以&#34;只需删除调用&#34;不是一种选择。
以下是相应的0
:
CMakeLists.txt
这是一组理论上相似的编译命令(结果至少相同):
cmake_minimum_required(VERSION 3.3 FATAL_ERROR)
project(CublasError)
find_package(CUDA REQUIRED)
set(CUDA_SEPARABLE_COMPILATION ON)
set(CUDA_NVCC_FLAGS --gpu-architecture=compute_52 -Xptxas=-v)
list(APPEND CUDA_NVCC_FLAGS_DEBUG -G -keep -O0)
cuda_add_executable(${PROJECT_NAME} main.cu)
cuda_add_cublas_to_target(${PROJECT_NAME})
# FindCUDA.cmake does not automatically add (or find) cudadevrt which is required when separable compilation is on
if(CUDA_SEPARABLE_COMPILATION)
get_filename_component(CUDA_LIB_PATH ${CUDA_CUDART_LIBRARY} DIRECTORY)
find_library(CUDA_cudadevrt_LIBRARY cudadevrt PATHS ${CUDA_LIB_PATH})
target_link_libraries(${PROJECT_NAME} ${CUDA_cudadevrt_LIBRARY})
endif()
答案 0 :(得分:1)
事实证明nvcc -dlink
没有报告缺少的依赖关系,只是愉快地继续而不会发出任何错误。该问题的解决方案是在主机链接和设备链接期间必须链接cublas_device.lib
,即编译命令应如下所示:
nvcc -dc --gpu-architecture=compute_52 -m64 main.cu -o main.dc.obj
nvcc -dlink --gpu-architecture=compute_52 -m64 -lcublas_device main.dc.obj -o main.obj
link /SUBSYSTEM:CONSOLE /LIBPATH:"%CUDA_PATH%\lib\x64" main.obj main.dc.obj cudart_static.lib cudadevrt.lib cublas.lib cublas_device.lib
此外,nvcc -dlink
依赖于顺序,但与ld
使用的方式相反:-lcublas_device
必须在之前出现目标文件要求它。
在CMake方面,cuda_add_cublas_to_target
无法将cublas_device.lib
添加到device link命令,只将其添加到主机链接命令。解决方法是,将依赖项显式添加到nvcc标志列表中:
list(APPEND CUDA_NVCC_FLAGS -lcublas_device)