国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

OpenMP程序設計的兩個小技巧

開發 前端
實際情況中,程序可能運行在不同的機器環境里,有些機器是雙核,有些機器是4核甚至更多核。并且未來硬件存在升級的可能,CPU核數會變得越來越多。

1、動態設置并行循環的線程數量

在實際情況中,程序可能運行在不同的機器 環境里,有些機器是雙核,有些機器是4核甚至更多核。并且未來硬件存在升級的可能,CPU核數會變得越來越多。如何根據機器硬件的不同來自動設置合適的線 程數量就顯得很重要了,否則硬件升級后程序就得進行修改,那將是一件很麻煩的事情。

比如剛開始在雙核系統中開發的軟件,線程數量缺省都設成2,那么當機器升級到4核或8核以后,線程數量就不能滿足要求了,除非修改程序。

線程數量的設置除了要滿足機器硬件升級的可擴展性外,還需要考慮程序的可擴展性,當程序運算量增加或減少后,設置的線程數量仍然能夠滿足要求。顯然這也不能通過設置靜態的線程數量來解決。

在具體計算需要使用多少線程時,主要需要考慮以下兩點:

1)當循環次數比較少時,如果分成過多數量的線程來執行,可能會使得總運行時間高于較少線程或一個線程執行的情況。并且會增加能耗。

2)如果設置的線程數量遠大于CPU核數的話,那么存在著大量的任務切換和調度等開銷,也會降低整體效率。

那么如何根據循環的次數和CPU核數來動態地設置線程的數量呢?下面以一個例子來說明動態設置線程數量的算法,假設一個需要動態設置線程數的需求為:

1、 以多個線程運行時的每個線程運行的循環次數不低于4次

2、 總的運行線程數最大不超過2倍CPU核數

下面代碼便是一個實現上述需求的動態設置線程數量的例子

  1. const int MIN_ITERATOR_NUM = 4
  2.    int ncore = omp_get_num_procs(); //獲取執行核的數量 
  3.    int max_tn = n / MIN_ITERATOR_NUM; 
  4.    int tn = max_tn > 2*ncore ? 2*ncore : max_tn; //tn表示要設置的線程數量 
  5. #pragma omp parallel for if( tn > 1) num_threads(tn) 
  6.      for ( i = 0; i < n; i++ ) 
  7.      { 
  8.          printf("Thread Id = %ld/n", omp_get_thread_num()); 
  9.          //Do some work here 
  10.      } 

在上面代碼中,根據每個線程運行的循環次數不低于4次,先計算出最大可能的線程數max_tn,然后計算需要的線程數量tn,tn的值等于max_tn和2倍CPU核數中的較小值。

然后在parallel for構造中使用if子句來判斷tn是否大于1,大于1時使用單個線程,否則使用tn個線程,,這樣就使得設置的線程數量滿足了需求中的條件。

比如在一個雙核CPU上,n=64,最終會以2倍CPU核數(4個)線程運行,而不會以max_tn = 64/4=16個線程運行。

在實際情況中,當然不能每個循環都象上面一樣寫幾行代碼來計算一遍,可以將其寫成一個獨立的功能函數如下:

  1. const int g_ncore = omp_get_num_procs(); //獲取執行核的數量 
  2.   
  3. /** 計算循環迭代需要的線程數量 
  4.      根據循環迭代次數和CPU核數及一個線程最少需要的循環迭代次數 
  5.      來計算出需要的線程數量,計算出的最大線程數量不超過CPU核數 
  6.   
  7.      @param   int n - 循環迭代次數   
  8.      @param   int min_n - 單個線程需要的最少迭代次數    
  9.      @return int - 線程數量     
  10. */ 
  11. int dtn(int n, int min_n) 
  12.    int max_tn = n / min_n; 
  13.    int tn = max_tn > g_ncore ? g_ncore : max_tn; //tn表示要設置的線程數量 
  14.    if ( tn < 1 ) 
  15.    { 
  16.         tn = 1
  17.    } 
  18.    return tn; 
  19. 這樣每次并行化循環時就可以直接使用函數dtn()來獲取合適的線程數量,前面的代碼可以簡寫成如下形式: 
  20. #pragma omp parallel for num_threads(dtn(n, MIN_ITERATOR_NUM)) 
  21.      for ( i = 0; i < n; i++ ) 
  22.      { 
  23.          printf("Thread Id = %ld/n", omp_get_thread_num()); 
  24.          //Do some work here 
  25.      } 

當然具體設置多少線程要視情況而定的,一般情況下線程數量剛好等于CPU核數可以取得比較好的性能,因為線程數等于CPU核數時,每個核執行一個任務,沒有任務切換開銷。

2、嵌套循環的并行化

