偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

OpenMP中的任務(wù)調(diào)度

開發(fā) 前端
OpenMP中,任務(wù)調(diào)度主要用于并行的for循環(huán)中,當(dāng)循環(huán)中每次迭代的計(jì)算量不相等時(shí),如果簡(jiǎn)單地給各個(gè)線程分配相同次數(shù)的迭代的話,會(huì)造成各個(gè)線程計(jì)算負(fù)載不均衡,這會(huì)使得有些線程先執(zhí)行完,有些后執(zhí)行完,造成某些CPU核空閑,影響程序性能。

OpenMP中,任務(wù)調(diào)度主要用于并行的for循環(huán)中,當(dāng)循環(huán)中每次迭代的計(jì)算量不相等時(shí),如果簡(jiǎn)單地給各個(gè)線程分配相同次數(shù)的迭代的話,會(huì)造成各個(gè)線程計(jì)算負(fù)載不均衡,這會(huì)使得有些線程先執(zhí)行完,有些后執(zhí)行完,造成某些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; 

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

在OpenMP中,對(duì)for循環(huán)并行化的任務(wù)調(diào)度使用schedule子句來(lái)實(shí)現(xiàn),下面介紹schedule字句的用法。

1.1.1Schedule子句用法

schedule子句的使用格式為:

  1. schedule(type[,size]) 

schedule有兩個(gè)參數(shù):type和size,size參數(shù)是可選的。

1.  type參數(shù)

表示調(diào)度類型,有四種調(diào)度類型如下:

  • dynamic
  •  guided
  • runtime
  • static

這四種調(diào)度類型實(shí)際上只有static、dynamic、guided三種調(diào)度方式,runtime實(shí)際上是根據(jù)環(huán)境變量來(lái)選擇前三種中的某中類型。

run-sched-var

2. size參數(shù) (可選)

size參數(shù)表示循環(huán)迭代次數(shù),size參數(shù)必須是整數(shù)。static、dynamic、guided三種調(diào)度方式都可以使用size參數(shù),也可以不使用size參數(shù)。當(dāng)type參數(shù)類型為runtime時(shí),size參數(shù)是非法的(不需要使用,如果使用的話編譯器會(huì)報(bào)錯(cuò))。

1.1.2靜態(tài)調(diào)度(static)

當(dāng)parallel for編譯指導(dǎo)語(yǔ)句沒(méi)有帶schedule子句時(shí),大部分系統(tǒng)中默認(rèn)采用static調(diào)度方式,這種調(diào)度方式非常簡(jiǎn)單。假設(shè)有n次循環(huán)迭代,t個(gè)線程,那 么給每個(gè)線程靜態(tài)分配大約n/t次迭代計(jì)算。這里為什么說(shuō)大約分配n/t次呢?因?yàn)閚/t不一定是整數(shù),因此實(shí)際分配的迭代次數(shù)可能存在差1的情況,如果 指定了size參數(shù)的話,那么可能相差一個(gè)size。

靜態(tài)調(diào)度時(shí)可以不使用size參數(shù),也可以使用size參數(shù)。

3.不使用size參數(shù)

不使用size參數(shù)時(shí),分配給每個(gè)線程的是n/t次連續(xù)的迭代,不使用size參數(shù)的用法如下:

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()); 

上面代碼執(zhí)行時(shí)打印的結(jié)果如下:

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次連續(xù)迭代,線程1得到5~9次連續(xù)迭代。注意由于多線程執(zhí)行時(shí)序的隨機(jī)性,每次執(zhí)行時(shí)打印的結(jié)果順序可能存在差別,后面的例子也一樣。

4. 使用size參數(shù)

使用size參數(shù)時(shí),分配給每個(gè)線程的size次連續(xù)的迭代計(jì)算,用法如下:

  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()); 

執(zhí)行時(shí)會(huì)打印以下結(jié)果:

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

從打印結(jié)果可以看出,0、1次迭代分配給線程0,2、3次迭代分配給線程1,4、5次迭代分配給線程0,6、7次迭代分配給線程1,…。每個(gè)線程依次分配到2次連續(xù)的迭代計(jì)算。

