OpenMP 單執行緒改多執行緒結果出錯

2021-07-24 15:31:50 字數 991 閱讀 9506

今天踩了乙個很大的坑,覺得很有必要記錄下來。最近都在弄高效能方面的,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 ...