日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
OpenMP創(chuàng)建線程中的鎖及原子操作性能比較

在多核CPU中鎖競爭到底會造成性能怎樣的下降呢?相信這是許多人想了解的,因此特地寫了一個測試程序來測試原子操作,windows CriticalSection, OpenMP的鎖操作函數(shù)在多核CPU中的性能。

創(chuàng)新互聯(lián)建站專注于企業(yè)網(wǎng)絡(luò)營銷推廣、網(wǎng)站重做改版、巢湖網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5開發(fā)、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為巢湖等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

原子操作選用InterlockedIncrement來進(jìn)行測試,

對每種鎖和原子操作,都測試在單任務(wù)執(zhí)行和多任務(wù)執(zhí)行2000000次加鎖解鎖操作所消耗的時間。

測試的詳細(xì)代碼見后面。

測試機(jī)器環(huán)境: Intel 2.66G 雙核CPU 機(jī)器一臺

測試運行結(jié)果如下:

SingleThread, InterlockedIncrement 2,000,000: a = 2000000, time = 78

MultiThread, InterlockedIncrement 2,000,000: a = 2000000, time = 156

SingleThread, Critical_Section 2,000,000:a = 2000000, time = 172

MultiThread, Critical_Section, 2,000,000:a = 2000000, time = 3156

SingleThread,omp_lock 2,000,000:a = 2000000, time = 250

MultiThread,omp_lock 2,000,000:a = 2000000, time = 1063

在單任務(wù)運行情況下,所消耗的時間如下:

原子操作                 78ms

Windows CriticalSection 172ms

OpenMP 的lock操作        250ms

因此從單任務(wù)情況來看,原子操作最快,Windows CriticalSection次之,OpenMP庫帶的鎖最慢,但這幾種操作的時間差距不是很大,用鎖操作比原子操作慢了2~3倍左右。

在多個任務(wù)運行的情況下,所消耗的時間如下:

原子操作                 156ms

Windows CriticalSection 3156ms

OpenMP 的lock操作        1063ms

在多任務(wù)運行情況下,情況發(fā)生了意想不到的變化,原子操作時間比單任務(wù)操作時慢了一倍,在兩個CPU上運行比在單個CPU上運行還慢一倍,真是難以想象,估計是任務(wù)切換開銷造成的。

Windows CriticalSection則更離譜了,居然花了3156ms,是單任務(wù)運行時的18倍多的時間,慢得簡直無法想象。

OpenMP的lock操作比Windows CriticalSection稍微好一些,但也花了1063ms,是單任務(wù)時的7倍左右。

由此可以知道,在多核CPU的多任務(wù)環(huán)境中,原子操作是最快的,而OpenMP次之,Windows CriticalSection則最慢。

同時從這些鎖在單任務(wù)和多任務(wù)下的性能差距可以看出,,多核CPU上的編程和以往的單核多任務(wù)編程會有很大的區(qū)別。

需要說明的是,本測試是一種極端情況下的測試,鎖住的操作只是一個簡單的加1操作,并且鎖競爭次數(shù)達(dá)200萬次之多,在實際情況中,一由于任務(wù)中還有很多不需要加鎖的代碼在運行,實際情況中的性能會比本測試的性能好很多。

測試代碼如下:

 
 
 
  1. // TestLock.cpp : OpenMP任務(wù)中的原子操作和鎖性能測試程序。 
  2. // 
  3.   
  4. #include  
  5. #include  
  6. #include  
  7. #include  
  8. #include  
  9.   
  10. void TestAtomic() 
  11.      clock_t t1,t2; 
  12.      int      i = 0; 
  13.      volatile LONG      a = 0; 
  14.   
  15.      t1 = clock(); 
  16.   
  17.      for( i = 0; i < 2000000; i++ ) 
  18.      { 
  19.          InterlockedIncrement( &a); 
  20.      } 
  21.      
  22.      t2 = clock(); 
  23.      printf("SingleThread, InterlockedIncrement 2,000,000: a = %ld, time = %ld/n", a, t2-t1); 
  24.   
  25.      t1 = clock(); 
  26.   
  27. #pragma omp parallel for 
  28.      for( i = 0; i < 2000000; i++ ) 
  29.      { 
  30.          InterlockedIncrement( &a); 
  31.      } 
  32.      
  33.      t2 = clock(); 
  34.      printf("MultiThread, InterlockedIncrement 2,000,000: a = %ld, time = %ld/n", a, t2-t1); 
  35.   
  36. void TestOmpLock() 
  37.      clock_t t1,t2; 
  38.      int i; 
  39.      int a = 0; 
  40.      omp_lock_t    mylock; 
  41.   
  42.      omp_init_lock(&mylock); 
  43.   
  44.      t1 = clock(); 
  45.   
  46.      for( i = 0; i < 2000000; i++ ) 
  47.      { 
  48.          omp_set_lock(&mylock); 
  49.          a+=1; 
  50.          omp_unset_lock(&mylock); 
  51.      } 
  52.      t2 = clock(); 
  53.      
  54.      printf("SingleThread,omp_lock 2,000,000:a = %ld, time = %ld/n", a, t2-t1); 
  55.   
  56.      t1 = clock(); 
  57.   
  58. #pragma omp parallel for 
  59.      for( i = 0; i < 2000000; i++ ) 
  60.      { 
  61.          omp_set_lock(&mylock); 
  62.          a+=1; 
  63.          omp_unset_lock(&mylock); 
  64.      } 
  65.      t2 = clock(); 
  66.      
  67.      printf("MultiThread,omp_lock 2,000,000:a = %ld, time = %ld/n", a, t2-t1); 
  68.   
  69.      omp_destroy_lock(&mylock); 
  70.   
  71.   
  72.   
  73. void TestCriticalSection() 
  74.      clock_t t1,t2; 
  75.      int i; 
  76.      int a = 0; 
  77.      CRITICAL_SECTION   cs; 
  78.   
  79.      InitializeCriticalSection(&cs); 
  80.   
  81.      t1 = clock(); 
  82.   
  83.      for( i = 0; i < 2000000; i++ ) 
  84.      { 
  85.          EnterCriticalSection(&cs); 
  86.          a+=1; 
  87.          LeaveCriticalSection(&cs); 
  88.      } 
  89.      t2 = clock(); 
  90.   
  91.      printf("SingleThread, Critical_Section 2,000,000:a = %ld, time = %ld/n", a, t2-t1); 
  92.   
  93.      t1 = clock(); 
  94.   
  95. #pragma omp parallel for 
  96.      for( i = 0; i < 2000000; i++ ) 
  97.      { 
  98.          EnterCriticalSection(&cs); 
  99.          a+=1; 
  100.          LeaveCriticalSection(&cs); 
  101.      } 
  102.      t2 = clock(); 
  103.   
  104.      printf("MultiThread, Critical_Section, 2,000,000:a = %ld, time = %ld/n", a, t2-t1); 
  105.   
  106.      DeleteCriticalSection(&cs); 
  107.   
  108.   
  109. int main(int argc, char* argv[]) 
  110.   
  111.      TestAtomic(); 
  112.      TestCriticalSection(); 
  113.      TestOmpLock(); 
  114.   
  115.      return 0; 

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


網(wǎng)站標(biāo)題:OpenMP創(chuàng)建線程中的鎖及原子操作性能比較
文章轉(zhuǎn)載:http://www.dlmjj.cn/article/dpoosoe.html