Использование cudamalloc(). Почему двойной указатель?

В настоящее время я просматриваю примеры учебников на http://code.google.com/p/stanford-cs193g-sp2010/, чтобы изучить CUDA. Код, демонстрируя функции __global__, приведен ниже. Он просто создает два массива, один на CPU и один на GPU, заполняет массив GPU с числом 7 и копирует данные массива GPU в массив CPU.

#include 
#include 

__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<<>>(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); утверждение с двойным указателем? Даже здесь определение cudamalloc() говорит, что первый аргумент является двойным указателем.

Почему бы просто не вернуть указатель на начало выделенной памяти на GPU, точно так же, как функция malloc на процессоре?

41
задан smilingbuddha 3 November 2011 в 00:37
поделиться