2010-08-12 16 views
1

J'appelle cudaMemcpy et la copie retourne avec succès, mais les valeurs source ne sont pas copiées vers la destination. J'ai écrit une pièce similaire en utilisant memcpy() et ça marche bien. Qu'est-ce que j'oublie ici?cudaMemcpy ne parvient pas à copier les valeurs

// host externs 
extern unsigned char landmask[DIMX * DIMY]; 

// use device constant memory for landmask 
unsigned char *tempmask; 
__device__ unsigned char *landmask_d; 

..

void checkCUDAError(const char* msg) { 
cudaError_t err = cudaGetLastError(); 
    if (cudaSuccess != err) { 
    fprintf(stderr, "Cuda error: %s: %s.\n", msg, cudaGetErrorString(err)); 
    exit(EXIT_FAILURE); 
    } 
} 

.. 

// try a memcpy 
size_t landMemSize_t landMemSize = DIMX * DIMY * sizeof(char); 
tempmask = (unsigned char*)malloc(landMemSize); 
memcpy(tempmask, landmask, DIMX * DIMY); 
if (landmask[0] != *tempmask) printf("FAILURE!\n"); 

// allocate device memory for landmask 
cudaMalloc((void **)&landmask_d, landMemSize); 
printf("allocating %ld Kbytes for landmask\n", landMemSize/1024); 
checkCUDAError("memory allocation"); 

// copy landmask from host to device 
cudaMemcpy(landmask_d, landmask, landMemSize, cudaMemcpyHostToDevice); 
checkCUDAError("memory copy"); 
if (landmask[0] != *landmask_d) printf("FAILURE!\n"); 

Aucun des CUDAErrors signaler tout problème mais le deuxième échec est appelé ..?

+1

se débarrasser de « __device__ » – Anycorn

Répondre

3
if (landmask[0] != *landmask_d) printf("FAILURE!\n"); 

Vous comparez des valeurs dans différents domaines de mémoire. Vous devez d'abord copier la mémoire de l'appareil à cpu puis comparer

+0

Retrait __device__, la reconstruction, puis en cours d'exécution dans cuda-gdb, pas à pas à travers la routine cudaMemcpy(), le débogueur affiche toujours des valeurs différentes. prétraiter() à process.cu:88 cudaMemcpy (landmask_d, landmask, landMemSize, cudaMemcpyHostToDevice); (cuda-gdb) s checkCUDAError ("copie de mémoire"); (cuda-gdb) p * landmask_d $ 4 = 0 '\ 0' (cuda-gdb) p landmask [0] 5 $ = 1 '\ 001' – timbo

+0

Oui, il semble que la seule façon d'accéder à la mémoire de l'appareil est à l'intérieur d'un noyau. J'ai validé mon cudaMemcpy en faisant simplement un cpy, en modifiant la source (dans la mémoire de l'hôte), puis en effectuant une copie et en vérifiant que la source a été restaurée à sa valeur d'origine. Malheureusement, cela est également vrai dans cuda-gdb et comme les threads ne sont accessibles que par chaîne, il peut parfois être difficile de regarder les valeurs individuelles des registres. – timbo

+0

@timbo Je ressens votre douleur. Cuda est exceptionnellement difficile à déboguer – Anycorn