18.2.13. shmem_barrier
shmem_barrier - 在处理器元素(PEs)的子集上执行屏障操作。
18.2.13.1. 概述
C或C++:
#include <mpp/shmem.h>
void shmem_barrier(int PE_start, int logPE_stride, int PE_size,
long *pSync)
Fortran语言:
INCLUDE "mpp/shmem.fh"
INTEGER PE_start, logPE_stride, PE_size
INTEGER pSync(SHMEM_BARRIER_SYNC_SIZE)
CALL SHMEM_BARRIER(PE_start, logPE_stride, PE_size, pSync)
18.2.13.2. 描述
shmem_barrier 例程不会返回,直到由 PE_start、logPE_stride 和 PE_size 指定的PE子集在执行路径的同一位置进入该例程。
与所有SHMEM集合例程一样,这些例程都假定只有活动集中的PE会调用该例程。如果不在活动集中的PE调用了SHMEM集合例程,将导致未定义行为。
参数如下:
- PE_start
活动PE集合中的最低虚拟PE编号。PE_start必须为整数类型。如果使用Fortran,则必须为默认整数值。
- logPE_stride
活动集中连续虚拟PE编号之间跨度的对数(以2为底)。logPE_stride必须是整数类型。如果使用Fortran,则必须为默认整数值。
- PE_size
活动集中的PE数量。PE_size必须为整数类型。如果使用Fortran,它必须是一个默认的整数值。
- pSync
一个对称工作数组。在C/C++中,pSync必须是int类型且大小为_SHMEM_BARRIER_SYNC_SIZE。在Fortran中,pSync必须是integer类型且大小为SHMEM_BARRIER_SYNC_SIZE。如果使用Fortran,它必须是默认的整数类型。在活动集中的任何PE首次进入shmem_barrier之前,该数组的每个元素都必须初始化为0。
参数PE_start、logPE_stride和PE_size的值必须在活动集中所有PE上保持一致。相同的工作数组pSync必须传递给活动集中的所有PE。
shmem_barrier 确保在返回之前,活动集中所有PE(处理单元)先前发出的本地存储操作和通过SHMEM调用(例如shmem_put(3))完成的远程内存更新操作都已执行完毕。
如果使用相同的活动PE集,可以在连续调用shmem_barrier时重复使用相同的pSync数组。
18.2.13.3. 注意事项
术语“对称”在intro_shmem(3)中有定义。
如果在运行时初始化pSync数组,务必在首次调用shmem_barrier之前使用某种同步机制,例如调用shmem_barrier_all(3)。
如果活动集未发生变化,可以重复使用相同的pSync数组调用shmem_barrier。在这种情况下,除了shmem_barrier本身隐含的同步外,不需要额外的同步操作。
18.2.13.4. 示例
C/C++ 示例:
shmem_barrier(PE_start, logPE_stride, size, pSync);
Fortran 示例:
INTEGER PSYNC(SHMEM_BARRIER_SYNC_SIZE)
INTEGER PE_START, LOGPE_STRIDE, PE_SIZE, PSYNC
DATA PSYNC /SHMEM_BARRIER_SYNC_SIZE*0/
CALL SHMEM_BARRIER(PE_START, LOGPE_STRIDE, PE_SIZE, PSYNC)
另请参阅
intro_shmem(3) shmem_barrier_all(3)