2011-11-11 30 views
2

我attemping實現在CUDA的2D陣列如下:cudaMalloc失敗用於2D陣列,錯誤代碼11

u_int32_t **device_fb = 0; 
u_int32_t **host_fb = 0; 

cudaMalloc((void **)&device_fb, (block_size*grid_size)*sizeof(u_int32_t*)); 

for(int i=0; i<(block_size*grid_size); i++) 
{ 
    cudaMalloc((void **)&host_fb[i], numOpsPerCore*sizeof(u_int32_t)); 
} 
cudaMemcpy(device_fb, host_fb, (block_size*grid_size)*sizeof(u_int32_t*), cudaMemcpyHostToDevice); 

在測試,host_fb是NULL。另外,當我抓取cudaMalloc((void **)&host_fb[i], numOpsPerCore*sizeof(u_int32_t));第一次迭代的錯誤代碼時,我得到了cudaErrorInvalidValue。我究竟做錯了什麼?謝謝!

回答

2

那麼,你的代碼有幾個問題。看看下面的代碼中的評論。

在數組的大小中,應該使用sizeof(u_int32_t)而不是指針類型。 很難找到錯誤,因爲這兩種類型的大小在某些平臺上可能意外相同,但在其他平臺上卻不一樣。

size_t arr_size = (block_size*grid_size) * sizeof(u_int32_t); 

// host array wasn't allocated at all. 
host_fb = malloc(arr_size); 
cudaMalloc((void **)&device_fb, arr_size); 

// the loop is unnecessary, you have now an allocated 2D table  

cudaMemcpy(device_fb, host_fb, (block_size*grid_size)*sizeof(u_int32_t*), cudaMemcpyHostToDevice); 

我以前malloc功能,因爲cudaMallocHostcudaHostAlloc都分配給設備,這是不是可能是你想要的這裏訪問的頁面鎖定主機內存。如果存在性能問題,則可以使用它們,因爲它們都強制分配的內存被分頁。有關詳細信息,請參閱相應的文檔。

+0

我試過你的代碼,但我認爲我仍然需要'host_fb'上的循環,否則當以後嘗試訪問'host_fb [0]'時會出現總線錯誤。我添加了循環(以及一些更改),它似乎已經工作,但我不確定它是否正確。 – Pygmalion

+0

巴士錯誤是什麼意思?你什麼時候得到它?是不是cudaErrorInvalidValue(錯誤代碼11)你之前得到了什麼? –

+0

以前錯誤是在cudaMalloc(錯誤代碼11)。現在,當我嘗試在cuda-gdb中運行它時,它得到一個總線錯誤,並說它無法訪問'host_fb [0] [0]'處的內存。 – Pygmalion

0

GPU上的2D陣列操作起來很棘手,您必須考慮到GPU和CPU地址空間不兼容。讓我指出幾點意見:

1)您不首先初始化** host_fb數組,因此後續在for循環中調用該數組的元素是錯誤的。

2)您應該使用cudaMallocHost(或類似的東西)來分配內存將由CPU

除此之外訪問我幫不了你,因爲你還沒有告訴我們什麼代碼應該去完成。

相關問題