OpenMP的三种线程与核绑定方式

之前看到OpenMP入门教程比较多,但是核绑定这部分比较少。把核绑定的语句先写在这里。

 /*omp的三种核绑定方式*/
 #pragma omp parallel proc_bind(master)
 #pragma omp parallel proc_bind(close)
 #pragma omp parallel proc_bind(spread)
 /*有些服务器只支持以下这种语句*/
 #pragma omp proc_bind(master)
 #pragma omp proc_bind(close)
 #pragma omp proc_bind(spread)

具体理解请移步:Oracle® Solaris Studio 12.4:OpenMP API 用户指南
或者OpenMP Application Programming Interface Examples
下面个人补充一些对于核绑定的理解

假设有一个处理器有4个核,共有两个处理器,核分别记为p0,p1,p2…p7

spread

这是一种比较稀疏、均匀的绑定方式。如果有M个线程,N个处理器,那么在并行线程开始时首先会从串行线程运行的那个核开始分布,每个核上运行M/N个线程。
如果串行线程在p1上运行,而并行线程有4个线程,则分别分布在
p1、p3、p5、p7。
如果如果串行线程在p0上运行,而并行线程有16个线程,则会分别分布在p0上有线程0和线程1,p1上运行线程2和线程3,p3上运行线程4和线程5,p4上运行线程6和线程7,…,p7上运行线程14和线程15。

close

这是一种紧密的绑定方式。这种方式优先分配与串行线程相临近的核。当并行线程数超过核数时,分配方式与spread相近。
如果串行线程在p1上运行,进入并行线程时有4个线程,则分别分布在p1,p2,p3,p4。

master

master的意思是继承串行线程部分的核绑定,即全部由运行串行线程的那个核来运行所有的线程。

你可能感兴趣的:(OpenMP)