LAPI_Rmw64 子例程

用途

提供用于 64 位应用程序的数据同步原语。

可用性库 (liblapi_r.a)

C 语法

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

FORTRAN 语法

include 'lapif.h'
 
LAPI_RMW64(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 (KIND=LAPI_LONG_LONG_TYPE) :: in_val, prev_tgt_val
TYPE (LAPI_CNTR_T) :: org_cntr
INTEGER ierror

描述

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

此子例程是 LAPI_Rmw的 64 位版本。 它用于同步两个独立部分的 64 位数据,例如,两个任务共享公共数据结构。 该操作在目标任务 (特格特) 上执行,并且是原子操作。 操作从源获取输入值 (内瓦尔) ,并对目标 (特格特) 处的变量 (哥特堡) 执行四个操作 (操作) 中的一个操作,然后将目标变量 (哥特堡) 替换为操作结果 (操作)。 目标变量 (哥特堡) 的原始值 (prev_tgt_val) 将返回到源中。

这些操作 (操作) 在 恩德尔引用的上下文中执行。 执行这些调用的结果就好像以原子方式执行了以下代码:

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

其中:

f (a , b) = a + b (对于 添加 FETCH_AND_ADD )

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;
}

此子例程也可以在 32 位处理器上使用。

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

参数

INPUT
恩德尔
指定 LAPI 句柄。
操作
指定要执行的操作。 有效操作为:
  • COMPARE_AND_SWAP
  • FETCH_AND_ADD
  • FETCH_AND_OR
  • SWAP
特格特
指定 read-modify-write (Rmw64) 变量所在的目标任务的任务标识。 The value of this parameter must be in the range 0 <= 哥特 < NUM_TASKS.
哥特堡
指定目标读/修改/写 (Rmw64) 变量 (在 FORTRAN 中) 或其地址 (在 C 中)。 此参数的值不能为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中)。
内瓦尔
指定传入到操作 (操作) 的值。 此值不能为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中)。
输入/输出
prev_tgt_val
指定在执行操作 (操作) 之前存储目标任务上的先前 哥特堡 所在的源位置。 此参数的值可以是 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中)。
奥尔格-奇特尔
指定源计数器地址 (以 C 为单位) 或源计数器 (以 FORTRAN 为单位)。 如果设置了 prev_tgt_val ,那么在 prev_tgt_val 返回到源端时,源计数器 (奥尔格-奇特尔) 将递增。 如果未设置 prev_tgt_val ,那么在目标端完成操作 (操作) 后,源计数器 (奥尔格-奇特尔) 将更新。
输出
国际错误
指定 FORTRAN 返回码。 这始终是最后一个参数。

限制

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

C 示例

  1. 要在两个任务 (使用 FETCH_AND_ADD) 之间同步数据值,请执行以下操作:
    {
    
          long long local_var;
          long long *addr_list;
    
          /* both tasks initialize local_var to a value        */
    
          /* local_var addresses are exchanged and stored      */
          /* in addr_list (using LAPI_Address_init64)          */
          /* addr_list[tgt] now contains 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_Rmw64(hndl, FETCH_AND_ADD, tgt, addr_list[tgt],
                     value, prev_tgt_val, &org_cntr);
    
          /* local_var on remote task has been increased       */
          /* by value.  prev_tgt_val now contains value of     */
          /* local_var on remote task before the addition      */
    
    }
    
  2. 要在两个任务 (使用 SWAP) 之间同步数据值,请执行以下操作:
    
    {
    
          long long local_var;
          long long *addr_list;
    
          /* local_var addresses are exchanged and stored           */
          /* in addr_list (using LAPI_Address_init64).              */
          /* 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 the remote task       */
          LAPI_Rmw64(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):
    
    {
    
          long long local_var;
          long long *addr_list;
          long long in_val[2];
    
          /* local_var addresses are exchanged and stored        */
          /* in addr_list (using LAPI_Address_init64).           */
          /* 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 the remote task        */
    			
          in_val[0] = comparator;
          in_val[1] = value;
    
          LAPI_Rmw64(hndl, COMPARE_AND_SWAP, tgt, addr_list[tgt],
                     in_val, prev_tgt_val, &org_cntr);
    
          /* local_var on 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
指示传入的 恩德尔 无效 (未初始化或处于 "已终止" 状态)。
LAPI_ERR_IN_VAL_NULL
指示 in_val 指针为 NULL (在 C 中) 或 in_val 的值为 LAPI_ADDR_NULL (在 FORTRAN 中)。
LAPI_ERR_RMW_OP
指示 操作 是无效的。
LAPI_ERR_TGT
指示传入的 特格特 在作业中定义的任务范围之外。
已清除 LAPI_ERR_TGT_CLEAR
指示由于调用了 LAPI_Purge_totask() 而提前返回了子例程。
LAPI_ERR_TGT_VAR_NULL
指示 tgt_var 地址为 NULL (在 C 中) 或 tgt_var 的值为 LAPI_ADDR_NULL (在 FORTRAN 中)。

位置

/usr/lib/liblapi_r.a