3

CUDA デバイス メモリ ポインタに関するヘルプをいただければ幸いです。基本的に、CUDA カーネル コードを複数のファイルに分割して読みやすくしたいと考えています。これは大きなプログラムであるためです。したがって、私がやりたいことは、同時にではなく、複数の CUDA カーネルに同じデバイス メモリ ポインターを渡すことができるようにすることです。以下は私が必要とするものの大まかな例です

//random.h
class random{
public:
    int* dev_pointer_numbers;
};

そのため、オブジェクトはデバイス メモリへのポインタを格納するだけで済みます

//random_kernel.cu
__global__ void doSomething(int *values){
//do some processing}

extern "C" init_memory(int *devPtr,int *host_memory,int arraysize)
{
    cudaMalloc(&devPtr,arraysize*sizeof(int));
    cudaMemcpy(devPtr,host_memory,arraysize*sizeof(int),cudaMemcpyHostToDevice);
}

extern "C" runKernel(int *devPtr){
    doSomething<<<1,1>>>(devPtr);
}

そしてメインファイル:

//main.cpp
//ignoring all the details etc
random rnd;
void CUDA(int *hostArray)
{
    init_memory(rnd.dev_pointer_numbers,hostArray,10);
    runKernel(rnd.dev_pointer_numbers);
}

オブジェクトポインターを使用してカーネルコードを実行すると、デバイスメモリにマップされないため、カーネルコードが失敗することを理解しています。私が知りたいのは、他の cuda カーネル ファイル間で再利用できるように、メイン ファイルのデバイス メモリ内の特定のブロックへのポインタを格納する方法です。

4

1 に答える 1

7

あなたはあなたのポインターを失っています!

init_memory関数を確認してください。

init_memory(int *devPtr,int *host_memory,int arraysize)
{
  cudaMalloc(&devPtr,arraysize*sizeof(int));
  cudaMemcpy(devPtr,host_memory,arraysize*sizeof(int),cudaMemcpyHostToDevice);
}

したがって、ポインタを渡すと、その時点でdevPtrという名前のローカルコピーが作成されます。次に、ポインタのローカルコピーのアドレスを使用してcudaMalloc()を呼び出します。関数がローカルコピー(スタック上)を返すと破棄されるため、ポインターを失いました。

代わりにこれを試してください:

init_memory(int **devPtr,int *host_memory,int arraysize)
{
  cudaMalloc(devPtr,arraysize*sizeof(int));
  cudaMemcpy(*devPtr,host_memory,arraysize*sizeof(int),cudaMemcpyHostToDevice);
}

...

init_memory(&rnd.dev_pointer_numbers,hostArray,10);

補足として、extern "C"これをC ++(main.cpp)から呼び出しているため、を削除することを検討してください。意味がなく、コードが乱雑になるだけです。

于 2012-09-11T12:39:45.587 に答える