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のMarkHarrisからここで確認できます。


この回答が2012年に投稿されて以来、ホストAPIの相互運用性に関する制限は固く決まっているようであり、CUDAプログラミングガイドに明示的に文書化されています。

于 2012-06-26T04:14:03.153 に答える