Copiar para memória global alocada por malloc ()?
O guia de programação CUDA afirma que "Memória alocada viamalloc()
pode ser copiado usando o tempo de execução (ou seja, chamando qualquer uma das funções de memória de cópia da memória do dispositivo) ", mas de alguma forma estou tendo problemas para reproduzir essa funcionalidade.
#include <cstdio>
__device__ int* p;
__global__ void allocate_p() {
p = (int*) malloc(10);
printf("p = %p (seen by GPU)\n", p);
}
int main() {
cudaError_t err;
int* localp = (int*) malloc(10);
allocate_p<<<1,1>>>();
cudaDeviceSynchronize();
//Getting pointer to device-allocated memory
int* tmpp = NULL;
cudaMemcpyFromSymbol(&tmpp, p, 4);
printf("p = %p (seen by CPU)\n", tmpp);
//cudaMalloc((void**)&tmpp, 40);
err = cudaMemcpy(tmpp, localp, 40, cudaMemcpyHostToDevice);
cudaDeviceSynchronize();
printf(" err:%i %s", (int)err, cudaGetErrorString(err));
delete localp;
return 0;
}
falha com a saída:
p = 0x601f920 (seen by GPU)
p = 0x601f920 (seen by CPU)
err:11 invalid argument
Eu entendo, que o host vê o endereço apropriado no dispositivo, mas de alguma forma não gosta que vem demalloc()
.
Se eu alocar antes porcudaMalloc((void**)&np, 40);
e depois passar o ponteironp
como argumento para o kernelallocate_p
, onde será atribuídop
(ao invés demalloc()
), então o código corre bem.
O que estou fazendo errado / como usamosmalloc()
alocado memória de dispositivo em funções do lado do host?