"未知错误"如果CUBLAS存在于内核中,则在第一个cudaMalloc上

时间:2016-09-19 08:15:35

标签: cuda cublas dynamic-parallelism

我有以下最小+个文件

.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()

1 个答案:

答案 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)