簡體   English   中英

CUDA中的線程同步

[英]Threads syncronization in CUDA

我有一個由3D塊組成的3D網格,並且在每個塊中,我需要在該塊的“ z”層上順序進行計算。 換句話說,我想先執行所有(x,y,0)線程,然后執行所有(x,y,1)等。我需要逐層執行線程(按z軸計數)。 我知道函數__syncthreads(),但是我不知道如何以所需的方式同步線程。

UPD:

 __global__ void Kernel(//some params)
 {


      //some code 
      __syncthreads();
 }

它同步塊中的所有線程。 但是我需要執行z = 0的所有線程,然后執行z = 1的所有線程,等等。

您可以使用簡單的循環,並在每次迭代中指定要執行工作的線程。 就像是:

for (int z = 0; z < zmax; z++) {
    if (threadIdx.z == z) { 
        //do whatever with x and y
    }
    __syncthreads();
}

在每次迭代中,具有特定z-index的線程將執行指令,而其他線程則處於空閑狀態。 在每次迭代結束時,所有線程都會同步。

__syncthreads()阻塞一個塊中的線程。 如果您堅持使用__syncthreads() ,則必須確保塊大小與a(x * y)相同,這不一定是可能的,即使那樣,也不能保證塊的順序。 獲得目標的另一種方法是在每一層啟動一個內核,並在內核之間進行同步(即阻止內核並發)。 當然,這實際上取決於您的確切內核做什么,以及是否可行將其分解。

暫無
暫無

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

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