今天踩了乙個很大的坑,覺得很有必要記錄下來。最近都在弄高效能方面的,cpu跟gpu的平行計算我都有在學。
今天這個坑是關於openmp的。初始程式用1個執行緒跑一點問題都沒有,改為openmp的多執行緒後,每個pixel的計算結果有的對有的不對,
有的還沒有被計算。由於我是移植程式的,**基本一模一樣,可這一模一樣好像說的也不對,被吐槽過幾次,很多看上去一樣的**其實總
有一兩個小地方是不一樣的,所以對比**的時候一定要細心認真。因此我跟原來的程式認真一步一步debug進行中間結果的對比,發現同樣
的**居然會有不同的結果,有的地方我明明給陣列a賦值了,tid == 0 的時候一切正常, tid == 1的時候就都算錯。
這個坑也不知道怎麼去搜尋,因此取了這個題目 openmp 單執行緒改為多執行緒出錯,希望有日後的人踩到這個坑的時候能很快地跳出來。
首先要查的內容方面應該是openmp變數共享的問題,多執行緒肯定是資源共享的,但tid ==0的時候一切正常, tid==1,2,3的時候總是報錯,
這就像是tid == 0占有了這個公共資源,其他執行緒獲取不到。又或者說是某些執行緒擅自修改了某些變數,然而我的**裡面根本就沒有相關的
寫入操作,最後發現原來是:
#pragma omp for
for(i = 0, i < n;i++)
這樣的寫法是錯誤的,在openmp for語句中一定要宣告好這個變數的作用域,上述的寫法i是公用變數,也就是說pragma omp for確實是分配給
多個執行緒等量的任務,然而由於每個執行緒都對i進行i++的這個操作,有些i的變數就被跳過了,所以就出現了沒有計算結果的這種情況。
正確的寫法應該是:
#pragma omp for
for(int i = 0, i < n;i++)
一定要有int 這種型別的宣告。
這個坑踩了整整一天。。。。。。。。一模一樣的**居然還能跑出不一樣的結果,我們還是要了解程式的本質或者說用到的技術的本質才能
更好地發現出問題的本質啊。
單執行緒 多執行緒
1.基於python的單執行緒示例 from time import ctime,sleep import time def play video video for i in range 2 print i am playing video s at s video,ctime sleep 5 d...
單執行緒和多執行緒
what 1.程序 當乙個程式開始執行時,它就是乙個程序,程序包括執行中的程式和程式所使用到的記憶體和系統資源。2.執行緒 執行緒就是程式中的乙個執行流,每個執行緒都有自己的專有暫存器 棧指標 程式計數器等 但 是可以共享的,即不同的執行緒可以執行相同的函式。3.多執行緒 多執行緒是指程式中包含多個...
單執行緒和多執行緒
普通的程式預設都是單執行緒,程式的執行方式是從上至下序列執行,示例 import time deffunc a,b time.sleep 1 print a b s time.time func 5,10 func 2,5 func 6,84 func 9,46 e time.time print ...