#p#

1.1.3動(dòng)態(tài)調(diào)度(dynamic)

動(dòng)態(tài)調(diào)度是動(dòng)態(tài)地將迭代分配到各個(gè)線程,動(dòng)態(tài)調(diào)度可以使用size參數(shù)也可以不使用size參數(shù),不使用size參數(shù)時(shí)是將迭代逐個(gè)地分配到各個(gè)線程,使用size參數(shù)時(shí),每次分配給線程的迭代次數(shù)為指定的size次。

下面為使用動(dòng)態(tài)調(diào)度不帶size參數(shù)的例子:

  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.          } 

打印結(jié)果如下:

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

下面為動(dòng)態(tài)調(diào)度使用size參數(shù)的例子:

  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.          } 

打印結(jié)果如下:

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

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

1.1.4guided調(diào)度(guided)

guided調(diào)度是一種采用指導(dǎo)性的啟發(fā)式自調(diào)度方法。開始時(shí)每個(gè)線程會(huì)分配到較大的迭代塊,之后分配到的迭代塊會(huì)逐漸遞減。迭代塊的大小會(huì)按指數(shù)級(jí)下降到指定的size大小,如果沒(méi)有指定size參數(shù),那么迭代塊大小最小會(huì)降到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()); 

打印結(jié)果如下:

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,分配的迭代次數(shù)呈遞減趨勢(shì),最后一次遞減到2次。

1.1.5runtime調(diào)度(rumtime)

runtime調(diào)度并不是和前面三種調(diào)度方式似的真實(shí)調(diào)度方式,它是在運(yùn)行時(shí)根據(jù)環(huán)境變量OMP_SCHEDULE來(lái)確定調(diào)度類型,最終使用的調(diào)度類型仍然是上述三種調(diào)度方式中的某種。

例如在unix系統(tǒng)中,可以使用setenv命令來(lái)設(shè)置OMP_SCHEDULE環(huán)境變量:

setenv OMP_SCHEDULE “dynamic, 2”

上述命令設(shè)置調(diào)度類型為動(dòng)態(tài)調(diào)度,動(dòng)態(tài)調(diào)度的迭代次數(shù)為2。

在windows環(huán)境中,可以在”系統(tǒng)屬性|高級(jí)|環(huán)境變量”對(duì)話框中進(jìn)行設(shè)置環(huán)境變量。

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

責(zé)任編輯:陳四芳 來(lái)源: blog.csdn.net
相關(guān)推薦

2013-12-16 17:17:01

OpenMp數(shù)據(jù)處理

2023-12-26 07:44:00

Spring定時(shí)調(diào)度

2023-05-08 16:38:46

任務(wù)調(diào)度分布式任務(wù)調(diào)度

2022-09-16 11:23:59

Python框架Celery

2021-05-13 12:00:51

cron調(diào)度任務(wù)系統(tǒng)運(yùn)維

2020-04-01 16:10:02

PythonAPScheduler調(diào)度

2021-05-20 09:50:20

鴻蒙HarmonyOS應(yīng)用

2021-06-28 06:00:11

systemd定時(shí)器系統(tǒng)運(yùn)維

2025-06-17 08:20:00

2023-11-16 09:30:27

系統(tǒng)任務(wù)

2023-12-13 13:03:53

任務(wù)調(diào)度執(zhí)行XXLJOB

2021-05-14 11:39:58

SchedulePython工具

2022-12-20 10:22:16

計(jì)算函數(shù)

2023-10-06 12:15:02

2009-06-19 15:20:08

Quartz任務(wù)調(diào)度Spring

2020-09-29 19:20:05

鴻蒙

2023-06-26 00:14:28

Openjob分布式任務(wù)

2022-09-21 12:01:22

消息隊(duì)列任務(wù)隊(duì)列任務(wù)調(diào)度

2019-11-15 10:16:27

分布式任務(wù)框架

2025-06-03 07:15:00

Linux操作系統(tǒng)CFS 調(diào)度器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)