2011-10-04 47 views
0

我在windows 7 x64上使用vs2010,爲我的大學項目使用CUDA工具包v4.0。我想實現一個簡單的gpu-vs-cpu測試,其中大部分都已完成,但我的cuda測試都沒有返回任何結果。我用調試器檢查了內存,設備內存包含了我需要的所有內容,只有內存複製失敗。將數據從設備複製到主機不起作用

host_vector<int> addWithCuda(host_vector<int> h_a, host_vector<int> h_b) 
{ 
int size = h_a.size(); 
host_vector<int> h_c(size); 

// Choose which GPU to run on, change this on a multi-GPU system. 
cudaError_t cudaStatus = cudaSetDevice(0); 
if (cudaStatus != cudaSuccess) { 
    fprintf(stderr, "cudaSetDevice failed! Do you have a CUDA-capable GPU installed?"); 
    return h_c; 
} 
else{ 
    // Allocate GPU buffers for three vectors (two input, one output). 
    // Copy input vectors from host memory to GPU buffers. 
    device_vector<int> d_c=h_c; 
    device_vector<int> d_a=h_a; 
    device_vector<int> d_b=h_b; 

    int*d_a_ptr = raw_pointer_cast(&d_a[0]); 
    int*d_b_ptr = raw_pointer_cast(&d_b[0]); 
    int*d_c_ptr = raw_pointer_cast(&d_c[0]); 
    int*h_c_ptr = raw_pointer_cast(&h_c[0]); 

    // Launch a kernel on the GPU with one thread for each element. 
    addKernel<<<1, size>>>(d_c_ptr, d_a_ptr, d_b_ptr); 

    // cudaDeviceSynchronize waits for the kernel to finish, and returns 
    // any errors encountered during the launch. 
    cudaStatus = cudaDeviceSynchronize(); 
    if (cudaStatus != cudaSuccess) { 
     fprintf(stderr, "cudaDeviceSynchronize returned error code %d after launching addKernel!\n", cudaStatus); 
     return h_c; 
    } 
    thrust::device_vector<int>::iterator d_it; 
    thrust::host_vector<int>::iterator h_it; 
    // Copy output vector from GPU buffer to host memory. 
    h_c=d_c; 
    printf("||Debug h_c[0]=%d\td_c[0]=%d\n",h_c[0],d_c[0]); 
} 
cudaStatus = cudaDeviceReset(); 
if (cudaStatus != cudaSuccess) { 
    fprintf(stderr, "cudaDeviceReset failed!"); 
} 
return h_c; 
} 

注意代碼行「h_c = d_c;」。在推力這應該是從d_c(一個設備向量)複製數據到h_c(一個主機向量)。這條線不會失敗,但也不會正確執行。 h_c始終保持全零。我試過其他幾種方法,比如「thrust :: copy(d_c.begin(),d_c.end(),h_c.begin());」或「cudaMemcpy(h_c_ptr,d_c_ptr,size * sizeof(int),cudaMemcpyDeviceToHost);」甚至「for(int i = 0; i < size; ++ i)h_c [i] = d_c [i];」。沒有工作。我在這裏失去了:(

人有類似的東西嗎?都有助於apreciated。

+0

你確信''''addKernel'''能正常工作嗎? –

+0

是的,就像我說的,我檢查了我的d_c向量的內容,它有正確的值。問題是d_c的內容拷貝到h_c中 –

+0

如果你省略'''cudaDeviceSynchronize''會發生什麼?在這個例子中它實際上並不是必須的,而且'''size''的值是什麼? –

回答

1

你只創建「h_c」,但還沒有初始化「h_c」。我認爲這就是問題所在。沒有記憶複製問題

+0

據我所知推力自動初始化其變量,我從來沒有初始化他們到現在,他們工作... –

相關問題