簡體   English   中英

CUDA條件線程同步

[英]CUDA conditional thread synchronization

CUDA編程指南指出了這一點

條件代碼中允許__syncthreads(),但僅當條件在整個線程塊中進行相同的求值時,否則代碼執行可能會掛起或產生意外的副作用。

因此,如果我需要在一個塊上使用條件分支同步線程,其中一些線程可能會或可能不會采用包含__syncthreads()調用的分支,這是否意味着它不起作用?

我想象可能存在各種各樣的情況,你可能需要這樣做; 例如,如果您有二進制掩碼並需要有條件地對像素應用某個操作。 __syncthreads()說, if (mask(x, y) != 0)然后執行包含__syncthreads()的代碼,否則什么也不做。 怎么辦?

如果你需要走這條路,你可以把身體分成兩個階段:

if (condition)
{
    // code before sync
}
__syncthreads();
if (condition) // or remember a flag or whatever
{
    // code after sync
}

或者,您可以使用條件設置禁用某些操作的標志,例如,如果您正在計算增量更新,則可以執行以下操作:

// *ALL* compute a delta update, those threads that would have failed the condition
// simply compute garbage.
// This can include syncthreads
if (condition)
    // apply update

從3.0開始,您可以使用warp vote函數來完成__syncthreads無法完成的操作:

Warp投票功能僅由計算能力1.2的設備支持

int __all(int predicate); warp的所有線程的謂詞,當且僅當謂詞對所有線程的計算結果為非零時才返回非零。

int __any(int predicate); 為warp的所有線程計算謂詞,並且當且僅當謂詞對其中任何一個求值為非零時才返回非零。

unsigned int __ballot(int predicate); 為warp的所有線程計算謂詞,並返回一個整數,當且僅當謂詞為warp的第N個線程計算為非零時才設置第N位。 此功能僅由計算能力2.x的設備支持。

否則還有Atomic Bitwise功能

atomicAnd,atomicOr,atomicXor

參見cuda編程指南的B.11節

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM