2、shedule條件
把並行迴圈中的計算指定給執行緒這種方式稱為迴圈佇列(loop』s schedule)。對於並行迴圈中並形體計算量接近的情況,使用預設的佇列方式是最優的。但也存在並行迴圈中每個平行計算量大小不一致的情況,如果計算量大小差距很大,並行程式的執行時間是以最後完成的那個執行緒為結束標記的,所以如果還採用相同的佇列方式,計算量小的執行緒會先執行完,然後等計算量大的執行緒執行完,最後才結束並行。在這種情況下,佇列分布的不均將會影響整個並行的執行效率,因此,需要去設定其佇列選項來控制佇列的分布。
schedule條件的格式如下:
schedule(type[,chunk])
其中type有static,dynamic,guided和auto四種,chunk是表示乙個並行塊的大小。如果需要對1000個迴圈進行並行,可以將它分成8個並行塊(chunk),每個並行塊就包括125個迴圈,則並行塊的大小就是125,即chunk size。執行緒執行的具體物件就是這些並行塊chunk。static表示靜態分割並行塊,在整個平行計算過程中並行塊的大小都一樣。dynamic則表示動態分割,預設其並行塊尺寸為1。guided表示嚮導性的分割,指定第乙個並行塊的大小,後面每個並行塊的尺寸都會遞減,直到最小的並行塊尺寸。採用auto或runtime時,不需要設定chunk引數,此時佇列型別將由環境變數omp_schedule來控制。
迴圈結構並行佇列過程以及在cpu中執行佇列過程如下圖所示:
若迴圈結構中迴圈次數為100次,通過schedule佇列指定每塊尺寸為20(即20個迴圈),則有5個並行塊,每個並行塊中並形體(乙個迴圈)仍然按序列方式排列。每個並行塊對應乙個新的執行緒。若計算機cpu具有4個執行核或4執行緒,那麼每一時刻最多只能執行4個執行緒,而現在有5個並行塊,所以最多只能執行4個並行塊,剩下乙個並行塊就只有在後面,平行計算所耗時間是由最慢的那個執行緒(並行塊)來決定的,所以盡量讓這些並行塊數目是計算機cpu核心的倍數(1倍或其它整數倍),以充分利用計算機cpu資源。
下面通過乙個程式動態設定並行塊大小來測試對計算效率的影響,**如下:
// file: scheduletest.cpp
#include "stdafx.h"
#include
#include
using namespace std;
//private測試
int scheduletest()
endtime=omp_get_wtime();
cout<
分別設定並行塊大小為1、2等,分別測試其計算耗時,結果如下表所示:
並行塊大小
計算耗時(s)
並行塊數目
每核平均執行並行塊數目
空閒執行緒數
並行塊大小
計算耗時(s)
並行塊數目
每核平均執行並行塊數目
空閒執行緒數
1
7.08998
200
25.0
024
8.57893
91.072
7.2503
10012.5
425
7.05088
8
1.0
03
7.44965
678.3
526
7.25465
8
1.0
04
7.67307
506.3
627
7.45207
8
0.9
0
5
7.09083
40
5.0
0
28
7.87446
8
0.9
06
8.1865
344.2629
8.4484
70.917
7.69326
293.6330
8.17421
70.8
18
8.57003
25
3.1
731
8.41376
70.819
7.36662
232.8132
8.62639
70.8110
8.30294
202.5433
9.14871
70.8111
9.01532
192.3534
9.09194
60.7
212
8.58991
17
2.1
735
9.32059
60.7
213
7.27074
16
1.9
036
9.5623
60.7214
7.70015
151.8137
10.0546
60.7215
8.26512
141.7238
10.1078
60.7216
8.72735
131.6339
10.248
60.6217
9.05444
121.5440
10.472
50.6318
9.52952
121.4450
12.572
40.5419
10.0843
111.3580
20.2732
30.3520
10.5465
101.3
6100
24.5377
20.3621
10.9686
101.2
6150
36.5224
20.2622
11.4323
101.1
6200
48.5702
10.1
723
10.2983
9
1.1
7
注:空閒執行緒指每佇列中並行塊數目沒有填滿cpu中匯流排程,所剩下的空閒執行緒(實際上這些執行緒不是空閒的,它可能用於其它程式,在此只是假定空閒以便於比較)。
從上圖以及測試結果可以得知:在每核平均執行並行塊數目大於或等於1.0時,並行塊數目對計算效率的影響呈鋸齒狀形態;當每核平均執行並行塊數目小於1.0時,計算效率急劇下降;空閒執行緒數目越多,計算效率越低。當每核平均執行並行塊數目為1,且每個並行塊中尺寸均勻相等時,計算效率會提供到極大值,上例中即並行塊尺寸為25時。若每個迴圈的計算量相差不大,建議採用static設定每個並行塊尺寸一樣。
迴圈結構(二)
乙個迴圈結構中可以巢狀其他兩種迴圈結構,巢狀多少層和多少個都可以,一般不會超過兩層!所以多重迴圈又往往被稱為叫雙重迴圈。外層迴圈執行一次,內層迴圈執行一遍 輪。while dowhile 如果在列印圖形的時候,先看有幾行,外層迴圈控制列印幾行。再看有幾列,內層迴圈控制每列列印的內容。一會break和...
迴圈結構(二)
for 引數初始化 條件判斷 更新迴圈變數 表示式全省略,無條件判斷,迴圈變數無改變 應在迴圈體內設法結束迴圈,否則會造成死迴圈 break語句 break 改變程式控制流 用於do while while for中時,可跳出迴圈而執行迴圈後面的語句 while continue語句 continu...
迴圈結構(二) 迴圈巢狀
三種迴圈可互相巢狀,層數不限 巢狀迴圈的執行流程 涉及行 列 控制的迴圈巢狀,考慮線性代數思想,即 i控制行 j控制列 例題 畫矩形 三角形 粘牆三角形 菱形 等 分析 列印圖形總是逐行進行的,本題要重複n行操作,對於每一行,又重複若干次輸出 操作。於是,構成了乙個兩層迴圈 外層迴圈是1至n行的處理...