在多核CPU中锁竞争到底会造成性能怎样的下降呢?相信这是许多人想了解的,因此特地写了一个测试程序来测试原子操作,windows CriticalSection, OpenMP的锁操作函数在多核CPU中的性能。
创新互联建站专注于企业网络营销推广、网站重做改版、巢湖网站定制设计、自适应品牌网站建设、H5开发、商城网站建设、集团公司官网建设、外贸营销网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为巢湖等各大城市提供网站开发制作服务。
原子操作选用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;
- }
原文链接:http://blog.csdn.net/drzhouweiming/article/details/1689853
新闻名称:OpenMP创建线程中的锁及原子操作性能比较
网页网址:http://www.csdahua.cn/qtweb/news5/491755.html
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网