成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

OpenMP中的任務調度

開發 前端
OpenMP中,任務調度主要用于并行的for循環中,當循環中每次迭代的計算量不相等時,如果簡單地給各個線程分配相同次數的迭代的話,會造成各個線程計算負載不均衡,這會使得有些線程先執行完,有些后執行完,造成某些CPU核空閑,影響程序性能。

OpenMP中,任務調度主要用于并行的for循環中,當循環中每次迭代的計算量不相等時,如果簡單地給各個線程分配相同次數的迭代的話,會造成各個線程計算負載不均衡,這會使得有些線程先執行完,有些后執行完,造成某些CPU核空閑,影響程序性能。例如以下代碼:

  1. int i, j; 
  2. int a[100][100] = {0}; 
  3. for ( i =0; i < 100; i++) 
  4. for( j = i; j < 100; j++ ) 
  5.     a[i][j] = i*j; 

如果將最外層循環并行化的話,比如使用4個線程,如果給每個線程平均分配25次循環迭代計算的話,顯然i=0和i=99的計算量相差了100倍,那么各個線程間可能出現較大的負載不平衡情況。為了解決這些問題,OpenMP中提供了幾種對for循環并行化的任務調度方案。

在OpenMP中,對for循環并行化的任務調度使用schedule子句來實現,下面介紹schedule字句的用法。

1.1.1Schedule子句用法

schedule子句的使用格式為:

  1. schedule(type[,size]) 

schedule有兩個參數:type和size,size參數是可選的。

1.  type參數

表示調度類型,有四種調度類型如下:

  • dynamic
  •  guided
  • runtime
  • static

這四種調度類型實際上只有static、dynamic、guided三種調度方式,runtime實際上是根據環境變量來選擇前三種中的某中類型。

run-sched-var

2. size參數 (可選)

size參數表示循環迭代次數,size參數必須是整數。static、dynamic、guided三種調度方式都可以使用size參數,也可以不使用size參數。type參數類型為runtime時,size參數是非法的(不需要使用,如果使用的話編譯器會報錯)。

1.1.2靜態調度(static)

當parallel for編譯指導語句沒有帶schedule子句時,大部分系統中默認采用static調度方式,這種調度方式非常簡單。假設有n次循環迭代,t個線程,那 么給每個線程靜態分配大約n/t次迭代計算。這里為什么說大約分配n/t次呢?因為n/t不一定是整數,因此實際分配的迭代次數可能存在差1的情況,如果 指定了size參數的話,那么可能相差一個size。

靜態調度時可以不使用size參數,也可以使用size參數。

3.不使用size參數

不使用size參數時,分配給每個線程的是n/t次連續的迭代,不使用size參數的用法如下:

schedule(static)

