Скопировать в глобальную память, выделенную функцией 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() выделить память устройства в функциях на стороне хоста?

Ответы на вопрос(1)

Ваш ответ на вопрос