1

我最近在将设备中动态分配的数据复制到主机内存时遇到了一个问题。数据是用 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 - 将设备数据复制到主机?

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

4

1 回答 1

1

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

您可以在此处从 Nvidia 的 Mark Harris 那里看到对此限制的确认。


由于这个答案是在 2012 年发布的,因此对主机 API 互操作性的限制似乎是一成不变的,并且在 CUDA 编程指南中明确记录。

于 2012-06-26T04:14:03.153 回答