gpu在多執行緒處理資料的時候,可能會同時訪問到同乙個資料,這就會出現臨界區的處理問題。
cuda提供了多個atmoic
原子操作,但是只支援一些基礎的資料型別,不能自定義結構體。對於多種資料的同步操作,就可能受到影響。
另一種解決臨界區的方法就是使用鎖的方法保護臨界區。
下面是在論壇找到的一些關於臨界區的討論:
因為gpu是按照wrap為單位排程執行緒的,乙個wrap裡面有32個執行緒,wrap遵從simt,即wrap裡面的執行緒執行同乙個執行。
如果按照上面的寫法,當wrap中的乙個執行緒獲得了鎖退出while
迴圈,它不能截至往下執行需要等wrap中的其他執行緒退出迴圈,但是其他執行緒在等待第乙個執行緒釋放鎖,因此出現了死鎖。
deadlock
出現死鎖的原因和code1
類似。
這個可以正常執行,wrap中滿足if條件的只有乙個,無論排程器先排程那個執行緒,都可以正常執行。
上面兩個**的主要區別是,退出while
迴圈的條件不同,第乙個是使用bool
變數進行判斷,第二個是直接使用break
退出。
使用除錯工具可以看出,atomicexch
(0048)在分支語句if
(0038)之後執行,這就會帶來if divergence的問題,由於排程器的排程就可能出現code1
中的死鎖,因為鎖的釋放不確定。
通過除錯工具可以看到,這段**的atomicexch
(0040)發生在if
(0060)條件之前,這就不會出現上面的情況。
應盡量避免臨界區的問題,避免不了就嘗試減小臨界區的大小,看看能否將一些操作移動到外面。
所用鎖來解決臨界區的問題時要特別謹慎,因為gpu特殊的排程機制(wrap)會導致if divergence的問題。
FreeRTOS 臨界區總結
當一名嵌入式開發人員從裸機開發切換到 基於 freertos 的開發後就要注意 中斷,資源競爭等等問題了。下面,總結一下 freertos 臨界區的知識及用法 1.應用程式使用臨界區 1.1 深入剖析的方法 1.2 使用方法 2.中斷函式中臨界區 2.1 深入剖析的方法 2.2 使用方法 void ...
臨界區問題的產生一
臨界區問題是嵌入式軟體程式設計乙個不得不面對的關鍵性問題。特別對於底層驅動,在記憶體中只有乙份,上層的多工或者多程序,都會對同乙個驅動去訪問,這樣不可避免的遇到了任務之間打架的問題,處理好這個問題是區分乙個菜鳥和老鳥的根本性關鍵之一。接下來談談臨界區產生的原因 假設有以下 int x void pr...
Linux多執行緒臨界區問題
臨界區指的是乙個訪問共用資源 例如 共用裝置或是共用儲存器 的程式片段,而這些共用資源又無法同時被多個執行緒訪問的特性。當有執行緒進入臨界區段時,其他執行緒或是程序必須等待,有一些同步的機制必須在臨界區段的進入點與離開點實現,以確保這些共用資源是被互斥獲得使用,例如 semaphore。只能被單一執...