千家信息网

OpenMP创建线程中的锁及原子操作性能分析

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章主要讲解了"OpenMP创建线程中的锁及原子操作性能分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"OpenMP创建线程中的锁及原子操作性能
千家信息网最后更新 2025年01月19日OpenMP创建线程中的锁及原子操作性能分析

这篇文章主要讲解了"OpenMP创建线程中的锁及原子操作性能分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"OpenMP创建线程中的锁及原子操作性能分析"吧!

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

感谢各位的阅读,以上就是"OpenMP创建线程中的锁及原子操作性能分析"的内容了,经过本文的学习后,相信大家对OpenMP创建线程中的锁及原子操作性能分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

任务 原子 测试 性能 情况 运行 时间 性能分析 线程 分析 代码 多核 学习 消耗 很大 最快 内容 实际 差距 机器 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州互动软件开发 dell电脑从服务器安装系统 网络安全与信息安全研究生 2020网络安全周活动视频 智能网络技术开发工程师 网络安全剪影png素材 服务器主板设置里cpu节能 学生信息系统数据库语句 美国软件开发好找工作吗 邯郸定制软件开发公司 网络安全面板如何接线 免费空间带数据库 服务器连续10占有率第一 PC软件开发 知乎 对软件开发项目定位与目标 西安工商银行软件开发中心社招 网络数据库检索系统名词解释 组态王查询SQL数据库 奉贤区网络技术服务维护方法 安卓使用数据库模拟中英文词典 易学习网络技术有限公司 网络安全健康网络方式 湖南警察学院网络安全篮球赛 西南大学数据库技术大作业 软件开发文件设计 软件开发类项目自检报告书 享多多网络技术有限公司招聘 电子商务网络安全结构图 数据库int默认数据类型 宇泊网络技术是做什么的
0