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



避免隐式同步
分析隐式同步
OpenMP中有显式和隐式两种同步方式,使用指导语句#pragma omp barrier是进行显式同步的一种方式,其不需要对任何代码进行修饰,而是要求并行区内所有线程都执行到该指导语句处,才能继续执行后续代码。
而隐式同步是指执行parallel、for、sections等指导语句时,并行代码的结束处会自动添加一个同步点以进行隐式的线程同步,以保证程序执行结果的正确性。
打印结果:
消除隐式同步
并行程序并不总是需要同步,有时后续的任务不需要等待前面任务的完成,此时如果存在隐式同步则会浪费线程资源。为了让先完成计算任务的线程继续工作,可使用nowait子句消除隐式同步。
使用线程同步时,线程组中的部分线程在完成计算任务后并不能立即向下执行,需要等待线程组内的所有线程执行完毕后才可继续执行,如此一来增加了程序的执行时间,并行区的执行时间将取决于执行时间最长的线程。在保证程序正确性的前提下,可以使用OpenMP提供的nowait指导语句消除隐式同步,当面对不同大小的任务分块时,利用nowait指导语句可以让任务量小的线程进一步去完成其它的任务,提升线程的利用率的同时,降低了程序的运行时间。
使用线程同步时,线程组中的部分线程在完成计算任务后并不能立即向下执行,需要等待线程组内的所有线程执行完毕后才可继续执行,如此一来增加了程序的执行时间,并行区的执行时间将取决于执行时间最长的线程。在保证程序正确性的前提下,可以使用OpenMP提供的nowait指导语句消除隐式同步,当面对不同大小的任务分块时,利用nowait指导语句可以让任务量小的线程进一步去完成其它的任务,提升线程的利用率的同时,降低了程序的运行时间。
nowait子句的使用不是无条件的,需要在保证程序正确性的前提下才能使用。
上边的程序的结果是正确的。原因是:
1、使用默认的静态调度策略
2、计算和求和这两个循环有相同的迭代次数
3、循环绑定到同一个并行区
