我不熟悉的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中的等效工作組(塊)和全局維相關聯。
簡短的回答是否定的。你有沒有想到更多的是/否的答案? – talonmies
@talonmies如果不是,我想找到一個替代方法來實現這一點。 – Avis