2012-07-11 60 views
0

我想要沿矢量vecShift移動卷紋理的內容。我認爲一個內核是這樣的:CUDA:僅使用一個內核和線程來移動卷紋理的內容

__global__ void 
moveVolume(int* vecShift) 
{ 
    // Determine position of current voxel as ptDest 

    // Determine position of voxel we copy the content from as ptSrc 

    // Read value at ptSrc and store it to voxelColor 

    // __threadfence() 

    // Write voxelColor to voxel at position ptDest 
} 

的threadfence將確保所有的體素已經閱讀他們的「合作伙伴」的內容,並會出現以ptDest沒有寫每個體素已經完成讀操作之前,不它?

如果這是真的,爲什麼我(有時)得到一個模糊類型的文物?或者我對threadfence的功能有錯誤的看法?

+0

'__threadfence()'只確保寫入對設備上的所有**活動**線程都可見。如果您的內核啓動包含的塊數多於可以在設備上同時運行的塊,那麼您的策略將保證失敗。 – talonmies 2012-07-11 14:59:25

回答

2

正如talonmies在評論中解釋的那樣,在這裏使用__threadfence()既不必要也不足夠。 __threadfence()不提供全球性的屏障同步,它只是確保之前調用__threadfence()收益線程,柵欄前所有寫入由線程是在內核啓動所有其他活動線程可見。

你在這裏真正想要的是加倍緩衝你的卷數據(即寫入到你讀的不同的數組)。除非可以保證它們只能被其他線程在同一個線程塊中讀取,否則不能覆蓋該陣列的其他部分。否則,你有一個競爭條件,你的程序是不正確的。

注意:即使在連續(CPU)實現中,您也需要爲這種類型的計算對數據進行雙重緩衝!

你正在實現的是和流體動力學模擬中使用的平流內核非常相似,並且我確定有多個你想在網上(並行或者連續)的例子。

Mark