Skopiować do pamięci globalnej przydzielonej przez malloc ()?

Przewodnik programowania CUDA stwierdza, że ​​„Pamięć przydzielona przezmalloc() można skopiować za pomocą środowiska wykonawczego (np. wywołując dowolne funkcje pamięci kopii z pamięci urządzenia) ”, ale jakoś mam problem z odtworzeniem tej funkcji. Kod:

#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;
}

zawiesza się na wyjściu:

p = 0x601f920  (seen by GPU)
p = 0x601f920  (seen by CPU)
 err:11 invalid argument

Rozumiem, że host widzi odpowiedni adres na urządzeniu, ale jakoś nie podoba mu się tomalloc().

Jeśli przydzielę wcześniej przezcudaMalloc((void**)&np, 40); a następnie przekaż wskaźniknp jako argument do jądraallocate_p, gdzie będzie przypisanyp (zamiastmalloc()), wtedy kod działa dobrze.

Co robię źle / jak używamymalloc() przydzielona pamięć urządzenia w funkcjach po stronie hosta?

questionAnswers(1)

yourAnswerToTheQuestion