2014-09-26 50 views
-1

我設置了CUDA 6.5,我只是想運行一個非常基本的代碼。在將設備陣列從設備傳輸到CUDA中的主機之後無法訪問陣列元素

我想要做的是將數組從主機複製到設備,然後將其從設備複製回主機。

int *d_mandelbrot_set; 
int a[5] = {1,2,3,4,5}; 
cudaError_t cudaStatus; 


// Allocate GPU buffers for three vectors (two input, one output) . 
cudaStatus = cudaMalloc((void**)&d_mandelbrot_set, 5 * sizeof(int)); 

if (cudaStatus == cudaSuccess) cout << "Success\n"; 
cudaStatus = cudaMemcpy(d_mandelbrot_set, a, 5 * sizeof(int), cudaMemcpyHostToDevice); 
if (cudaStatus == cudaSuccess) cout << "Success\n"; 

int *h_mandelbrot_set; 
cudaStatus = cudaMemcpy(h_mandelbrot_set, d_mandelbrot_set, 5*sizeof(int), cudaMemcpyDeviceToHost); 
if (cudaStatus == cudaSuccess) cout << "Success\n"; 

for (int k = 0; k < 5; k++) 
    cout << h_mandelbrot_set[k] << " ";  // THIS IS WHAT GIVES THE RUN TIME ERROR 

但是,當我嘗試訪問元素h_mandelbrot_set陣列,它提供了一個運行時錯誤。

+1

您尚未分配'h_mandelbrot_set'。 – Jez 2014-09-26 18:13:54

回答

2

那麼,你只定義了一個指針(int *h_mandelbrot_set;)。在調用最後一個cudaMemcpy之前,您需要爲此指針分配內存。以下代碼將起作用。但是,通常,您可能想要動態分配內存。

int *d_mandelbrot_set; 
int a[5] = {1,2,3,4,5}; 
cudaError_t cudaStatus; 


// Allocate GPU buffers for three vectors (two input, one output) . 
cudaStatus = cudaMalloc((void**)&d_mandelbrot_set, 5 * sizeof(int)); 

if (cudaStatus == cudaSuccess) cout << "Success\n"; 
cudaStatus = cudaMemcpy(d_mandelbrot_set, a, 5 * sizeof(int), cudaMemcpyHostToDevice); 
if (cudaStatus == cudaSuccess) cout << "Success\n"; 

int h_mandelbrot_set[5]; 
cudaStatus = cudaMemcpy(&h_mandelbrot_set, d_mandelbrot_set, 5*sizeof(int), cudaMemcpyDeviceToHost); 
if (cudaStatus == cudaSuccess) cout << "Success\n"; 

for (int k = 0; k < 5; k++) 
    cout << h_mandelbrot_set[k] << " ";  // THIS IS WHAT GIVES THE RUN TIME ERROR