OpenMP多循环并行写法对比:多组parallel for vs 单parallel包含多个for
隐式屏障数量差异的原因
你之前的计算忽略了omp parallel构造本身末尾的隐式屏障:
- 结构1的每个
#pragma omp parallel for是「并行区域创建+工作共享循环」的组合语法,每个这样的指令对应两个隐式屏障:一个是omp for循环结束后的默认隐式屏障,另一个是整个并行区域销毁前的隐式屏障,N个循环总共有2N个隐式屏障。 - 结构2只创建1次并行区域,所有循环都在同一个并行区域内执行:每个
omp for结束后有1个隐式屏障,最后并行区域结束有1个隐式屏障,N个循环总共有N+1个隐式屏障。当N≥2时,结构2的隐式屏障数量明显更少。
你对执行顺序的理解是正确的:两种结构都是严格按顺序执行完循环1的所有迭代,再执行循环2,直到循环N结束,不会出现循环间乱序的情况。
结构2缓存复用效率更高的原因
结构2的线程组只创建一次,整个执行过程中每个线程都会绑定到固定的CPU核心运行:如果前一个循环加载到核心私有缓存(L1/L2)中的数据,在后序循环中还需要用到,同一个线程直接从本地缓存读取即可,不需要重新从主存拉取。
而结构1每次循环结束后都会销毁线程组,下一次循环再重新创建线程,新创建的线程很可能被操作系统调度到其他核心上,之前核心缓存的热数据无法复用,会出现更多缓存失效的情况,访存开销更高。
内容的提问来源于stack exchange,提问作者Tryer
相关产品推荐
相关产品推荐

