に存在している場合、私は、次の最小限の.cu
ファイル「不明なエラー」CUBLASはカーネル
#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を呼び出す必要があります。which is theoretically supported "コールを削除するだけです"というオプションはありません。ここ
は、対応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
を私が間違っていない限り、あなたが実行可能ファイルに掲載しており、そのソースをコンパイルして実行することは不可能であろう。問題を再現するためにそのソースをコンパイルして実行する方法を説明するために質問を編集できますか? – talonmies
なぜそれは不可能でしょうか? 'nvcc'を使ってうまくコンパイルします – Joe
正確なコンパイルコマンドとコンパイラのバージョンを編集してください。 AFAIK独立したコンパイルの軌道は 'main'と別にコンパイルされたカーネルコードを同じファイルに持つことができません – talonmies