2017-01-04 26 views
1

我知道什麼是__syncthreads(),我願做一點點不同的事情:CUDA中的線程可能「輕鬆」同步線程嗎?

__global__ void kernel() 
{ 
    __shared__ array[1024]; 
    some other declarations 

    load some data into array 
label1: 
    do some other independent calculations 

label2: 
    use data from array 
    ... 
} 

所以我可以做__syncthreads();在label2。它具有語義,只有當所有線程都達到label2時,線程才能超出label2

我真正需要的是確保當所有其他線程都達到label1時線程可以超出label2。這種障礙較弱,我希望這會阻礙我的計劃。有沒有像這樣的輕鬆屏障?

+1

是什麼讓你確定所有的線程在第一次到達'label2'時都會通過'label1'?你如何定義'第一線程'? – pSoLT

+0

我大致瞭解GPU如何工作,但當然不能完全確定。 GPU採用線程0-31,爲它們執行一個操作。如果操作需要多個週期,GPU會爲32-63個線程執行一次操作...因此,內存讀取後的附加計算越多 - 插入其他線程執行所需的週期就越多。 內存讀取,如果它們在內核的開始處,將開始,我想,它們彼此非常接近並且在多次循環之後結束,但也一起結束。 –

+1

用'__shared__'內存原子來構造一個「條件」__syncthreads()'操作可能是可能的。如果沒有完整的示例或測試用例,我不清楚它是否會比正常發出'__syncthreads()'更有好處。 [目前,__syncthreads()暴露在CUDA C/C++級別](http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#synchronization-functions),沒有內置的條件功能沿着你所要求的內容。 –

回答

-1

只有當塊的大小等於warp(或half)的大小時,纔可以安全地忽略__syncthreads()。這種技術被稱爲「經編同步編程」。由於一個warp內的所有線程同時執行的事實,您可以確定它們有一點意味着它們已經執行了先前的指令。在其他情況下,您只能假設塊內的所有線程都已經過了內核的某個部分 - 這是非常非常冒險的假設。

+0

是的,我明白這一點... –

+0

在對我的答案進行投票前,請閱讀原始(未編輯)的問題。如果你仍然不同意 - 用評論告訴我它有什麼問題。 – pSoLT

+0

我相信在我編輯這個問題之前,它已經被低估了。原始版本與我的編輯一樣要求相同的內容,但是以間接/複雜的方式。因此,這不是問題的答案。 (不是我downvote雖然) – CygnusX1