迴圈結構的並行 二

2021-08-26 11:20:20 字數 4326 閱讀 9662

2、shedule條件

把並行迴圈中的計算指定給執行緒這種方式稱為迴圈佇列(loop』s schedule)。對於並行迴圈中並形體計算量接近的情況,使用預設的佇列方式是最優的。但也存在並行迴圈中每個平行計算量大小不一致的情況,如果計算量大小差距很大,並行程式的執行時間是以最後完成的那個執行緒為結束標記的,所以如果還採用相同的佇列方式,計算量小的執行緒會先執行完,然後等計算量大的執行緒執行完,最後才結束並行。在這種情況下,佇列分布的不均將會影響整個並行的執行效率,因此,需要去設定其佇列選項來控制佇列的分布。

schedule條件的格式如下:

schedule(type[,chunk])

其中type有staticdynamicguidedauto四種,chunk是表示乙個並行塊的大小。如果需要對1000個迴圈進行並行,可以將它分成8個並行塊(chunk),每個並行塊就包括125個迴圈,則並行塊的大小就是125,即chunk size。執行緒執行的具體物件就是這些並行塊chunk。static表示靜態分割並行塊,在整個平行計算過程中並行塊的大小都一樣。dynamic則表示動態分割,預設其並行塊尺寸為1。guided表示嚮導性的分割,指定第乙個並行塊的大小,後面每個並行塊的尺寸都會遞減,直到最小的並行塊尺寸。採用autoruntime時,不需要設定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行的處理...