我在各種情況下運行我的代碼,導致我認爲是奇怪的行爲。我的測試是使用HT的雙核英特爾至強處理器。OpenMP num_threads(1)執行速度快於無OpenMP
否的OpenMP '的#pragma' 語句,總運行時間=507秒
對於OpenMP '的#pragma' 語句中指定1個芯,總運行時間=117秒
對於OpenMP「的#pragma '語句中指定2芯,總運行時間=150秒
對於OpenMP‘的#pragma’語句中指定3芯,總運行時間=157秒
使用OpenMP'#pragma'語句指定4核心,總運行時間= 144秒
我猜我不明白爲什麼註釋掉我的openmp行會導致程序在1線程之間變慢,而沒有使用openmp和1線程用openmp。
所有我改變之間:
//#pragma omp parallel for shared(segs) private(i, j, p_hough) num_threads(1) schedule(guided)
and...
#pragma omp parallel for shared(segs) private(i, j, p_hough) num_threads(1,2,3,4) schedule(guided)
不管怎麼說,如果任何人有任何想法,爲什麼這可能會發生,請讓我知道!
感謝您的幫助,
佈雷特
編輯:我會解決的一些評論在這裏
我使用NUM_THREADS(1),NUM_THREADS(2)等。
經過進一步調查,事實證明,根據代碼中是否包含「schedule(引導)」行,我的結果不一致。
- 當我使用計劃(引導)行時,無論線程數量多少,我都會生成最快的解決方案。 - 當我使用默認調度程序時,我的結果顯着變慢並且數值不同 -隨着線程數的增加無法獲得進度(指導)改進 - 沒有調度(指導)我通過添加線程獲得改進
我想我還沒有找到一個足夠好的描述什麼時間表(指導)爲我做的,我明白,它試圖分裂循環,使最耗時的迭代首先發生,這應該有一個效果一個線程等待其他人完成迭代的最少時間。
似乎對於我的〜900迭代循環,當我使用schedule(引導)時,我只處理〜200次迭代,其中沒有計劃(指導),我正在處理所有900次迭代。有什麼想法嗎?
程序是否仍然產生正確的結果?也許你在編譯器OpenMP實現中發現了一個錯誤。 – 2010-05-26 17:57:27
嘗試刪除'schedule(引導)' – Jacob 2010-05-26 18:26:41
您確定在每種情況下都使用了相同的編譯器標誌(尤其是優化標誌)嗎? – KeithB 2010-05-26 18:27:13