18.2.15. shmem_broadcast32
shmem_broadcast4(3), shmem_broadcast8(3), shmem_broadcast32(3), shmem_broadcast64(3) - 将数据对象从指定PE复制到活动集中所有其他PE的目标位置。
18.2.15.1. 概述
C或C++:
#include <mpp/shmem.h>
void shmem_broadcast32(void *target, const void *source,
size_t nelems, int PE_root, int PE_start, int logPE_stride,
int PE_size, long *pSync)
void shmem_broadcast64(void *target, const void *source,
size_t nelems, int PE_root, int PE_start, int logPE_stride,
int PE_size, long *pSync)
Fortran语言:
INCLUDE "mpp/shmem.fh"
INTEGER nelems, PE_root, PE_start, logPE_stride, PE_size
INTEGER pSync(SHMEM_BCAST_SYNC_SIZE)
CALL SHMEM_BROADCAST4(target, source, nelems, PE_root,
& PE_start, logPE_stride, PE_size, fIpSync)
CALL SHMEM_BROADCAST8(target, source, nelems, PE_root,
& PE_start, logPE_stride, PE_size, pSync)
CALL SHMEM_BROADCAST32(target, source, nelems,
& PE_root, PE_start, logPE_stride, PE_size, pSync)
CALL SHMEM_BROADCAST64(target, source, nelems,
& PE_root, PE_start, logPE_stride, PE_size, pSync)
18.2.15.2. 描述
广播例程将PE_root指定的处理单元(PE)中source地址的数据写入活动集合内所有其他PE的target地址。活动PE集合由三元组PE_start、logPE_stride和PE_size定义。数据不会被复制到PE_root指定的PE的target地址。在返回之前,广播例程确保pSync数组的元素恢复为其初始值。
与所有SHMEM集合例程一样,这些例程都假定只有活动集中的PE会调用该例程。如果不在活动集中的PE调用了SHMEM集合例程,将导致未定义行为。
参数如下:
- target
一个对称数据对象,具有以下数据类型之一:
- shmem_broadcast8, shmem_broadcast64: Any noncharacter type that
元素大小为64位。不允许使用Fortran派生类型或C/C++结构体。
- shmem_broadcast32: Any noncharacter type that has an element size
32位。不允许使用Fortran派生类型或C/C++结构。
- shmem_broadcast4: Any noncharacter type that has an element size
32位。
- source
一种对称数据对象,可以是目标参数允许的任何数据类型。
- nelems
源数据中的元素数量。对于shmem_broadcast32和shmem_broadcast4,这表示32位半字的数量。nelems必须是整数类型。如果使用Fortran,它必须是一个默认整数值。
- PE_root
数据复制来源的PE(相对于活动集)的从零开始的序号。必须大于或等于0且小于PE_size。PE_root必须为整数类型。如果使用Fortran,则必须为默认整数值。
- PE_start
活动PE集合中的最低虚拟PE编号。PE_start必须为整数类型。如果使用Fortran,则必须为默认整数值。
- logPE_stride
活动集中连续虚拟PE编号之间跨度的对数(以2为底)。log_PE_stride必须是整数类型。如果使用Fortran,则必须是默认整数值。
- PE_size
活动集中的PE数量。PE_size必须为整数类型。如果使用Fortran,它必须是一个默认的整数值。
- pSync
一个对称的工作数组。在C/C++中,pSync必须是long类型且大小为_SHMEM_BCAST_SYNC_SIZE。在Fortran中,pSync必须是integer类型且大小为SHMEM_BCAST_SYNC_SIZE。在活动集中的任何PE进入shmem_barrier()之前,必须将该数组的每个元素初始化为_SHMEM_SYNC_VALUE(在C/C++中)或SHMEM_SYNC_VALUE(在Fortran中)。
参数PE_root、PE_start、logPE_stride和PE_size的值必须在活动集中的所有PE上保持一致。相同的目标和源数据对象以及相同的pSync工作数组必须传递给活动集中的所有PE。
在任何PE调用广播例程之前,必须确保满足以下条件(通常需要通过屏障或其他同步方法来实现):活动集中所有PE的pSync数组不能仍处于先前调用广播例程的使用状态。活动集中所有PE的目标数组必须准备好接收广播数据。
从广播例程返回后,对于本地PE来说,以下情况成立:如果当前PE不是根PE,则目标数据对象会被更新。pSync数组中的值将恢复为原始值。
18.2.15.3. 注意事项
术语"collective"和"symmetric"的定义见intro_shmem(3)。
所有SHMEM广播例程都会将pSync恢复为其原始内容。 对使用相同pSync数组的SHMEM例程进行多次调用时, 不需要在第一次调用后重新初始化pSync。
必须确保在任何一个PE参与处理SHMEM广播例程时,pSync数组不会被活动集中的任何PE更新。需特别注意避免以下情况:如果pSync数组在运行时初始化,需要某种同步机制来确保工作集中的所有PE在调用使用pSync同步数组的SHMEM例程之前都已初始化pSync。只有当活动集中没有任何PE仍在处理先前使用相同pSync数组的SHMEM广播例程调用时,才能在后续SHMEM广播例程中重复使用pSync数组。通常,这只能通过某种同步机制来保证。但在特殊情况下,如果使用相同活动集调用SHMEM例程,可以分配两个pSync数组并在连续调用中交替使用它们。
18.2.15.4. 示例
在以下示例中,调用shmem_broadcast64会将PE 4上的源数据复制到PE 5、6和7的目标位置。
C/C++ 示例:
for (i=0; i < _SHMEM_BCAST_SYNC_SIZE; i++) {
pSync[i] = _SHMEM_SYNC_VALUE;
}
shmem_barrier_all(); /* Wait for all PEs to initialize pSync */
shmem_broadcast64(target, source, nelems, 0, 4, 0, 4, pSync);
Fortran 示例:
INTEGER PSYNC(SHMEM_BCAST_SYNC_SIZE)
INTEGER TARGET, SOURCE, NELEMS, PE_ROOT, PE_START,
& LOGPE_STRIDE, PE_SIZE, PSYNC
COMMON /COM/ TARGET, SOURCE
DATA PSYNC /SHMEM_BCAST_SYNC_SIZE*SHMEM_SYNC_VALUE/
CALL SHMEM_BROADCAST64(TARGET, SOURCE, NELEMS, 0, 4, 0, 4,
& PSYNC)
另请参阅
intro_shmem(3)