在嵌套循環中,如果外層循環迭代次數較少時,如果將來CPU核數增加到一定程度時,創建的線程數將可能小于CPU核數。另外如果內層循環存在負載平衡的情況下,很難調度外層循環使之達到負載平衡。

下面以矩陣乘法作為例子來講述如何將嵌套循環并行化,以滿足上述擴展性和負載平衡需求。

   其實可以采用一個簡單的方法將最外層循環和第2層循環合并成一個循環,下面便是采用合并循環后的并行實現。

  1. void Parallel_Matrix_Multiply(int *a, int row_a, int col_a, 
  2.                      int *b, int row_b,int col_b, 
  3.                      int *c, int c_size ) 
  4.     if ( col_a != row_b ) 
  5.     { 
  6.         return; 
  7.     } 
  8.   
  9.     int i, j, k; 
  10.     int index; 
  11.     int border = row_a * col_b; 
  12.   
  13.     i = 0
  14.     j = 0
  15. #pragma omp parallel private(i,j,k) num_threads(dtn(border, 1)) 
  16.     for ( index = 0; index < border; index++ ) 
  17.     { 
  18.         i = index / col_b; 
  19.         j = index % col_b; 
  20.   
  21.         int row_i = i * col_a; 
  22.         int row_c = i * col_b; 
  23.   
  24.         c[row_c+j] = 0; 
  25.         for ( k = 0; k < row_b; k++ ) 
  26.         { 
  27.             c[row_c + j] += a[row_i+k] * b[k*col_b+j]; 
  28.         } 
  29.     } 

從上面代碼可以看出,合并后的循環邊界border = row_a * col_b;即等于原來兩個循環邊界之積,然后在循環中計算出原來的外層循環和第2層循環的迭代變量i和j,采用除法和取余來求出i和j的值。

需要注意的是,上面求i和j的值必須要保證循環迭代的獨立性,即不能有循環迭代間的依賴關系。不能將求i和j值的過程優化成如下的形式:

  1. if ( j == col_b ) 
  2.      j = 0
  3.      i++; 
  4. // …… 此處代表實際的矩陣乘法代碼 
  5. j++; 

上面這種優化,省去了除法,效率高,但是只能在串行代碼中使用,因為它存在循環迭代間的依賴關系,無法將其正確地并行化。

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

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

2013-12-16 16:58:47

OpenMP并行

2013-12-16 16:49:57

OpenMP

2010-11-22 15:48:40

MySQL修復表

2012-06-13 11:25:23

Windows 8系統技巧

2017-09-05 08:16:29

代碼判斷函數

2010-09-01 08:35:07

Visual Stud

2023-11-03 15:33:22

Docker鏡像云計算

2011-09-20 15:19:15

Python

2011-05-05 17:13:33

故障筆記本黑屏

2020-10-25 08:47:36

Python有序字典

2010-07-25 14:31:54

Telnet程序

2010-02-25 16:45:13

WCF應用技巧

2013-07-05 10:52:07

程序員結對編程

2015-02-05 09:54:13

程序員

2016-11-04 09:55:16

微信小程序

2018-02-02 11:36:25

2023-09-06 00:15:04

Pandas技巧格式

2009-02-25 14:51:05

應用程序設計ASP.NET.NET

2021-12-16 16:20:57

GoWebSocketLinux

2020-03-26 15:12:35

程序線程協程
點贊
收藏

51CTO技術棧公眾號

