簡體   English   中英

OpenMP num_threads(1)的執行速度比沒有OpenMP快

[英]OpenMP num_threads(1) executes faster than no OpenMP

我已經在各種情況下運行我的代碼,導致我認為這是奇怪的行為。 我的測試是在具有HT的雙核Intel Xeon處理器上進行的。

沒有OpenMP'#pragma'語句,總運行時間= 507秒

使用OpenMP'#pragma'語句指定1個內核,總運行時間= 117秒

使用OpenMP'#pragma'語句指定2個內核,總運行時間= 150秒

使用OpenMP'#pragma'語句指定3個內核,總運行時間= 157秒

使用OpenMP'#pragma'語句指定4個內核,總運行時間= 144秒

我想我無法弄清楚為什么注釋掉我的openmp行會導致程序在沒有openmp的1個線程和使用openmp的1個線程之間速度如此之慢。

我要更改的只是以下兩者之間:

//#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(guided)行時,無論線程數量如何,我都會生成最快的解決方案。 -當我使用默認的調度程序時,我的結果會明顯變慢並且取不同的值-在增加線程的情況下,進度表(指導)的改進不會得到改善-在沒有進度表(指導的情況下),添加線程的改進會得到改進

我想我還沒有找到足夠的時間表(指導)對我的功能的描述,我確實知道它會嘗試拆分循環,以便最耗時的迭代首先發生,而效果應該最小一個線程等待其他線程完成其迭代的時間。

看來,對於我的約900次迭代循環,當我使用schedule(指導)時,我僅處理約200次迭代,而沒有使用schedule(指導)時,我將處理所有900次迭代。 有什么想法嗎?

OpenMP具有顯着的同步開銷。 我發現,除非你有一個非常環路,做了很多工作,並具有無環路內同步,那么它通常是不值得使用OpenMP。

我認為將線程數設置為一(1)時,OpenMP只是對實現循環的OpenMP過程進行了過程調用,因此開銷很小,並且性能與非OpenMP情況基本相同。

否則,我認為OpenMP會設置一些信號量,然后等待“工作程序”線程醒來,同步它們對數據結構的訪問,告訴他們要設置哪些循環參數,然后調用完成工作的例程以及何時完成這些工作。工作時,它們再次向主線程發出信號。 這種同步必須在線程執行的每個工作塊中發生,並且同步開銷是不小的。

使用STATIC調度選項可以幫助減少調度/同步開銷,尤其是在循環迭代的次數相對於內核數較大的情況下。

暫無
暫無

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

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