1. ホーム
  2. c

[解決済み】cudamalloc()の使用。) なぜダブルポインタなのか?

2022-01-29 10:30:14

質問

のチュートリアルの例を見ているところです。 http://code.google.com/p/stanford-cs193g-sp2010/ CUDAを学ぶために このコードでは __global__ 関数を以下に示します。CPU と GPU の 2 つの配列を作成し、GPU の配列に数字の 7 を代入し、GPU の配列のデータを CPU の配列にコピーするだけです。

#include <stdlib.h>
#include <stdio.h>

__global__ void kernel(int *array)
{
  int index = blockIdx.x * blockDim.x + threadIdx.x;

  array[index] = 7;
}

int main(void)
{
  int num_elements = 256;

  int num_bytes = num_elements * sizeof(int);

  // pointers to host & device arrays
  int *device_array = 0;
  int *host_array = 0;

  // malloc a host array
  host_array = (int*)malloc(num_bytes);

  // cudaMalloc a device array
  cudaMalloc((void**)&device_array, num_bytes);

  int block_size = 128;
  int grid_size = num_elements / block_size;

  kernel<<<grid_size,block_size>>>(device_array);

  // download and inspect the result on the host:
  cudaMemcpy(host_array, device_array, num_bytes, cudaMemcpyDeviceToHost);

  // print out the result element by element
  for(int i=0; i < num_elements; ++i)
  {
    printf("%d ", host_array[i]);
  }

  // deallocate memory
  free(host_array);
  cudaFree(device_array);
} 

私の疑問は、なぜ cudaMalloc((void**)&device_array, num_bytes); ステートメントにダブルポインタを使用していますか?偶数 こちら の定義によると、最初の引数はダブルポインタです。

のように、GPU上に割り当てられたメモリの先頭へのポインタを返すだけではダメなのでしょうか? malloc 関数がCPU上で行っているのでしょうか?

解決方法は?

すべてのCUDA API関数は、エラーコード(またはエラーが発生しなかった場合はcudaSuccess)を返します。他のすべてのパラメータは参照渡しです。しかし、プレーンCでは参照を持つことができません。そのため、戻り情報を格納する変数のアドレスを渡す必要があります。ポインターを返すので、ダブルポインターを渡す必要があります。

また、同じ理由でアドレスを操作する有名な関数として scanf という関数があります。何度、この書き忘れをしたことか & を、値を格納したい変数の前に置くことです;)

int i;
scanf("%d",&i);