2010-08-12 188 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