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