2

私の現在のプロジェクトでは、への呼び出し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
4

1 に答える 1

2

クラスKernelにポインタが含まれています。クラスをデバイスにコピーすると、デバイス上にホスト ポインターが作成されます。デバイスでそれを逆参照すると、この無効なアドレス アクセス違反が発生します。

これは、混乱の通常の原因のようです。ロバート・クロヴェラが昨日説明したばかりです。

于 2013-04-16T21:01:10.487 に答える