自編教材分享:第九章—避免隱式同步



避免隱式同步
分析隱式同步
OpenMP中有顯式和隱式兩種同步方式,使用指導(dǎo)語(yǔ)句#pragma omp barrier是進(jìn)行顯式同步的一種方式,其不需要對(duì)任何代碼進(jìn)行修飾,而是要求并行區(qū)內(nèi)所有線(xiàn)程都執(zhí)行到該指導(dǎo)語(yǔ)句處,才能繼續(xù)執(zhí)行后續(xù)代碼。
而隱式同步是指執(zhí)行parallel、for、sections等指導(dǎo)語(yǔ)句時(shí),并行代碼的結(jié)束處會(huì)自動(dòng)添加一個(gè)同步點(diǎn)以進(jìn)行隱式的線(xiàn)程同步,以保證程序執(zhí)行結(jié)果的正確性。
打印結(jié)果:?
消除隱式同步
并行程序并不總是需要同步,有時(shí)后續(xù)的任務(wù)不需要等待前面任務(wù)的完成,此時(shí)如果存在隱式同步則會(huì)浪費(fèi)線(xiàn)程資源。為了讓先完成計(jì)算任務(wù)的線(xiàn)程繼續(xù)工作,可使用nowait子句消除隱式同步。
使用線(xiàn)程同步時(shí),線(xiàn)程組中的部分線(xiàn)程在完成計(jì)算任務(wù)后并不能立即向下執(zhí)行,需要等待線(xiàn)程組內(nèi)的所有線(xiàn)程執(zhí)行完畢后才可繼續(xù)執(zhí)行,如此一來(lái)增加了程序的執(zhí)行時(shí)間,并行區(qū)的執(zhí)行時(shí)間將取決于執(zhí)行時(shí)間最長(zhǎng)的線(xiàn)程。在保證程序正確性的前提下,可以使用OpenMP提供的nowait指導(dǎo)語(yǔ)句消除隱式同步,當(dāng)面對(duì)不同大小的任務(wù)分塊時(shí),利用nowait指導(dǎo)語(yǔ)句可以讓任務(wù)量小的線(xiàn)程進(jìn)一步去完成其它的任務(wù),提升線(xiàn)程的利用率的同時(shí),降低了程序的運(yùn)行時(shí)間。
使用線(xiàn)程同步時(shí),線(xiàn)程組中的部分線(xiàn)程在完成計(jì)算任務(wù)后并不能立即向下執(zhí)行,需要等待線(xiàn)程組內(nèi)的所有線(xiàn)程執(zhí)行完畢后才可繼續(xù)執(zhí)行,如此一來(lái)增加了程序的執(zhí)行時(shí)間,并行區(qū)的執(zhí)行時(shí)間將取決于執(zhí)行時(shí)間最長(zhǎng)的線(xiàn)程。在保證程序正確性的前提下,可以使用OpenMP提供的nowait指導(dǎo)語(yǔ)句消除隱式同步,當(dāng)面對(duì)不同大小的任務(wù)分塊時(shí),利用nowait指導(dǎo)語(yǔ)句可以讓任務(wù)量小的線(xiàn)程進(jìn)一步去完成其它的任務(wù),提升線(xiàn)程的利用率的同時(shí),降低了程序的運(yùn)行時(shí)間。
nowait子句的使用不是無(wú)條件的,需要在保證程序正確性的前提下才能使用。
上邊的程序的結(jié)果是正確的。原因是:
1、使用默認(rèn)的靜態(tài)調(diào)度策略
2、計(jì)算和求和這兩個(gè)循環(huán)有相同的迭代次數(shù)
3、循環(huán)綁定到同一個(gè)并行區(qū)
?
