2017-07-20 212 views
2

我是OpenCL的初學者,試圖將簡單的CUDA函數轉換爲OpenCL。在CUDA功能,他們已經用下面的代碼片段獲取其操作的指數,CUDA到OpenCL:OpenCL中(blockIdx.x + blockIdx.y * gridDim.x)* blockDim.x + threadIdx.x的等價物是什麼?

int id = (blockIdx.x + blockIdx.y*gridDim.x) * blockDim.x + threadIdx.x; 

是get_global_id(0)OpenCL中的上述的相同呢?

int id = get_global_id(0); 
+3

簡短的回答是否定的。你有沒有想到更多的是/否的答案? – talonmies

+0

@talonmies如果不是,我想找到一個替代方法來實現這一點。 – Avis

回答

4

我不熟悉的CUDA(僅OpenCL的),但它看起來像下面的是等價的:

  • get_group_id(uint dimindx)blockIdx.[xyz]
  • get_local_size(uint dimindx)blockDim.[xyz]
  • get_local_id(uint dimindx)threadIdx.[xyz]
  • get_num_groups(uint dimindx) and gridDim.[xyz]

哪裏dimindx是0,1,或2,對應於.x.y,或.z分別。

get_global_id(0)get_group_id(0) * get_local_size(0) + get_local_id(0)相同,所以假設上述等價關係確實是正確的,它將與blockIdx.x * blockDim.x + threadIdx.x相同。 (和等同於指數1 .Y和索引2 .Z)

要得到相同的ID值,我想你大概想是這樣的:

int id = get_group_id(1) * get_global_size(0) + get_global_id(0); 

注意,原來的CUDA代碼明確沒有考慮到threadIdx.y。我懷疑這可能是因爲你的blockDim.y是1,或者是因爲你真的試圖獲得塊內最高的項目(而不是對應於當前線程的項目)。

一個更常見的情況是可能獲得用於當前工作項的索引,在緩衝液中含有的2D元件的陣列的陣列:

int id = get_global_id(1) * get_global_size(0) + get_global_id(0); 

這當然相當於到先前表達式,如果get_local_size(1)爲1.(塊的高度爲1.)

以上所有內容都假設您已將內核與CUDA中的等效工作組(塊)和全局維相關聯。

+0

我不確定你最後的表達是否正確,'get_global_id(1)'應該可能是'get_group_id(1)' – talonmies

+0

@talonmies看起來你對這個問題的深入檢查是正確的。我會解決它 - 雖然我懷疑在提問者的情況下,塊的大小可能是1,否則爲獲得ID而看起來很奇怪。 – pmdj

+0

@talonmies我懷疑'get_global_id(1)* get_global_size(0)+ get_global_id(0)'是對其他人更有用的東西,所以我添加了一個解釋以及糾正原來的效果。 – pmdj

相關問題