В настоящее время я просматриваю примеры учебников на 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
на процессоре?