如何在glsl shader中設計乙個自旋鎖

時間 2021-06-02 03:29:31

1樓:XZiar

這種設計不對,大家都說了。

自旋鎖不是用來控制讀寫順序的,相反它完全不能控制順序,只能用來防止資料競爭

如果你需要順序,你就得手動計算順序然後按順序依次指派threadgroup去寫。不過說實話,同一位置多次覆寫沒意義啊,還不是只保留最後乙個資料。如果你需要按順序去寫再讀再寫再讀……那我覺得你直接用compute shader寫到SLM(不覆蓋)來共享不就好了……

當然真要設計的話也不是不行,不過你需要ARB_shader_atomic_counter_ops或者是4.6,這裡面有CAS操作。

2樓:Tracy Liang

來學習了。

我也覺得GPU的目標就是盡量的並行化。而且很多演算法都想並行化。如果需要進行同步,鎖操作,還是分多個pass處理好或者用memory barrier之類的。

在GPU構建稀疏八叉樹,可以用個atomicCompSwap進行原子操作,寫乙個自旋鎖。不過效能會下降。

3樓:

首先讀肯定是沒問題的。多少個執行緒同時讀都是OK的。

至於寫,我比較好奇你期待的結果(或者說你想做的事情)是啥?多個執行緒同時對乙個位置寫,且不論是否會打架,最終能夠儲存的結果只有乙個,你是期望它是哪個?

我猜測你想做的是執行緒2拿著執行緒1的結果繼續處理,執行緒3拿著執行緒2,依次類推。但如果是這樣,這些執行緒之間的關係就不是並行關係而是序列。你應該考慮重新設計你的程式。

需要注意的是,GPU在任何乙個時間點,對於乙個(GPU)工作量當中的所有執行緒,都是執行的同一條命令。因此,GPU不可能像CPU那樣單獨卡住一部分執行緒而讓另一部分執行。但是你想要做的事情是可以實現的,方法就是通過分支,在true分支(當然反過來也可)當中放入真正的操作,在false分支當中放入nop(空指令)。

外面再套個迴圈,每次只讓乙個執行緒為true其它為false即可。

當然這樣做的效率極差。

4樓:頭像是狐狸嗎

噗...你一定要自旋鎖嗎,會很卡的。因為GPU的scheduler和CPU不一樣,GPU切換active threads的開銷是相對較小的,因為不用暫存和載入暫存器上下文等等。

如果你自旋了,反而會導致排程器沒法從這個等待執行緒切出去執行其他就緒執行緒。所以自旋來避免執行緒切換開銷的說法在GPU上是不成立的。

提供兩個替代的策略:

1.如果對讀寫順序沒有要求,只是要獨佔訪問,直接原子讀寫texture是更好的選擇。

2.如果對讀寫順序有要求,可以實現逐畫素的片段link-list,然後進行排序。後續pass再依次寫入。

當然,最好的辦法還是重新思考這個玩意在你的功能實現裡是不是必要的,重新設計你的演算法結構避免獨佔操作的發生。

如何在Football Manager中制定正確的戰術?

poorgod 建議讀英文版的 guide to fm 搞清楚每一項戰術指令 個人戰術指令 定位球指令 心態 自由度的含義。了解自己的球隊。知道每個球員的特點 踢球習慣。根據其特點和位置熟悉度 球隊板凳深度制定戰術。根據對手特點制定臨場戰術,根據形勢變化進行林場調整。我一直不太相信網上的各種包打天下...

如何在 Minecraft 中畫圓?

bit 這個東西嘛。完全可以用命令方塊實現吖 如果空心的就setblock就行,實心fill,用相對座標然後轉xRot和yRot 好像是這麼叫 趙佩鈜 利用 區域性座標 和盔甲架。在圓心處放置乙個盔甲架,用兩個迴圈型命令方塊分別迴圈執行以下命令 execute e type armor stand ...

如何在噪音中入睡?

防護小叫獸 不請自答 對於這個問題,我覺得題主可以考慮一下你所處的環境存在哪種噪音問題。下面我簡單說說 1.房子隔音不好,樓上樓下鄰居來來往往說話的噪音 2.房屋靠近馬路,室外的噪音 3.自己的聽力較好,稍有動靜就睡不著 4.家人呼嚕聲導致的噪音 以上這些問題是我們大部分會遇到的,那麼對這些不同的問...