Copiar a la memoria global asignada por malloc ()?
La guía de programación CUDA dice que "Memoria asignada víamalloc()
se puede copiar utilizando el tiempo de ejecución (es decir, llamando a cualquiera de las funciones de memoria de copia desde la memoria del dispositivo) ", pero de alguna manera estoy teniendo problemas para reproducir esta funcionalidad. Código:
#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;
}
se bloquea con la salida:
p = 0x601f920 (seen by GPU)
p = 0x601f920 (seen by CPU)
err:11 invalid argument
Supongo que el host ve la dirección apropiada en el dispositivo, pero de alguna manera no le gusta que vengamalloc()
.
Si asigno anteriormente porcudaMalloc((void**)&np, 40);
y luego pasar el punteronp
como argumento a kernelallocate_p
, donde será asignado ap
(en lugar demalloc()
), entonces el código corre bien.
¿Qué estoy haciendo mal / cómo lo uso?malloc()
memoria de dispositivo asignada en las funciones del lado del host?