2012-02-05 69 views
1

我有設備變量,並在此變量中分配和填充設備中的數組,但我有問題獲取數據主機。 cudaMemcpy()返回cudaErrorInvalidValue錯誤。我該怎麼做?我知道,在這種情況下,我可以使用cudaMalloc,因爲我知道數組的大小,但是在我的REAL代碼中,它計算設備中數組的大小,並且它需要立即分配記憶。CUDA - 將設備數據複製到主機?

PS2:我發現了類似的問題,但我仍然不知道,我該如何解決它? - copy data which is allocated in device from device to host

PS3:我已經更新代碼,但還是犯規作品:{

PS4:我只是想經營上具有Nvidia GT 520MX(最新的遊戲驅動器)和不工作的代碼太:(

THX

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

#define N 400 
__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: %lld\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; 
} 

回答

1

你需要啓動的內核分配內存後同步(cudaDeviceSynchronize())。

您還可以檢查同步和所有其他CUDA API調用的返回值嗎?

+0

還是一樣的錯誤:cudaErrorInvalidValue – Milan 2012-02-05 23:05:20

+0

別人很清楚(成功) – Milan 2012-02-05 23:51:19

1

我測試了你的代碼,這裏沒有錯誤。我正在運行CUDA 4.0。

+0

什麼?我有CUDA 4.1,開發者驅動程序,Win7 x64,VS 2008和我有GTS450。其他人可以測試代碼嗎? – Milan 2012-02-06 10:24:09

+0

您是否添加了一些額外的編譯器參數?我只是將GPU架構設置爲「sm_21」和x64目標機器平臺。而我仍然遇到同樣的錯誤。這很奇怪! – Milan 2012-02-06 11:21:47

+0

我使用Win7 x64,VS 2010.在GTX580上運行。 GPU架構到sm_20和x64目標機器。當我運行它打印正確的值:h_array:123,0. – brano 2012-02-06 11:49:20

相關問題