博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenMP创建线程中的锁及原子操作性能比较
阅读量:4190 次
发布时间:2019-05-26

本文共 3196 字,大约阅读时间需要 10 分钟。

 

OpenMP
创建线程中的锁及原子操作性能比较
 
相关文档连接:
            
 
 
             
 
在多核 CPU中锁竞争到底会造成性能怎样的下降呢?相信这是许多人想了解的,因此特地写了一个测试程序来测试原子操作,windows CriticalSection, OpenMP的锁操作函数在多核CPU中的性能。
 
原子操作选用 InterlockedIncrement来进行测试,
对每种锁和原子操作,都测试在单任务执行和多任务执行 2000000次加锁解锁操作所消耗的时间。
测试的详细代码见后面。
 
测试机器环境: Intel 2.66G 双核CPU 机器一台
 
测试运行结果如下:
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
 
在单任务运行情况下,所消耗的时间如下:
原子操作                 78ms
Windows CriticalSection 172ms
OpenMP
的lock操作        250ms
 
因此从单任务情况来看,原子操作最快, Windows CriticalSection次之,OpenMP库带的锁最慢,但这几种操作的时间差距不是很大,用锁操作比原子操作慢了2~3倍左右。
 
在多个任务运行的情况下,所消耗的时间如下:
 
原子操作                 156ms
Windows CriticalSection 3156ms
OpenMP
的lock操作        1063ms
 
在多任务运行情况下,情况发生了意想不到的变化,原子操作时间比单任务操作时慢了一倍,在两个 CPU上运行比在单个CPU上运行还慢一倍,真是难以想象,估计是任务切换开销造成的。
Windows CriticalSection则更离谱了,居然花了 3156ms,是单任务运行时的18倍多的时间,慢得简直无法想象。
OpenMP的 lock操作比Windows CriticalSection稍微好一些,但也花了1063ms,是单任务时的7倍左右。
 
由此可以知道,在多核 CPU的多任务环境中,原子操作是最快的,而OpenMP次之,Windows CriticalSection则最慢。
 
同时从这些锁在单任务和多任务下的性能差距可以看出,,多核 CPU上的编程和以往的单核多任务编程会有很大的区别。
需要说明的是,本测试是一种极端情况下的测试,锁住的操作只是一个简单的加1操作,并且锁竞争次数达200万次之多,在实际情况中,一由于任务中还有很多不需要加锁的代码在运行,实际情况中的性能会比本测试的性能好很多。
 
 
测试代码如下:
 
// TestLock.cpp : OpenMP
任务中的原子操作和锁性能测试程序。
//
 
#include
#include
#include
#include
#include
 
void
TestAtomic()
{
     clock_t t1,t2;
     int      i = 0;
     volatile LONG      a = 0;
 
     t1 = clock();
 
     for( i = 0; i < 2000000; i++ )
     {
         InterlockedIncrement( &a);
     }
    
     t2 = clock();
     printf("SingleThread, InterlockedIncrement 2,000,000: a = %ld, time = %ld/n", a, t2-t1);
 
     t1 = clock();
 
#pragma
omp parallel for
     for( i = 0; i < 2000000; i++ )
     {
         InterlockedIncrement( &a);
     }
    
     t2 = clock();
     printf("MultiThread, InterlockedIncrement 2,000,000: a = %ld, time = %ld/n", a, t2-t1);
}
 
void
TestOmpLock()
{
     clock_t t1,t2;
     int i;
     int a = 0;
     omp_lock_t    mylock;
 
     omp_init_lock(&mylock);
 
     t1 = clock();
 
     for( i = 0; i < 2000000; i++ )
     {
         omp_set_lock(&mylock);
         a+=1;
         omp_unset_lock(&mylock);
     }
     t2 = clock();
    
     printf("SingleThread,omp_lock 2,000,000:a = %ld, time = %ld/n", a, t2-t1);
 
     t1 = clock();
 
#pragma
omp parallel for
     for( i = 0; i < 2000000; i++ )
     {
         omp_set_lock(&mylock);
         a+=1;
         omp_unset_lock(&mylock);
     }
     t2 = clock();
    
     printf("MultiThread,omp_lock 2,000,000:a = %ld, time = %ld/n", a, t2-t1);
 
     omp_destroy_lock(&mylock);
}
 
 
 
void
TestCriticalSection()
{
     clock_t t1,t2;
     int i;
     int a = 0;
     CRITICAL_SECTION   cs;
 
     InitializeCriticalSection(&cs);
 
     t1 = clock();
 
     for( i = 0; i < 2000000; i++ )
     {
         EnterCriticalSection(&cs);
         a+=1;
         LeaveCriticalSection(&cs);
     }
     t2 = clock();
 
     printf("SingleThread, Critical_Section 2,000,000:a = %ld, time = %ld/n", a, t2-t1);
 
     t1 = clock();
 
#pragma
omp parallel for
     for( i = 0; i < 2000000; i++ )
     {
         EnterCriticalSection(&cs);
         a+=1;
         LeaveCriticalSection(&cs);
     }
     t2 = clock();
 
     printf("MultiThread, Critical_Section, 2,000,000:a = %ld, time = %ld/n", a, t2-t1);
 
     DeleteCriticalSection(&cs);
 
}
 
int
main(int argc, char* argv[])
{
 
     TestAtomic();
     TestCriticalSection();
     TestOmpLock();
 
     return 0;
}
 
 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1689853

你可能感兴趣的文章
优信退市“倒计时”
查看>>
苹果秋季新品发布会终于官宣:然而并不会发布新iPhone?
查看>>
“浪姐”万茜盗号事件是锅传锅?阿里、网易都来回应了
查看>>
上海消保委评饿了么“多等5分钟”功能:逻辑上有问题
查看>>
Android 11正式发布:小米、OPPO等手机将陆续更新
查看>>
微信又上线新功能,能让你更会聊天?
查看>>
饿了么“多等5分钟”后,美团外卖宣布给骑手留出8分钟...
查看>>
苹果公司反诉堡垒之夜开发商Epic,寻求惩罚性赔偿
查看>>
外媒称三星已对苹果折叠屏订单进行采样
查看>>
iPhone 12 Pro/Pro Max最新渲染图曝光
查看>>
李开复“口误”惹事,人脸隐私数据合作?蚂蚁、旷视大喊冤枉!
查看>>
模仿还是致敬?华为全新环绕屏手机酷似小米MIX Alpha
查看>>
国民神酒江小白为什么突然“消失”了?
查看>>
软银准备以超400亿美元向英伟达出售Arm,交易最快下周达成
查看>>
罗永浩吐槽卖小米、苹果被骂,卖华为也被骂,李楠:警惕键盘侠
查看>>
苹果CEO库克已接近退休年龄,下任CEO将是他?
查看>>
马斯克又吊大家胃口:9月22日电池日有众多亮点揭晓
查看>>
苹果修改应用商店规则:云游戏服务可上架 但游戏需从商店下载
查看>>
拼多多“官宣”iPhone 12:来得刚刚好 下周见!
查看>>
小米10T系列新机曝光:后置64MP三摄 辨识度超高
查看>>