大三下3.多核编程.pptxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
6.2.4 OpenMP线程同步;数据竞争;互斥锁机制;互斥锁机制——临界区(6-12);;临界区实例(6-12-0);互斥锁机制——原子操作;在C/C++语言中可能的原子操作 : “+ * - / ^ | ” 注意: 当对一个数据进行原子操作保护的时候,就不能对数据进行临界区的保护; 在针对同一个内存单元使用原子操作的时候需要在程序的所有涉及到的部位都加入原子操作的支持。;;OpenMP运行时库函数的互斥锁支持;OpenMP运行时库函数的互斥锁函数;程序实例6-14;void dec_counter( ) { printf(thread id=%d\n,omp_get_thread_num()); for(int i=0;i1000;i++) { omp_set_nest_lock(lock); counter- -; omp_unset_nest_lock(lock); } } ;int_tmain (int argc, _TCHAR*argv[ ]) { omp_init_nest_lock(lock); #pragma omp parallel sections { #pragma omp section inc_counter ( ); // ① #pragma omp section dec_counter ( ); // ② } omp_destroy_nest_lock (lock); printf(“counter=%d\n”,counter); };事件同步机制;事件同步——隐含的同步屏障 (6-15);事件同步——明确的同步屏障(6-16);;;事件同步——循环并行化中的顺序语句;6-17;6.3 OpenMP多线程应用程序性能分析;编写OpenMP程序时需要考虑的程序优化的一些方面的问题 OpenMP本身的开销——OpenMP多线程并行化需要一定的程序库的支持。在这些运行时库对程序并行加速的同时库中代码的运行必然会带来一定的开销。 负载均衡——使用OpenMP进行并行程序编码要非常注意使得线程之间的负载均衡,能够让多个线程在大致相同的时间内完成工作,从而能够提高程序运行的效率。 局部性——在程序运行过程中,高速缓存将缓存最近刚刚访问过的数据以及这些数据相邻的数据。因此,需要考虑到高速缓存的作用,有意地运用这种局部性带来的高速缓存的效率提高。 线程同步带来的开销——多个线程在进行同步的时候必然带来一定的同步开销,在使用多线程进行开发时需要考虑同步的必要性,消除不必要的同步,或者调整同步的顺序,就有可能带来性能上的提升。 ;OpenMP程序性能分析实例;性能分析实例(6-18);并行化带来的额外负担: __int64 sum=0; #pragma omp parallel for reduction(+:sum) for(int i=0;i10000;i++) sum+=i; ------------------------------------------------------------------ __int64 sum=0; for(int i=0;i10000;i++) sum+=i; ;负载均衡: #pragma omp parallel for for(int i=0;i100;i++) if (i50) smallwork() else bigwork(); ----------------------------------------------------------- #pragma omp parallel for for(int i=0;i100;i++) if (i%2) smallwork() else bigwork();;同步的开销: __int64 sum=0; for(int i=0;i++) sum+=i; ------------------------------------------------------------------ __int64 sum=0; #pragma omp parallel for for(int i=0;i++) #p

文档评论(0)

183****7931 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档