簡體   English   中英

為什么我的OpenMP實現比單線程實現慢?

[英]Why is my OpenMP implementation slower than a single threaded implementation?

我正在學習OpenMP並發性,並嘗試了我現有的一些代碼。 在這段代碼中,我嘗試將所有for循環並行化。 但是,這似乎使程序更慢,比單線程版本慢10倍甚至更多。

這是代碼: http//pastebin.com/zyLzuWU2

我也使用了pthreads,結果比單線程版本更快。

現在的問題是,在我的OpenMP實現中我做錯了什么導致了這種放緩?

謝謝!

編輯:單線程版本只是沒有所有#pragmas的版本

我在您的代碼中看到的一個問題是,您在非常小的循環(例如,8或64次迭代)中使用OpenMP。 由於開銷,這將無效。 如果要將OpenMP用於n-queens問題,請查看OpenMP 3.0任務和線程並行性以解決分支綁定問題。

我認為您的代碼太復雜了,無法在此處進行審核。 我立即看到的一個錯誤是它甚至不正確。 在使用omp parallel for執行求和的地方,必須使用reduction(+: yourcountervariable)將不同線程的結果正確組合在一起。 否則,一個線程可能會覆蓋其他線程的結果。

至少有兩個原因:

  1. 你只做了一個非常簡單的循環的8次迭代。 您的運行時將完全由設置所有線程所涉及的開銷所主導。

  2. 在某些地方, critical部分會引起爭議; 所有線程都將嘗試連續訪問臨界區,並相互阻塞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM