我有以下最小.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
返回30
(未知错误)。该文件正在使用可分离编译(动态并行性所需)和计算能力 5.2(也尝试过 3.5 和 5.0,它们没有改变任何东西)进行编译。删除对返回cublasCreate
原因的调用(无错误)。cudaMalloc
0
可能是什么原因?我该如何解决?我需要使用理论上支持的动态并行性从内核调用 CUBLAS ,因此“只需删除调用”不是一个选项。
这是对应的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()
下面是一组理论上类似的编译命令(结果至少是一样的):
nvcc -dc --gpu-architecture=compute_52 -m64 main.cu -o main.dc.obj
nvcc -dlink --gpu-architecture=compute_52 -m64 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