例如以下代碼:

  1. #pragma omp parallel for schedule(static) 
  2.     for(i = 0; i < 10; i++ ) 
  3.     { 
  4.          printf("i=%d, thread_id=%d/n", i, omp_get_thread_num()); 

上面代碼執行時打印的結果如下:

i=0, thread_id=0

i=1, thread_id=0

i=2, thread_id=0

i=3, thread_id=0

i=4, thread_id=0

i=5, thread_id=1

i=6, thread_id=1

i=7, thread_id=1

i=8, thread_id=1

i=9, thread_id=1

可以看出線程0得到了0~4次連續迭代,線程1得到5~9次連續迭代。注意由于多線程執行時序的隨機性,每次執行時打印的結果順序可能存在差別,后面的例子也一樣。

4. 使用size參數

使用size參數時,分配給每個線程的size次連續的迭代計算,用法如下:

  1. schedule(static, size) 

例如以下代碼:

  1. #pragma omp parallel for schedule(static, 2) 
  2.     for(i = 0; i < 10; i++ ) 
  3.     { 
  4.          printf("i=%d, thread_id=%d/n", i, omp_get_thread_num()); 

執行時會打印以下結果:

i=0, thread_id=0

i=1, thread_id=0

i=4, thread_id=0

i=5, thread_id=0

i=8, thread_id=0

i=9, thread_id=0

i=2, thread_id=1

i=3, thread_id=1

i=6, thread_id=1

i=7, thread_id=1

從打印結果可以看出,0、1次迭代分配給線程0,2、3次迭代分配給線程1,4、5次迭代分配給線程0,6、7次迭代分配給線程1,…。每個線程依次分配到2次連續的迭代計算。

#p#

1.1.3動態調度(dynamic)

動態調度是動態地將迭代分配到各個線程,動態調度可以使用size參數也可以不使用size參數,不使用size參數時是將迭代逐個地分配到各個線程,使用size參數時,每次分配給線程的迭代次數為指定的size次。

下面為使用動態調度不帶size參數的例子:

  1. #pragma omp parallel for schedule(dynamic) 
  2.          for(i = 0; i < 10; i++ ) 
  3.          { 
  4.                   printf("i=%d, thread_id=%d/n", i, omp_get_thread_num()); 
  5.          } 

打印結果如下:

i=0, thread_id=0

i=1, thread_id=1

i=2, thread_id=0

i=3, thread_id=1

i=5, thread_id=1

i=6, thread_id=1

i=7, thread_id=1

i=8, thread_id=1

i=4, thread_id=0

i=9, thread_id=1

下面為動態調度使用size參數的例子:

  1. #pragma omp parallel for schedule(dynamic, 2) 
  2.          for(i = 0; i < 10; i++ ) 
  3.          { 
  4.                   printf("i=%d, thread_id=%d/n", i, omp_get_thread_num()); 
  5.          } 

打印結果如下:

i=0, thread_id=0

i=1, thread_id=0

i=4, thread_id=0

i=2, thread_id=1

i=5, thread_id=0

i=3, thread_id=1

i=6, thread_id=0

i=8, thread_id=1

i=7, thread_id=0

i=9, thread_id=1

從打印結果可以看出第0、1,4、5,6、7次迭代被分配給了線程0,第2、3,8、9次迭代則分配給了線程1,每次分配的迭代次數為2。

1.1.4guided調度(guided)

guided調度是一種采用指導性的啟發式自調度方法。開始時每個線程會分配到較大的迭代塊,之后分配到的迭代塊會逐漸遞減。迭代塊的大小會按指數級下降到指定的size大小,如果沒有指定size參數,那么迭代塊大小最小會降到1。

例如以下代碼:

  1. #pragma omp parallel for schedule(guided,2) 
  2.     for(i = 0; i < 10; i++ ) 
  3.     { 
  4.          printf("i=%d, thread_id=%d/n", i, omp_get_thread_num()); 

打印結果如下:

i=0, thread_id=0

i=1, thread_id=0

i=2, thread_id=0

i=3, thread_id=0

i=4, thread_id=0

i=8, thread_id=0

i=9, thread_id=0

i=5, thread_id=1

i=6, thread_id=1

i=7, thread_id=1

第0、1、2、3、4次迭代被分配給線程0,第5、6、7次迭代被分配給線程1,第8、9次迭代被分配給線程0,分配的迭代次數呈遞減趨勢,最后一次遞減到2次。

1.1.5runtime調度(rumtime)

runtime調度并不是和前面三種調度方式似的真實調度方式,它是在運行時根據環境變量OMP_SCHEDULE來確定調度類型,最終使用的調度類型仍然是上述三種調度方式中的某種。

例如在unix系統中,可以使用setenv命令來設置OMP_SCHEDULE環境變量:

setenv OMP_SCHEDULE “dynamic, 2”

上述命令設置調度類型為動態調度,動態調度的迭代次數為2。

在windows環境中,可以在”系統屬性|高級|環境變量”對話框中進行設置環境變量。

原文鏈接:http://blog.csdn.net/drzhouweiming/article/details/1844762

責任編輯:陳四芳 來源: blog.csdn.net
相關推薦

2013-12-16 17:17:01

OpenMp數據處理

2023-12-26 07:44:00

Spring定時調度

2023-05-08 16:38:46

任務調度分布式任務調度

2022-09-16 11:23:59

Python框架Celery

2021-05-13 12:00:51

cron調度任務系統運維

2020-04-01 16:10:02

PythonAPScheduler調度

2021-05-20 09:50:20

鴻蒙HarmonyOS應用

2021-06-28 06:00:11

systemd定時器系統運維

2025-06-17 08:20:00

2023-11-16 09:30:27

系統任務

2023-12-13 13:03:53

任務調度執行XXLJOB

2021-05-14 11:39:58

SchedulePython工具

2022-12-20 10:22:16

計算函數

2023-10-06 12:15:02

2009-06-19 15:20:08

Quartz任務調度Spring

2020-09-29 19:20:05

鴻蒙

2023-06-26 00:14:28

Openjob分布式任務

2022-09-21 12:01:22

消息隊列任務隊列任務調度

2019-11-15 10:16:27

分布式任務框架

2025-06-03 07:15:00

Linux操作系統CFS 調度器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩在线播放av | 天天拍天天草 | 欧美一区二区久久 | 国产精品不卡一区二区三区 | 成人精品一区二区三区中文字幕 | 免费国产精品久久久久久 | 久久久做 | 黄色在线网站 | 亚洲一区二区久久 | 99精品免费久久久久久久久日本 | 在线观看中文字幕一区二区 | 欧洲毛片| 国产精品久久久久久妇女6080 | 成人污污视频 | 久久精品一区 | 日日夜夜精品视频 | 日本超碰| 天天操人人干 | 黄色男女网站 | 婷婷亚洲综合 | 国产91精品久久久久久久网曝门 | av日韩精品 | 久一久 | 一级毛片视频在线观看 | h视频免费看| 亚洲精品电影网在线观看 | 一区二区久久 | 久久精品91久久久久久再现 | 日韩不卡在线 | www亚洲一区 | 免费在线精品视频 | 久久久天堂 | 亚洲视频网| 亚洲国产精品一区二区三区 | 国产日产久久高清欧美一区 | 欧美色综合一区二区三区 | 成人毛片网 | 性一交一乱一伦视频免费观看 | 成人小视频在线观看 | 欧美激情一区 | 国产精品一区二区欧美黑人喷潮水 |