2010-08-12 34 views
1

我正在調用cudaMemcpy,並且複製成功返回,但是源值未被複制到目標。我用memcpy()寫了一個類似的作品,並且工作正常。我在這裏錯過了什麼?cudaMemcpy無法複製值

// 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"); 

的CUDAErrors沒有報告任何問題,但第二次失敗叫..?

+1

擺脫「__device__」 – Anycorn 2010-08-12 02:07:00

回答

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

您正在比較不同存儲器域中的值。 你應該存儲第一複製從設備到CPU,然後比較

+0

刪除__device__,重建,然後在CUDA-gdb下運行,步進通的cudaMemcpy()例程,調試器仍顯示不同的值。在process.cu:88 cudaMemcpy(landmask_d,landmask,landMemSize, cudaMemcpyHostToDevice) 預處理(); (cuda-gdb) (cuda-gdb)s checkCUDAError(「memory copy」); (CUDA-GDB)P * landmask_d $ 4 = 0 '\ 0' (CUDA-GDB)p landmask [0] $ 5 = 1 '\ 001' – timbo 2010-08-12 02:47:04

+0

是,似乎訪問設備存儲器的唯一方式來自內核。我通過簡單地做一個cpy驗證了我的cudaMemcpy,改變了源代碼(在主機內存中),然後做了一個拷貝,並驗證源已經恢復到它的原始值。 不幸的是,這在cuda-gdb中也是適用的,並且由於線程只能在每個warp的基礎上進行訪問,因此查看單個寄存器值有時會很具挑戰性。 – timbo 2010-08-13 02:24:32

+0

@timbo我感到你的痛苦。 Cuda非常難以調試 – Anycorn 2010-08-13 03:03:56