LAPI_Rmw 子例程

用途

提供数据同步原语。

可用性库 (liblapi_r.a)

C 语法

#include <lapi.h>
 
int LAPI_Rmw(hndl, op, tgt, tgt_var, in_val, prev_tgt_val, org_cntr)
 
lapi_handle_t hndl;
RMW_ops_t op;
uint tgt;
int *tgt_var;
int *in_val;
int *prev_tgt_val;
lapi_cntr_t *org_cntr;

FORTRAN 语法

include 'lapif.h'
 
LAPI_RMW(hndl, op, tgt, tgt_var, in_val, prev_tgt_val, org_cntr, ierror)
INTEGER hndl
INTEGER op
INTEGER tgt
INTEGER (KIND=LAPI_ADDR_TYPE) :: tgt_var
INTEGER in_val
INTEGER prev_tgt_val
TYPE (LAPI_CNTR_T) :: org_cntr
INTEGER ierror

描述

Type of call: 点到点通信 (非阻塞)

使用此子例程来同步两个独立的数据段,例如共享公共数据结构的两个任务。 该操作在目标任务 (tgt) 上执行,并且是原子操作。 该操作从源获取输入值 (In_val) ,并对目标 (哥特) 处的变量 (哥特瓦尔) 执行四个操作之一 (奥普) ,然后将目标变量 (哥特瓦尔) 替换为操作结果 (奥普)。 目标变量 (tgt_var) 的原始值 (prev_tgt_val) 将返回到源。

这些操作 (op) 是在 hndl所引用的上下文上执行的。 执行这些调用的结果就像以原子方式执行了以下代码一样:

*prev_tgt_val = *tgt_var;
*tgt_var      = f(*tgt_var, *in_val);

其中:

f (a , b) = FETCH_AND_ADD 的 a + b

f (a , b) = a | b 表示 FETCH_AND_OR (按位或)

f (a , b) = b 表示 SWAP

对于 COMPARE_AND_SWAPin_val 被视为指向两个整数的数组的指针。 op 是以下原子操作:

 if(*tgt_var == in_val[0]) {
   *prev_tgt_val = TRUE;
   *tgt_var      = in_val[1];
} else {
   *prev_tgt_val = FALSE;
}

所有 LAPI_Rmw 调用都是非分块调用。 要测试完成情况,请使用 LAPI_GetcntrLAPI_Waitcntr 子例程。 LAPI_Rmw 不包含目标计数器 (tgt_cntr) ,因此 LAPI_Rmw 调用不会在目标任务 (tgt) 上提供任何完成指示。

参数

INPUT
hndl
指定 LAPI 句柄。
操作
指定要执行的操作。 有效操作包括:
  • COMPARE_AND_SWAP
  • FETCH_AND_ADD
  • FETCH_AND_OR
  • SWAP
tgt
指定 read-modify-write (Rmw) 变量所在的目标任务的任务标识。 The value of this parameter must be in the range 0 <= 哥特 < NUM_TASKS.
tgt_var
指定目标 read-modify-write (Rmw) 变量 (在 FORTRAN 中) 或其地址 (在 C 中)。 此参数的值不能为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中)。
in_val
指定传入操作的值 (op)。 此值不能为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中)。
输入/输出
预安装 (prev_tgt_val)
指定在执行操作 (op) 之前存储目标任务上的先前 tgt_var 的源位置。 此参数的值可以是 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中)。
org_cntr
指定源计数器地址 (C) 或源计数器 (FORTRAN)。 如果设置了 prev_tgt_val , 当 prev_tgt_val 返回到源端时,源计数器 (org_cntr) 将递增。 如果未设置 prev_tgt_val , 在目标端完成操作 (op) 后,将更新源计数器 (org_cntr)。
输出
ierror
指定 FORTRAN 返回码。 这始终是最后一个参数。

限制

对于共享内存通信和数据传输,或者对于任务发送到自身的消息, 不会 报告 LAPI 统计信息。

C 示例

  1. 要在两个任务 (使用 FETCH_AND_ADD) 之间同步数据值,请执行以下操作:
    {
    
           int local_var;
           int *addr_list;
    
           /* both tasks initialize local_var to a value       */
    
           /* local_var addresses are exchanged and stored     */
           /* in addr_list (using LAPI_Address_init).          */
           /* addr_list[tgt] now contains the address of       */
           /* local_var on tgt                                 */
           .
           .
           .
           /* add value to local_var on some task               */
    
           /* use LAPI to add value to local_var on remote task */
           LAPI_Rmw(hndl, FETCH_AND_ADD, tgt, addr_list[tgt],
                    value, prev_tgt_val, &org_cntr);
    
           /* local_var on the remote task has been increased   */
           /* by value.  prev_tgt_val now contains the value    */
           /* of local_var on remote task before the addition   */
    
    }
    
  2. 要在两个任务 (使用 SWAP) 之间同步数据值,请执行以下操作:
    
    {
    
          int local_var;
          int *addr_list;
    
          /* local_var addresses are exchanged and stored  */
          /* in addr_list (using LAPI_Address_init).       */
          /* addr_list[tgt] now contains the address of    */
          /* local_var on tgt.                             */
          .
          .
          . 
          /* local_var is assigned some value              */
    
          /* assign local_var to local_var on remote task  */
          LAPI_Rmw(hndl, SWAP, tgt, addr_list[tgt],
                   local_var, prev_tgt_val, &org_cntr);
    
          /* local_var on the remote task is now equal to  */ 
          /* local_var on the local task. prev_tgt_val now */ 
          /* contains the value of local_var on the remote */  
          /* task before the swap.                         */
    
    }
    
  3. 要有条件地交换数据值 (与 COMPARE_AND_SWAP):
    
    {
    
          int local_var;
          int *addr_list;
          int in_val[2];
    
          /* local_var addresses are exchanged and stored        */
          /* in addr_list (using LAPI_Address_init).             */
          /* addr_list[tgt] now contains the address of          */
          /* local_var on tgt.                                   */
          .
          .
          .
          /* if local_var on remote_task is equal to comparator, */
          /* assign value to local_var on remote task            */
    			
          in_val[0] = comparator;
          in_val[1] = value;
    
          LAPI_Rmw(hndl, COMPARE_AND_SWAP, tgt, addr_list[tgt],
                   in_val, prev_tgt_val, &org_cntr);
    
          /* local_var on the remote task is now in_val[1] if it */
          /* had previously been equal to in_val[0]. If the swap */
          /* was performed, prev_tgt_val now contains TRUE;      */ 
          /* otherwise, it contains FALSE.                       */
    
    }
    

返回值

成功 (LAPI_SUCCESS)
指示函数调用已成功完成。
LAPI_ERR_HNDL_INVALID
指示传入的 hndl 无效 (未初始化或处于终止状态)。
LAPI_ERR_IN_VAL_NULL
指示 in_val 指针为 NULL (在 C 中) 或 in_val 的值为 LAPI_ADDR_NULL (在 FORTRAN 中)。
LAPI_ERR_RMW_OP
指示 op 无效。
LAPI_ERR_TGT
指示传入的 tgt 超出作业中定义的任务范围。
已清除的 LAPI_ERR_TGT_PURGED
指示由于调用了 LAPI_Purge_totask() 而提前返回了子例程。
LAPI_ERR_TGT_VAR_NULL
指示 tgt_var 地址为 NULL (在 C 中) 或 tgt_var 的值为 LAPI_ADDR_NULL (在 FORTRAN 中)。

位置

/usr/lib/liblapi_r.a