将设备中动态分配的数据复制到主机时出错?

时间:2012-06-26 02:18:16

标签: cuda malloc gpu

我最近在将设备中的动态分配数据复制到主机内存时遇到了问题。数据使用malloc分配,我将这些数据从设备复制到主机功能中的主机。这是代码:

#include <cuda.h> 
#include <stdio.h> 

#define N 100 
__device__ int* d_array; 
__global__ void allocDeviceMemory() 
{ 
d_array = new int[N]; 
for(int i=0; i < N; i++) 
d_array[i] = 123; 
} 
int main() 
{ 
allocDeviceMemory<<<1, 1>>>(); 
cudaDeviceSynchronize(); 
int* d_a = NULL; 
cudaMemcpyFromSymbol((void**)&d_a, "d_array", sizeof(d_a), 0, cudaMemcpyDeviceToHost); 
printf("gpu adress: %p\n", d_a); 

int* h_array = (int*)malloc(N*sizeof(int)); 
cudaError_t errr = cudaMemcpy(h_array, d_a, N*sizeof(int), cudaMemcpyDeviceToHost); 
printf("h_array: %d, %d\n", h_array[0], errr); 

getchar(); 
return 0; 
} 

已经有一张海报对CUDA 4.1有同样的问题,一些专家建议将CUDA驱动程序和运行时升级到更新的版本可以解决这个问题。 CUDA - Copy device data to host?

我有CUDA工具包4.2和最新的开发人员驱动程序和C2075,但它仍然提出了上述问题。请让我知道如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

不幸的是没有办法做你想做的事情CUDA 4.主机API无法从设备运行时堆上的动态分配地址进行复制,只有设备代码可以访问它们。如果要使用主机API进行复制,则需要先将数据写入使用主机API分配的“输出”缓冲区,然后您可以使用cudaMemcpy从主机中检索它。

你可以从Nvidia的Mark Harris here

看到这个限制的确认