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_SWAP, in_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_Getcntr 和 LAPI_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 示例
- 要在两个任务 (使用 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 */ } - 要在两个任务 (使用 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. */ } - 要有条件地交换数据值 (与 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