私の現在のプロジェクトでは、への呼び出しcudaGetLastError()
が戻っunknown error
てきて、その理由がわかりません。コードは問題なくコンパイルされますが、希望どおりに動作していません。
以下は、関連するコードが何で構成されているかの簡単な、コンパイルできない例です。
CU_Main.cu
以下は CUDA カーネルです。
//My CUDA kernel
__global__ void CU_KernelTest(Kernel* matrix){
int idx = blockIdx.x * blockDim.x + threadIdx.x;
int idy = blockIdx.y * blockDim.y + threadIdx.y;
if(idx == 0 && idy == 0){
printf("ID is: %d\n", idx);
matrix->set(1,1, 16.0f);
}
}
ホストコードは次のとおりです。
//A host function which is called when a button is clicked
int HOST_OnbuttonClick(){
Kernel* matrix = new Kernel(3,3,2);
Kernel* device_matrix;
cudaMalloc(&device_matrix, sizeof(Kernel));
cudaMemcpy(device_matrix, matrix, sizeof(Kernel), cudaMemcpyHostToDevice);
CU_KernelTest<<<256, 256>>>(device_matrix);
cudaDeviceSynchronize();
cudaError_t err = cudaGetLastError();
if (err != cudaSuccess) {
printf("Error: %s\n", cudaGetErrorString(err));
}
cudaFree(device_matrix);
return 0.0f;
}
matrix->set(1,1, 16.0f);
が cuda カーネルに含まれている場合は(err != cudaSuccess)
true を返し、出力しますがUNKNOWN ERROR
、コメントset
アウトするとエラーは発生しません。
これに関連するもう 1 つのstruct
ものは、私が目指している畳み込みカーネル設計のための私自身のヘルパーですKernel
。
カーネル.cuh
struct Kernel {
private :
float* kernel;
int rows;
int columns;
public :
__device__ __host__
Kernel(int _rows, int _columns, float _default) {
rows = _rows;
columns = _columns;
kernel = new float[rows * columns];
for(int r = 0; r < rows; r++){
for(int c = 0; c < columns; c++){
kernel[r * rows + c] = _default;
}
}
}
__device__ __host__
void set(int row, int col, float value){
kernel[row * rows + col] = value;
}
}
この設計の目標は、ホスト上のカーネルのすべての値を設定し、それを CUDA カーネルに送信し、そこで値を設定してから、ホストで更新されたオブジェクトを取得できるようにすることです。
では、実際には 2 つの問題があります。なぜunknown error
メッセージが表示されるのでしょうか。また、コードは構文的に正しく機能するのでしょうか。さらに情報が必要な場合はお知らせください。
メモリ チェッカーの結果は次のとおりです。
Nsight Debug
================================================================================
CUDA Memory Checker detected 1 threads caused an access violation:
Launch Parameters
CUcontext = 071c7340
CUstream = 08f3e3b8
CUmodule = 08fa97a8
CUfunction = 08fdbbe8
FunctionName = _Z13CU_KernelTestP6Kernel
gridDim = {1,1,1}
blockDim = {256,1,1}
sharedSize = 128
Parameters:
matrix = 0x06b60000 {kernel = 0x07a31718 ???, rows = 3, columns = 3}
Parameters (raw):
0x06b60000
GPU State:
Address Size Type Mem Block Thread blockIdx threadIdx PC Source
-----------------------------------------------------------------------------------------------
07a31728 4 adr st g 0 0 {0,0,0} {0,0,0} 000260 c:\users
Summary of access violations:
c:\users....kernel.cuh(26): error MemoryChecker: #misaligned=0 #invalidAddress=2