2011-06-19 100 views
21

我有塊的數量爲B,並且每個塊具有螺紋的噸數。 我可以使用CUDA塊同步

__syncthreads() 

來同步特定塊中的線程。例如

__global__ void aFunction() 
{ 
    for(i=0;i<10;i++) 
    { 
     //execute something 
     __syncthreads(); 
    } 
} 

但我的問題是同步所有塊中的所有線程。我怎樣才能做到這一點?

回答

29

在CUDA 9中,NVIDIA正在引入合作組的概念,允許您同步屬於該組的所有線程。這樣的組可以跨越網格中的所有線程。這樣,您就能夠將所有的線程在所有塊同步:

grid_group g = this_grid(); 
g.sync(); 

你需要一個Pascal或更新的架構同步電網。

所有體系結構都支持基本功能,例如將比線程塊小的組同步到warp粒度,而Pascal和Volta GPU則支持新的網格範圍和多GPU同步組。

來源:https://devblogs.nvidia.com/parallelforall/cuda-9-features-revealed/


CUDA 9之前,還有所有線程的所有塊進行同步,而本機方法。事實上,在CUDA塊的概念是,有些人可能會推出後才一些其他塊已經結束的工作,例如,如果運行的GPU是太弱,無法處理它們並行。

如果你確保你不產卵段太多,你可以嘗試自己之間,例如所有塊同步通過主動等待使用原子操作。然而,這很慢,吃掉你的GPU內存控制器,被認爲是「黑客」,應該避免。

,我可以建議最好的辦法,是在同步點簡單地終止你的內核,然後啓動一個新的內核,其將繼續與你的工作。在大多數情況下,它會比使用提到的黑客更快(或至少 - 以相似的速度)。

+1

耶!之後,從原來的答案6年,CUDA的新版本讓我再重新考慮,並給予更積極的解決方案:) – CygnusX1