Скопировать в глобальную память, выделенную функцией malloc ()?
Руководство по программированию CUDA утверждает, что "Память выделяется черезmalloc()
может быть скопировано с использованием среды выполнения (т. е. путем вызова любой из функций памяти копирования из памяти устройства) "но как-то яЯ не могу воспроизвести эту функцию. Код:
#include
__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();
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;
}
вылетает с выводом:
p = 0x601f920 (seen by GPU)
p = 0x601f920 (seen by CPU)
err:11 invalid argument
Я понимаю, что хост видит соответствующий адрес на устройстве, но почему-то не нравится, когда он приходит.malloc()
Если я выделю ранееcudaMalloc((void**)&np, 40);
а затем передать указательnp
в качестве аргумента для ядраallocate_p
где это будет назначеноp
(вместоmalloc()
), тогда код работает нормально.
Что я делаю не так / как мы используемmalloc()
выделить память устройства в функциях на стороне хоста?