Na programação paralela com aceleradores, como em CUDA, é preciso considerar os espaços de endereçamento acessíveis pelo código executando em CPU e pelo código executado em GPU.
// código 1:
int N = 1<<20;
float *x, *y, *d_x, *d_y;
x = (float*)malloc(N*sizeof(float));
y = (float*)malloc(N*sizeof(float));
cudaMalloc(&d_x, N*sizeof(float));
cudaMalloc(&d_y, N*sizeof(float));
// inicia elementos dos vetores x e y
cudaMemcpy(d_x, x, N*sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(d_y, y, N*sizeof(float), cudaMemcpyHostToDevice);
// invoca kernel para manipulação de x e y
kern <<< ..., ... >>> (N, d_x, d_y);
cudaMemcpy(y, d_y, N*sizeof(float), cudaMemcpyDeviceToHost);
// código 2:
int N = 1<<20;
float *x, *y;
cudaMallocManaged(&x, N*sizeof(float));
cudaMallocManaged(&y, N*sizeof(float));
// inicia elementos dos vetores x e y
...
// invoca kernel para manipulação de x e y
kern <<< ..., ... >>> (N, x, y);
cudaDeviceSynchronize();
Observe os 2 trechos de código apresentados anteriormente e indique a alternativa INCORRETA (próxima página):