欢迎光临散文网 会员登陆 & 注册

自编教材分享:第九章—避免隐式同步

2023-12-12 09:14 作者:先进编译实验室  | 我要投稿


避免隐式同步

分析隐式同步

OpenMP中有显式和隐式两种同步方式,使用指导语句#pragma omp barrier是进行显式同步的一种方式,其不需要对任何代码进行修饰,而是要求并行区内所有线程都执行到该指导语句处,才能继续执行后续代码。

而隐式同步是指执行parallel、for、sections等指导语句时,并行代码的结束处会自动添加一个同步点以进行隐式的线程同步,以保证程序执行结果的正确性。

打印结果: 

消除隐式同步

并行程序并不总是需要同步,有时后续的任务不需要等待前面任务的完成,此时如果存在隐式同步则会浪费线程资源。为了让先完成计算任务的线程继续工作,可使用nowait子句消除隐式同步。

使用线程同步时,线程组中的部分线程在完成计算任务后并不能立即向下执行,需要等待线程组内的所有线程执行完毕后才可继续执行,如此一来增加了程序的执行时间,并行区的执行时间将取决于执行时间最长的线程。在保证程序正确性的前提下,可以使用OpenMP提供的nowait指导语句消除隐式同步,当面对不同大小的任务分块时,利用nowait指导语句可以让任务量小的线程进一步去完成其它的任务,提升线程的利用率的同时,降低了程序的运行时间。

使用线程同步时,线程组中的部分线程在完成计算任务后并不能立即向下执行,需要等待线程组内的所有线程执行完毕后才可继续执行,如此一来增加了程序的执行时间,并行区的执行时间将取决于执行时间最长的线程。在保证程序正确性的前提下,可以使用OpenMP提供的nowait指导语句消除隐式同步,当面对不同大小的任务分块时,利用nowait指导语句可以让任务量小的线程进一步去完成其它的任务,提升线程的利用率的同时,降低了程序的运行时间。

nowait子句的使用不是无条件的,需要在保证程序正确性的前提下才能使用。

上边的程序的结果是正确的。原因是:

1、使用默认的静态调度策略

2、计算和求和这两个循环有相同的迭代次数

3、循环绑定到同一个并行区

 


自编教材分享:第九章—避免隐式同步的评论 (共 条)

分享到微博请遵守国家法律