亚洲婷婷伊人| 久久亚洲风情| 亚洲美女福利视频网站| 在线看国产视频| eeuss影院一区二区三区| 蜜桃传媒视频第一区入口在线看| 小嫩嫩12欧美| 久久手机免费视频| 国产在线|日韩| 精品性高朝久久久久久久| 日本理论片午伦夜理片在线观看| 欧美日韩在线直播| 国产中文字幕在线看| 精品久久久久久电影| 日韩欧美国产精品一区二区三区| 国产农村妇女毛片精品久久麻豆 | 午夜精品影院在线观看| 男人天堂av网站| 一区二区三区中文字幕电影| 成人毛片高清视频观看| 国产精品免费久久| 99热在线免费播放| 亚洲色图视频网站| 黄色激情网站| 亚洲成人福利片| 三区在线观看| 欧美性xxxxxxxx| 在线免费看黄网站| 91精品国产91热久久久做人人| 在线免费观看的av网站| 日韩免费高清av| 欧美与亚洲与日本直播| 色综合老司机第九色激情 | 能在线观看av网站| 亚洲www啪成人一区二区麻豆| 永久免费在线| 欧美男女性生活在线直播观看| 91精品国产91久久久久久青草| 亚洲成人久久网| 免费成人直播| 97国产精品人人爽人人做| 欧美猛男男男激情videos| 亚洲自拍偷拍第一页| 午夜一级久久| 欧美精品卡一卡二| 亚洲欧美日韩成人高清在线一区| 男人的天堂在线免费视频| 欧美精三区欧美精三区| 成人片免费看| 97在线精品视频| 亚洲性色视频| 免费日韩在线观看| 夜色激情一区二区| 羞羞网站在线免费观看| 久久综合电影一区| 欧美一区二区| 黄色小视频大全| 国产精品福利影院| 9色在线视频| 一区二区三区在线播放欧美| 女人丝袜激情亚洲| 视频一区二区在线| 国产精品久久久久影视| yes4444视频在线观看| 中文字幕亚洲一区二区三区| 深爱激情综合网| 亚洲一区高清| 亚洲成人精品影院| 影视一区二区三区| 亚洲自拍欧美另类| 91麻豆视频网站| 日本中文在线| 午夜免费久久久久| 日本亚洲最大的色成网站www| 久久久久久蜜桃一区二区| 欧美高清一级片在线| 日韩欧美中文字幕在线视频| 国产一区在线免费| 欧美高清在线一区| 免费在线你懂的| 欧美精品videos| 免费在线观看成人av| 成人免费淫片在线费观看| 欧美一区二区三区四区久久| 亚洲区小说区图片区qvod按摩| 亚洲mv在线看| 一区二区三区在线观看网站| 美女精品导航| 91久久久亚洲精品| 91美女片黄在线观看91美女| fc2ppv国产精品久久| 国产精品高清在线观看| a亚洲天堂av| 手机电影在线观看| 91精品久久久久久久久不口人| 97久久超碰精品国产| 特级毛片在线| caoporn国产精品免费公开| 国产丝袜美腿一区二区三区| 91精品国产91久久久久久青草| 国产福利精品av综合导导航| 99久久婷婷国产综合精品| 在线视频观看国产| av免费观看久久| 亚洲精品视频一区二区| 电影网一区二区| 久久一区二区三区欧美亚洲| 一区二区三区在线免费播放| 伊人久久大香| 日本免费成人网| 日韩一区二区在线看片| 综合天堂av久久久久久久| 亚洲天堂网一区| 色婷婷**av毛片一区| 另类小说欧美激情| 婷婷色在线播放| 好看的日韩精品| 日韩欧美在线看| 日韩av在线中文字幕| 黄色春季福利在线看| 97在线视频免费观看| 欧美黄色小说| 大胆人体色综合| 成人综合在线网站| 欧洲一区精品| 日韩妆和欧美的一区二区| 欧美日韩午夜激情| **女人18毛片一区二区| 中文在线三区| 国产精品久久久久久久久粉嫩av| 亚洲国产精品成人综合色在线婷婷| 国产成人毛片| 中文字幕在线中文| 亚洲男人天堂网| 成熟亚洲日本毛茸茸凸凹| 久久久人成影片一区二区三区在哪下载| 先锋影音亚洲资源| 日韩免费观看高清完整版| 欧美专区一区二区三区| 黄色的网站在线观看| 欧美精品一区在线| 欧美mv日韩mv| 奇米一区二区三区| 亚洲性色av| 免费网站永久免费观看| 日韩在线观看免费高清完整版| 99久久99久久精品免费看蜜桃 | 开心激情综合| 免费成年网站| 成人深夜直播免费观看| 91成人免费在线| 国产欧美日韩综合一区在线播放| 国内外激情在线| 日韩人妻精品一区二区三区| 中文在线不卡视频| 国产精品国产三级国产aⅴ原创| 欧美变态网站| 深夜福利视频在线免费观看| 韩国一区二区三区美女美女秀| 日韩免费看网站| 国产.欧美.日韩| 香蕉久久精品日日躁夜夜躁| 桃乃木かなav在线播放| 蜜桃视频在线观看成人| 亚洲午夜小视频| 成人免费一区二区三区在线观看 | 国产污污在线观看| 久久婷婷人人澡人人喊人人爽| 日韩精品免费观看| 欧美国产日本视频| 手机福利视频欧美| 国产精品专区h在线观看| 制服视频三区第一页精品| 国产麻豆日韩欧美久久| 国产成人精品亚洲线观看| 网址你懂得在线观看| 日本日本精品二区免费| xxxx欧美18另类的高清| 综合在线观看色| 免费中文字幕日韩欧美| 精品一区二区三区四区五区 | 国产精品乱码一区二三区小蝌蚪| 999视频精品| 欧产日产国产精品视频| 男女午夜网站| 欧美一二三四五区| 午夜精品视频网站| 欧美一区二区三区喷汁尤物| 2欧美一区二区三区在线观看视频| 国产二区精品| 成人在线中文| 成年午夜在线| 欧美丰满熟妇bbbbbb百度| 国产精品网红直播| 亚洲性xxxx| 欧美亚洲自拍偷拍| 欧美高清在线精品一区| 日本色综合中文字幕| 欧州一区二区| 成人在线黄色|