В настоящее время я изучаю примеры учебников на http://code.google.com/p/stanford-cs193g-sp2010/, чтобы узнать CUDA. Код, который демонстрирует функции __global__
, приведен ниже. Он просто создает два массива: один на процессоре и один на графическом процессоре, заполняет массив 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);
с помощью двойного указателя? Даже здесь определение cudamalloc() on говорит, что первым аргументом является двойной указатель.
Почему бы просто не вернуть указатель на начало выделенной памяти на GPU, как функция malloc
на CPU?