18.2.134. shmem_long_wait
shmem_int_wait(3), shmem_int_wait(3)_until, shmem_int4_wait(3), shmem_int4_wait(3)_until, shmem_int8_wait(3), shmem_int8_wait(3)_until, shmem_long_wait(3), shmem_long_wait(3)_until, shmem_longlong_wait(3), shmem_longlong_wait(3)_until, shmem_short_wait(3), shmem_short_wait(3)_until, shmem_wait(3), shmem_wait(3)_until - 等待本地处理单元(PE)上的变量发生变化
18.2.134.1. 概述
C或C++:
#include <mpp/shmem.h>
void shmem_int_wait(volatile int *var, int value)
void shmem_int_wait_until(volatile int *var, int cond, int value)
void shmem_long_wait(volatile long *var, long value)
void shmem_long_wait_until(volatile long *var, int cond, long value)
void shmem_longlong_wait(volatile long long *var, long long value)
void shmem_longlong_wait_until(volatile long long *var, int cond,
long long value)
void shmem_short_wait(volatile short *var, short value)
void shmem_short_wait_until(volatile short *var, int cond,
short value)
void shmem_wait(volatile long *ivar, long cmp_value)
void shmem_wait_until(volatile long *ivar, int cmp, long value)
Fortran语言:
INCLUDE "mpp/shmem.fh"
CALL SHMEM_INT4_WAIT(ivar, cmp_value)
CALL SHMEM_INT4_WAIT_UNTIL(ivar, cmp, cmp_value)
CALL SHMEM_INT8_WAIT(ivar, cmp_value)
CALL SHMEM_INT8_WAIT_UNTIL(ivar, cmp, cmp_value)
CALL SHMEM_WAIT(ivar, cmp_value)
CALL SHMEM_WAIT_UNTIL(ivar, cmp, cmp_value)
18.2.134.2. 描述
shmem_wait 和 shmem_wait_until 会等待ivar被其他处理器通过远程写入或原子交换操作修改。这些例程可用于点对点的定向同步。调用shmem_wait会一直阻塞,直到其他处理器向等待处理器的ivar写入一个不等于cmp_value的值。调用shmem_wait_until会一直阻塞,直到其他处理器修改ivar使其满足cmp和cmp_value所隐含的条件。当某个处理器需要通知另一个处理器它已完成某项操作时,这种机制非常有用。
参数如下:
- target
远程可访问的整型数据对象,将在远程PE上进行更新。如果使用C/C++,目标类型应与SYNOPSIS部分隐含的类型匹配。如果使用Fortran编译器,则必须是整型,元素大小为4字节(对应SHMEM_INT4_ADD)或8字节(对应SHMEM_INT8_ADD)。
- value
需要原子性添加到目标的值。如果使用C/C++语言,该值的类型应与概述部分隐含的类型匹配。如果使用Fortran语言,则必须是整数类型且元素大小与目标一致。
- pe
一个整数,表示目标将被更新的PE编号。如果使用Fortran,它必须是一个默认的整数值。
- ivar
一个可远程访问的整型变量,正被另一个PE更新。如果使用C/C++,ivar的类型应与SYNOPSIS部分隐含的类型匹配。如果使用Fortran,根据所调用的函数,ivar必须是特定大小的整数类型,如下所示:
shmem_wait, shmem_wait_until:** 默认INTEGER
shmem_int4_wait, shmem_int4_wait_until: **INTEGER*4**
shmem_int8_wait, shmem_int8_wait_until: **INTEGER*8**
- cmp
比较运算符,用于将ivar与cmp_value进行比较。cmp必须为整数类型。如果使用Fortran,它必须是默认类型。如果使用C/C++,cmp的类型应与SYNOPSIS部分中隐含的类型匹配。支持以下cmp值:
- SHMEM_CMP_EQ
等于
- SHMEM_CMP_NE
不等于
- SHMEM_CMP_GT
大于
- SHMEM_CMP_LE
小于或等于
- SHMEM_CMP_LT
小于
- SHMEM_CMP_GE
大于或等于
- cmp_value
cmp_value必须是整数类型。如果使用C/C++语言,cmp_value的类型应与SYNOPSIS部分中隐含的类型匹配。如果使用Fortran语言,cmp_value必须是大小和种类与ivar相同的整数。shmem_wait例程会在ivar不再等于cmp_value时返回。shmem_wait_until例程会在比较条件为真时返回。比较条件由ivar参数与cmp_value通过比较运算符cmp进行定义。
18.2.134.3. 示例
示例1: 当变量ivar不等于100时,以下调用将返回:
INTEGER*8 IVAR
CALL SHMEM_INT8_WAIT(IVAR, INT8(100))
示例2:以下对SHMEM_INT8_WAIT_UNTIL的调用等同于示例1中对SHMEM_INT8_WAIT的调用:
INTEGER*8 IVAR
CALL SHMEM_INT8_WAIT_UNTIL(IVAR, SHMEM_CMP_NE, INT8(100))
示例3: 以下C/C++调用会等待,直到ivar中的符号位被远程PE的传输设置:
int ivar;
shmem_int_wait_until(&ivar, SHMEM_CMP_LT, 0);
示例4: 以下Fortran示例是在子程序上下文中的:
SUBROUTINE EXAMPLE()
INTEGER FLAG_VAR
COMMON/FLAG/FLAG_VAR
. . .
FLAG_VAR = FLAG_VALUE ! initialize the event variable
. . .
IF (FLAG_VAR .EQ. FLAG_VALUE) THEN
CALL SHMEM_WAIT(FLAG_VAR, FLAG_VALUE)
ENDIF
FLAG_VAR = FLAG_VALUE ! reset the event variable for next time
. . .
END
另请参阅
intro_shmem(3) shmem_put(3)