18.2.208. shmem_short_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.208.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.208.2. 描述

shmem_waitshmem_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.208.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)