LAPI_Xfer 子例程

用途

充当 LAPI 数据传输函数的包装程序函数。

可用性库 (liblapi_r.a)

C 语法

#include <lapi.h>
 
int LAPI_Xfer(hndl, xfer_cmd)
lapi_handle_t hndl;
lapi_xfer_t *xfer_cmd;
 

typedef struct {
    uint            src;          /* Target task ID    */
    uint            reason;       /* LAPI return codes */
    ulong           reserve[6];   /* Reserved          */
} lapi_sh_info_t;


typedef void (scompl_hndlr_t)(lapi_handle_t *hndl, void *completion_param,
                              lapi_sh_info_t *info);
 

FORTRAN 语法

include 'lapif.h'
 
LAPI_XFER(hndl, xfer_cmd, ierror)
INTEGER hndl
TYPE (fortran_xfer_type) :: xfer_cmd
INTEGER ierror

描述

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

LAPI_Xfer 子例程提供以下子例程功能的超集: LAPI_AmsendLAPI_AmsendvLAPI_PutLAPI_PutvLAPI_GetLAPI_GetvLAPI_Rmw。 此外, LAPI_Xfer 还提供数据收集/散射程序 (DGSP) 消息传输。

在 C 中, LAPI_Xfer 命令传递一个指向并集的指针。 它检查联合的第一个成员 Xfer_type,以确定传输类型,并确定传递的联合成员。 LAPI_Xfer 期望设置所标识的联合成员的每个字段。 它不会检查或修改所标识的并集成员之外的任何内存。 LAPI_Xfer 将所有联合成员 ( status除外) 视为只读数据。

此子例程提供以下函数:
  • 远程地址字段将展开为类型为 lapi_long_t,这对于 64 位地址而言足够长。 这允许一个 32 位任务将数据发送到 64 位地址,这在客户机/服务器程序中可能很重要。
  • LAPI_Xfer 允许将源计数器替换为发送完成回调。
  • LAPI_Xfer 用于使用 LAPI 的数据收集/散点程序 (DGSP) 接口传输数据。
lapi_xfer_t 结构定义为:
typedef union {
        lapi_xfer_type_t   Xfer_type;
        lapi_get_t         Get;
        lapi_am_t          Am;
        lapi_rmw_t         Rmw;
        lapi_put_t         Put;
        lapi_getv_t        Getv;
        lapi_putv_t        Putv; 
        lapi_amv_t         Amv;
        lapi_amdgsp_t      Dgsp;
} lapi_xfer_t;
虽然 lapi_xfer_t 结构仅适用于 LAPI_Xfer的 C 版本,但下表包含 C 数据类型的 FORTRAN 等效项。
表 1 列出了 C 的 lapi_xfer_type_t 结构的值以及 FORTRAN 的显式 Xfer_type 值。
表 1. LAPI_Xfer 结构类型
Xfer_type 的值 (C 或 FORTRAN) 由 LAPI_Xfer (C) 解释的联合成员 fortran_xfer_type 的值 (FORTRAN)
LAPI_AM_XFER lapi_am_t LAPI_AM_T
LAPI_AMV_XFER lapi_amv_t LAPI_AMV_T
LAPI_DGSP_XFER lapi_amdgsp_t LAPI_AMDGSP_T
LAPI_GET_XFER lapi_get_t LAPI_GET_T
LAPI_GETV_XFER lapi_getv_t LAPI_GETV_T
LAPI_PUT_XFER lapi_put_t LAPI_PUT_T
LAPI_PUTV_XFER lapi_putv_t LAPI_PUTV_T
LAPI_RMW_XFER lapi_rmw_t LAPI_RMW_T

lapi_am_t 详细信息

表 2 显示了 LAPI_Amsend 子例程的参数, C lapi_am_t 结构的字段及其数据类型以及等效的 FORTRAN 数据类型之间的对应关系。 lapi_am_t 字段按它们在 lapi_xfer_t 结构中的出现顺序列示在 表 2 中。
表 2. LAPI_Amsend 和 lapi_am_t 等效项
lapi_am_t 字段名称 (C) lapi_am_t 字段类型 (C) 等效 FORTRAN 数据类型 等效的 LAPI_Amsend 参数
Xfer_type lapi_xfer_type_t INTEGER(KIND = 4) 在 C 中隐式

FORTRAN 中的 LAPI_Xfer 值: LAPI_AM_XFER

标志 int INTEGER(KIND = 4)

FORTRAN 中的 LAPI_Xfer 参数: flags

特格特 uint INTEGER(KIND = 4) 特格特
INTEGER(KIND = 4) FORTRAN 中的 LAPI_Xfer 参数: pad
hdr_hdl lapi_long_t INTEGER(KIND = 8) hdr_hdl
uhdr_len uint INTEGER(KIND = 4) uhdr_len
INTEGER(KIND = 4) FORTRAN (64 位) 中的 LAPI_Xfer 参数: pad2
乌赫德尔 void *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
乌赫德尔
乌数据 void *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
乌数据
乌德亚伦 ulong
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
乌德亚伦
什德尔尔 scompl_hndlr_t *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)

FORTRAN 中的 LAPI_Xfer 参数: shdlr

信息 void *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)

FORTRAN 中的 LAPI_Xfer 参数: sinfo

tgt_cntr lapi_long_t INTEGER(KIND = 8) tgt_cntr
奥尔格-奇特尔 lapi_cntr_t *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
奥尔格-奇特尔
cmpl_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
cmpl_cntr
当可自由使用原始数据缓冲区时,如果 shdlr 不是 NULL 指针 (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中) ,那么将使用发送完成数据 (sinfo) 来调用发送完成处理程序 (shdlr) 的指针。 否则,行为与 LAPI_Amsend的行为相同。

lapi_amv_t 详细信息

表 3 显示了 LAPI_Amsendv 子例程的参数, C lapi_amv_t 结构的字段及其数据类型以及等效的 FORTRAN 数据类型之间的对应关系。 lapi_amv_t 字段按它们在 lapi_xfer_t 结构中的出现顺序列示在 表 3 中。
表 3. LAPI_Amsendv 和 lapi_amv_t 等效项
lapi_amv_t 字段名称 (C) lapi_amv_t 字段类型 (C) 等效 FORTRAN 数据类型 等效的 LAPI_Amsendv 参数
Xfer_type lapi_xfer_type_t INTEGER(KIND = 4) 在 C 中隐式

FORTRAN 中的 LAPI_Xfer 值: LAPI_AMV_XFER

标志 int INTEGER(KIND = 4)

FORTRAN 中的 LAPI_Xfer 参数: flags

特格特 uint INTEGER(KIND = 4) 特格特
INTEGER(KIND = 4) FORTRAN 中的 LAPI_Xfer 参数: pad
hdr_hdl lapi_long_t INTEGER(KIND = 8) hdr_hdl
uhdr_len uint INTEGER(KIND = 4) uhdr_len
INTEGER(KIND = 4) FORTRAN (64 位) 中的 LAPI_Xfer 参数: pad2
乌赫德尔 void *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
乌赫德尔
什德尔尔 scompl_hndlr_t *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)

FORTRAN 中的 LAPI_Xfer 参数: shdlr

信息 void *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)

FORTRAN 中的 LAPI_Xfer 参数: sinfo

奥尔格韦茨 lapi_vec_t *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
奥尔格韦茨
INTEGER(KIND = 4) FORTRAN (32 位) 中的 LAPI_Xfer 参数: pad2
tgt_cntr lapi_long_t INTEGER(KIND = 8) tgt_cntr
奥尔格-奇特尔 lapi_cntr_t *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
奥尔格-奇特尔
cmpl_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
cmpl_cntr

lapi_amdgsp_t 详细信息

表 4 显示 C lapi_amdgsp_t 结构的字段与它们的数据类型之间的对应关系,它们在 LAPI_Xfer中的使用方式以及等效的 FORTRAN 数据类型。 lapi_amdgsp_t 字段按它们在 lapi_xfer_t 结构中的出现顺序列示在 表 4 中。
表 4. lapi_amdgsp_t 字段
lapi_amdgsp_t 字段名称 (C) lapi_amdgsp_t 字段类型 (C) 等效 FORTRAN 数据类型 LAPI_Xfer 使用情况
Xfer_type lapi_xfer_type_t INTEGER(KIND = 4) LAPI_DGSP_XFER
标志 int INTEGER(KIND = 4) 此字段允许用户对 LAPI 指定伪指令或提示。 如果您不想使用任何伪指令或提示,那么必须将此字段设置为 0。 请参阅 lapi_amdgsp_t 标志字段 以获取更多信息。
特格特 uint INTEGER(KIND = 4) 目标任务
INTEGER(KIND = 4) (仅用于 FORTRAN 的填充对齐)
hdr_hdl lapi_long_t INTEGER(KIND = 8) 要在目标上调用的头处理程序
uhdr_len uint INTEGER(KIND = 4) 用户头长度 (处理器的双字大小的倍数)
INTEGER(KIND = 4) pad2 (仅适用于 64 位 FORTRAN 的填充对齐)
乌赫德尔 void *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
指向用户头的指针
乌数据 void *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
指向用户数据的指针
乌德亚伦 ulong
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
用户数据长度
什德尔尔 scompl_hndlr_t *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
发送完成处理程序 (可选)
信息 void *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
要传递到发送完成处理程序的数据指针 (可选)
tgt_cntr lapi_long_t INTEGER(KIND = 8) 目标计数器 (可选)
奥尔格-奇特尔 lapi_cntr_t *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
源计数器 (可选)
cmpl_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
完成计数器 (可选)
奇普 lapi_dg_handle_t
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
已注册的 DGSP 的句柄
状态 lapi_status_t
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
要返回的状态 (将来使用)
INTEGER(KIND = 4) pad3 (仅适用于 64 位 FORTRAN 的填充对齐)

当可自由修改原始数据缓冲区时,如果 shdlr 不是 NULL 指针 (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中) ,那么将使用发送完成数据 (sinfo) 来调用发送完成处理程序 (shdlr)。

请参阅 将 lapi_am_dgsp_t 用于散射端 DGSP 处理 以获取更多信息。

lapi_amdgsp_t 标志字段

可以使用 | (按位或) 运算符设置一个或多个标志。 始终遵循用户伪指令,如果使用不正确,可能会导致不正确的结果。 适当的提示可能会提高性能,但 LAPI 可能会忽略这些提示。 不适当的提示可能会降低性能,但不会导致不正确的结果。

定义了以下伪指令标志:
USE_TGT_VEC_TYPE
指示 LAPI 使用目标矢量的矢量类型 (特克特韦茨)。 换言之, tgt_vec 将解释为类型 lapi_vec_t; 否则,将解释为类型 lapi_lvec_tlapi_lvec_t 类型使用 lapi_long_tlapi_vec_t 类型使用 void *long。 如果使用一种类型代替另一种类型,那么将出现不正确的结果。
BUFFER_BOTH_CONTIOUS
指示 LAPI 将所有要传输的数据视为连续数据,这可以提高性能。 如果在发送非连续数据时设置此标志,那么数据很可能已损坏。
定义了以下提示标志:
LAPI_NOT_USE_BULK_XFER
指示 LAPI 不使用批量传输,而不与任务的当前设置相关。
LAPI_USE_BULK_XFER
指示 LAPI 使用批量传输,而不依赖于该任务的当前设置。
如果这两个提示标志都未设置,那么 LAPI 将使用为任务定义的行为。 如果设置了这两个提示标志,那么 LAPI_NOT_USE_BULK_XFER 将优先。

通信库可能采用这些提示,也可能不采用这些提示。

将 lapi_am_dgsp_t 用于散射端 DGSP 处理

LAPI 允许通过使用 lapi_return_info_t 数据类型从头处理程序返回其他信息。 有关 lapi_return_info_t的更多信息,请参阅 RSCT for AIX 5L: LAPI Programming Guide 。 在传输类型为 lapi_am_dgsp_t的情况下,此机制可用于指示 LAPI 运行用户 DGSP 以将数据分散到接收端。

要使用此机制,请通过用户头处理程序的 msg_len 成员将 lapi_return_info_t * 指针传递回 LAPI。 所传递结构的 dgsp_handle 成员必须指向已在接收端上注册的 DGSP 描述。 请参阅 LAPI_UtilRSCT for AIX 5L: LAPI Programming Guide ,以获取有关构建和注册 DGSP 的详细信息。

lapi_get_t 详细信息

表 5 显示了 LAPI_Get 子例程的参数, C lapi_get_t 结构的字段及其数据类型以及等效的 FORTRAN 数据类型之间的对应关系。 lapi_get_t 字段按它们在 lapi_xfer_t 结构中的出现顺序列示在 表 5 中。
表 5. LAPI_Get 和 lapi_get_t 等效项
lapi_get_t 字段名称 (C) lapi_get_t 字段类型 (C) 等效 FORTRAN 数据类型 等效的 LAPI_Get 参数
Xfer_type lapi_xfer_type_t INTEGER(KIND = 4) 在 C 中隐式

FORTRAN 中的 LAPI_Xfer 值: LAPI_GET_XFER

标志 int INTEGER(KIND = 4)

FORTRAN 中的 LAPI_Xfer 参数: flags

特格特 uint INTEGER(KIND = 4) 特格特
INTEGER(KIND = 4) FORTRAN 中的 LAPI_Xfer 参数: pad
tgt_addr lapi_long_t INTEGER(KIND = 8) tgt_addr
奥格阿德尔 void *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
奥格阿德尔
LEN ulong
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
LEN
tgt_cntr lapi_long_t INTEGER(KIND = 8) tgt_cntr
奥尔格-奇特尔 lapi_cntr_t *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
奥尔格-奇特尔
钦德尔 compl_hndlr_t *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)

FORTRAN 中的 LAPI_Xfer 参数: 钦德尔

信息 void *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)

FORTRAN 中的 LAPI_Xfer 参数: cinfo

当源数据缓冲区完全到达时,如果 chndlr 不是 NULL 指针 (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中) ,那么将使用完成数据 (cinfo) 来调用指向完成处理程序 (chndlr) 的指针。 否则,行为与 LAPI_Get的行为相同。

lapi_getv_t 详细信息

表 6 显示了 LAPI_Getv 子例程的参数, C lapi_getv_t 结构的字段及其数据类型以及等效的 FORTRAN 数据类型之间的对应关系。 lapi_getv_t 字段按它们在 lapi_xfer_t 结构中的出现顺序列示在 表 5 中。
表 6. LAPI_Getv 和 lapi_getv_t 等效项
lapi_getv_t 字段名称 (C) lapi_getv_t 字段类型 (C) 等效 FORTRAN 数据类型 等效的 LAPI_Getv 参数
Xfer_type lapi_xfer_type_t INTEGER(KIND = 4) 在 C 中隐式

FORTRAN 中的 LAPI_Xfer 值: LAPI_GETV_XFER

标志 int INTEGER(KIND = 4)

FORTRAN 中的 LAPI_Xfer 参数: flags

特格特 uint INTEGER(KIND = 4) 特格特
INTEGER(KIND = 4) FORTRAN (64 位) 中的 LAPI_Xfer 参数: pad
奥尔格韦茨 lapi_vec_t *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
奥尔格韦茨
特克特韦茨 void *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
特克特韦茨
INTEGER(KIND = 4) FORTRAN (32 位) 中的 LAPI_Xfer 参数: pad
tgt_cntr lapi_long_t INTEGER(KIND = 8) tgt_cntr
奥尔格-奇特尔 lapi_cntr_t *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
奥尔格-奇特尔
钦德尔 compl_hndlr_t *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)

FORTRAN 中的 LAPI_Xfer 参数: 钦德尔

信息 void *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)

FORTRAN 中的 LAPI_Xfer 参数: cinfo

INTEGER(KIND = 4) FORTRAN (32 位) 中的 LAPI_Xfer 参数: pad2
flags 字段接受 USE_TGT_VEC_TYPE (请参阅 lapi_amdgsp_t flags 字段) ,以指示将 tgt_vec 解释为类型 lapi_vec_t; 否则,将其解释为类型 lapi_lvec_t。 请注意,相应的字段是 LAPI_Getv 调用中的 lapi_vec_t

当源数据缓冲区已完全到达时,如果 chndlr 不是 NULL 指针 (C) 或 LAPI_ADDR_NULL (FORTRAN) ,那么将使用完成数据 (cinfo) 调用指向完成处理程序 (chndlr) 的指针。 否则,行为与 LAPI_Getv的行为相同。

lapi_put_t 详细信息

表 7 显示了 LAPI_Put 子例程的参数, C lapi_put_t 结构的字段及其数据类型以及等效的 FORTRAN 数据类型之间的对应关系。 lapi_put_t 字段按它们在 lapi_xfer_t 结构中的出现顺序列示在 表 7 中。
表 7. LAPI_Put 和 lapi_put_t 等效项
lapi_put_t 字段名称 (C) lapi_put_t 字段类型 (C) 等效 FORTRAN 数据类型 等效的 LAPI_Put 参数
Xfer_type lapi_xfer_type_t INTEGER(KIND = 4) 在 C 中隐式

FORTRAN 中的 LAPI_Xfer 值: LAPI_PUT_XFER

标志 int INTEGER(KIND = 4)

FORTRAN 中的 LAPI_Xfer 参数: flags

特格特 uint INTEGER(KIND = 4) 特格特
INTEGER(KIND = 4) FORTRAN 中的 LAPI_Xfer 参数: pad
tgt_addr lapi_long_t INTEGER(KIND = 8) tgt_addr
奥格阿德尔 void *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
奥格阿德尔
LEN ulong
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
LEN
什德尔尔 scompl_hndlr_t *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)

FORTRAN 中的 LAPI_Xfer 参数: shdlr

信息 void *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)

FORTRAN 中的 LAPI_Xfer 参数: sinfo

tgt_cntr lapi_long_t INTEGER(KIND = 8) tgt_cntr
奥尔格-奇特尔 lapi_cntr_t *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
奥尔格-奇特尔
cmpl_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
cmpl_cntr
当可自由使用原始数据缓冲区时,如果 shdlr 不是 NULL 指针 (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中) ,那么将使用发送完成数据 (sinfo) 来调用发送完成处理程序 (shdlr) 的指针。 否则,行为与 LAPI_Put的行为相同。

lapi_putv_t 详细信息

表 8 显示了 LAPI_Putv 子例程的参数, C lapi_putv_t 结构的字段及其数据类型以及等效的 FORTRAN 数据类型之间的对应关系。 lapi_putv_t 字段按它们在 lapi_xfer_t 结构中的出现顺序列示在 表 7 中。
表 8. LAPI_Putv 和 lapi_putv_t 等效项
lapi_putv_t 字段名称 (C) lapi_putv_t 字段类型 (C) 等效 FORTRAN 数据类型 等效的 LAPI_Putv 参数
Xfer_type lapi_xfer_type_t INTEGER(KIND = 4) 在 C 中隐式

FORTRAN 中的 LAPI_Xfer 值: LAPI_PUT_XFER

标志 int INTEGER(KIND = 4)

FORTRAN 中的 LAPI_Xfer 参数: flags

特格特 uint INTEGER(KIND = 4) 特格特
INTEGER(KIND = 4) FORTRAN (64 位) 中的 LAPI_Xfer 参数: pad
什德尔尔 scompl_hndlr_t *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)

FORTRAN 中的 LAPI_Xfer 参数: shdlr

信息 void *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)

FORTRAN 中的 LAPI_Xfer 参数: sinfo

奥尔格韦茨 lapi_vec_t *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
奥尔格韦茨
特克特韦茨 void *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
特克特韦茨
INTEGER(KIND = 4) FORTRAN (32 位) 中的 LAPI_Xfer 参数: pad
tgt_cntr lapi_long_t INTEGER(KIND = 8) tgt_cntr
奥尔格-奇特尔 lapi_cntr_t *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
奥尔格-奇特尔
cmpl_cntr lapi_cntr_t *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
cmpl_cntr
flags 字段接受 USE_TGT_VEC_TYPE (请参阅 lapi_amdgsp_t flags 字段) 以指示将 tgt_vec 解释为 lapi_vec_t; 否则,将其解释为 lapi_lvec_t。 请注意,在 LAPI_Putv 调用中,相应的字段为 lapi_vec_t

当可自由修改原始数据缓冲区时,如果 shdlr 不是 NULL 指针 (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中) ,那么将使用发送完成数据 (sinfo) 来调用发送完成处理程序 (shdlr) 的指针。 否则,行为与 LAPI_Putv的行为相同。

lapi_rmw_t 详细信息

表 9 显示了 LAPI_Rmw 子例程的参数, C lapi_rmw_t 结构的字段及其数据类型以及等效的 FORTRAN 数据类型之间的对应关系。 lapi_rmw_t 字段按它们在 lapi_xfer_t 结构中的出现顺序列示在 表 7 中。
表 9. LAPI_Rmw 和 lapi_rmw_t 等效项
lapi_rmw_t 字段名称 (C) lapi_rmw_t 字段类型 (C) 等效 FORTRAN 数据类型 等效的 LAPI_Rmw 参数
Xfer_type lapi_xfer_type_t INTEGER(KIND = 4) 在 C 中隐式

FORTRAN 中的 LAPI_Xfer 值: LAPI_RMW_XFER

操作 Rmw_ops_t INTEGER(KIND = 4) 操作
特格特 uint INTEGER(KIND = 4) 特格特
大小 uint INTEGER(KIND = 4) 在 C 中隐式

FORTRAN 中的 LAPI_Xfer 参数: size (必须是 3264)

哥特堡 lapi_long_t INTEGER(KIND = 8) 哥特堡
内瓦尔 void *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
内瓦尔
prev_tgt_val void *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
prev_tgt_val
奥尔格-奇特尔 lapi_cntr t *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)
奥尔格-奇特尔
什德尔尔 scompl_hndlr_t *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)

FORTRAN 中的 LAPI_Xfer 参数: shdlr

信息 void *
INTEGER(KIND = 4) (32 位)
INTEGER(KIND = 8) (64 位)

FORTRAN 中的 LAPI_Xfer 参数: shdlr

INTEGER(KIND = 4) FORTRAN (32 位) 中的 LAPI_Xfer 参数: pad
当可自由使用原始数据缓冲区时,如果 shdlr 不是 NULL 指针 (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中) ,那么将使用发送完成数据 (sinfo) 来调用发送完成处理程序 (shdlr) 的指针。 size 值必须是 3264,指示您是否希望 in_valprev_tgt_val 字段分别指向 32 位或 64 位数量。 否则,行为与 LAPI_Rmw的行为相同。

参数

INPUT
恩德尔
指定 LAPI 句柄。
xfer_cmd
指定数据传送函数的名称和参数。
输出
国际错误
指定 FORTRAN 返回码。 这始终是最后一个参数。

返回值

LAPI_SUCCESS
指示已成功完成函数调用。
LAPI_ERR_DATA_LEN
指示 udata_lenlen 的值大于 LAPI 常量 LAPI_MAX_MSG_SZ的值。
LAPI_ERR_DGSP
指示传入的 DGSP 为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中) 或不是已注册的 DGSP。
LAPI_ERR_DGSP_ATOM
指示 DGSP 具有小于 0 或大于 MAX_ATOM_SIZEatom_size
LAPI_ERR_DGSP_BRANCH
指示 DGSP 已尝试在代码数组之外进行分支。
LAPI_ERR_DGSP_CTL
指示在无效上下文 (例如,聚集时原子大小为 0 的聚集侧控制或散射侧控制) 中迂到 DGSP 控制指令。
LAPI_ERR_DGSP_OPC
指示 "DGSP 操作码" 无效。
LAPI_ERR_DGSP_STACK
指示 DGSP 的 GOSUB 深度大于分配的堆栈支持的 GOSUB 深度。 堆栈分配由 dgsp-> 深度成员指定。
LAPI_ERR_HDR_HNDLR_NULL
指示传入的 hdr_hdl 为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中)。
LAPI_ERR_HNDL_INVALID
指示传入的 恩德尔 无效 (未初始化或处于 "已终止" 状态)。
LAPI_ERR_IN_VAL_NULL
指示 in_val 指针为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中)。
已耗尽 LAPI_ERR_MEMORY_DELETED
LAPI 无法从系统中获取内存。
LAPI_ERR_OP_SZ
指示 lapi_rmw_t size 字段未设置为 3264
LAPI_ERROR_ORG_ADDR_NULL
指示传入的 udata 参数为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中) 且 udata_len 大于 0,或者传入的 org_addr 为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中) 且 len 大于 0

Note: 如果 Xfer_type = LAPI_DGSP_XFER,那么 udata 为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中) 且 udata_len 大于 0 的情况有效,因此不会返回错误。

LAPI_ERROR_ORG_EXTENT
指示 org_vec的扩展数据块 (stride * num_vecs) 大于 LAPI 常量 LAPI_MAX_MSG_SZ的值。
LAPI_ERROR_ORG_STRIDE
指示 奥尔格韦茨 stride 小于 block。
LAPI_ERROR_ORG_VEC_ADDR
指示 org_vec->info [i] 为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中) ,但其长度 (org_vec->len [i]) 不是 0
LAPI_ERROR_ORG_VEC_LEN
指示 org_vec-> len 的总和大于 LAPI 常量 LAPI_MAX_MSG_SZ的值。
LAPI_ERROR_ORG_VEC_NULL
指示 org_vec 值为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中)。
LAPI_ERROR_ORG_VEC_TYPE
指示 " 奥尔格韦茨->向量类型 " 无效。
LAPI_ERR_RMW_OP
表示该操作无效。
LAPI_ERR_STRIDE_ORG_VEC_ADDR_NULL
指示条带化向量地址 org_vec->info[0] 为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中)。
LAPI_ERR_STRIDE_TGT_VEC_ADDR_NULL
指示条带化向量地址 tgt_vec->info[0] 为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中)。
LAPI_ERR_TGT
指示传入的 特格特 在作业中定义的任务范围之外。
LAPI_ERR_TGT_ADDR_NULL
指示 ret_addr 为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中)。
LAPI_ERR_TGT_EXTENT
指示 tgt_vec的扩展数据块 (stride * num_vecs) 大于 LAPI 常量 LAPI_MAX_MSG_SZ的值。
已清除 LAPI_ERR_TGT_CLEAR
指示由于调用了 LAPI_Purge_totask() 而提前返回了子例程。
LAPI_ERR_TGT_STRIDE
指示 特克特韦茨 stride 小于 block。
LAPI_ERR_TGT_VAR_NULL
指示 tgt_var 地址为 NULL (在 C 中) 或 tgt_var 的值为 LAPI_ADDR_NULL (在 FORTRAN 中)。
LAPI_ERR_TGT_VEC_ADDR
指示 tgt_vec->info[i] 为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中) ,但其长度 (tgt_vec->len[i]) 不是 0
LAPI_ERR_TGT_VEC_LEN
指示 tgt_vec->len 的总和大于 LAPI 常量 LAPI_MAX_MSG_SZ的值。
LAPI_ERR_TGT_VEC_NULL
指示 tgt_vec 为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中)。
LAPI_ERR_TGT_VEC_TYPE
指示 " 特克特韦茨->向量类型 " 无效。
LAPI_ERR_UHDR_LEN
指示传递的 uhdr_len 值大于 MAX_UHDR_SZ ,或者不是处理器的双字大小的倍数。
LAPI_ERR_UHDR_NULL
指示传入的 uhdr 为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中) ,但 uhdr_len 不是 0
LAPI_ERR_VEC_LEN_DIFF
指示 奥尔格韦茨特克特韦茨 具有不同的长度 (len [])。
LAPI_ERR_VEC_NUM_DIFF
指示 奥尔格韦茨特克特韦茨 具有不同的 努 _vecs
LAPI_ERR_VEC_TYPE_DIFF
指示 奥尔格韦茨特克特韦茨 具有不同的向量类型 (向量类型)。
LAPI_ERR_XFER_CMD
指示 Xfer_cmd 是无效的。

C 示例

  1. 要使用 LAPI_Xfer 界面运行 LAPI_Get 中显示的样本代码:
    {
    
          lapi_xfer_t xfer_struct;
    
          /* initialize the table buffer for the data addresses */
       
          /* get remote data buffer addresses */
          LAPI_Address_init(hndl,(void *)data_buffer,data_buffer_list);
          .    
          . 
          .
          /* retrieve data_len bytes from address data_buffer_list[tgt] on */
          /* task tgt. write the data starting at address data_buffer.     */
          /* tgt_cntr and org_cntr can be NULL.                            */ 
    
          xfer_struct.Get.Xfer_type = LAPI_GET_XFER;
          xfer_struct.Get.flags = 0;
          xfer_struct.Get.tgt = tgt;
          xfer_struct.Get.tgt_addr = data_buffer_list[tgt];
          xfer_struct.Get.org_addr = data_buffer;
          xfer_struct.Get.len = data_len;
          xfer_struct.Get.tgt_cntr = tgt_cntr;
          xfer_struct.Get.org_cntr = org_cntr;
        
          LAPI_Xfer(hndl, &xfer_struct);  
    
    }
  2. 要使用 LAPI_Xfer 接口从 LAPI_Amsendv 实现 LAPI_STRIDED_VECTOR 示例:
    
    {
        lapi_xfer_t   xfer_struct;                        /* info for LAPI_Xfer call */
        lapi_vec_t    vec;                                /* data for data transfer  */
        .
        .
        .
        vec->num_vecs = NUM_VECS;        /* NUM_VECS = number of vectors to transfer */ 
                                         /* must match that of the target vector     */
        vec->vec_type = LAPI_GEN_STRIDED_XFER;              /* same as target vector */
    
       
        vec->info[0]  = buffer_address;    /* starting address for data copy         */
        vec->info[1]  = block_size;        /* bytes of data to copy                  */
        vec->info[2]  = stride;            /* distance from copy block to copy block */
        /* data will be copied as follows:                                           */
        /* block_size bytes will be copied from buffer_address                       */
        /* block_size bytes will be copied from buffer_address+stride                */
        /* block_size bytes will be copied from buffer_address+(2*stride)            */
        /* block_size bytes will be copied from buffer_address+(3*stride)            */
        .
        .
        .
        /* block_size bytes will be copied from buffer_address+((NUM_VECS-1)*stride) */
        .
        .
        .
        xfer_struct.Amv.Xfer_type = LAPI_AMV_XFER;
        xfer_struct.Amv.flags     = 0;
        xfer_struct.Amv.tgt       = tgt;
        xfer_struct.Amv.hdr_hdl   = hdr_hdl_list[tgt];
        xfer_struct.Amv.uhdr_len  = uhdr_len;  /* user header length */
        xfer_struct.Amv.uhdr      = uhdr;
    
    
        /* LAPI_AMV_XFER allows the use of a send completion handler */
        /* If non-null, the shdlr function is invoked at the point   */
        /* the origin counter would increment.  Note that both the   */
        /* org_cntr and shdlr can be used.                           */
        /* The user's shdlr must be of type scompl_hndlr_t *.        */
        /* scompl_hndlr_t is defined in /usr/include/lapi.h          */
        xfer_struct.shdlr = shdlr; 
    
        /* Use sinfo to pass user-defined data into the send         */
        /* completion handler, if desired.                           */
        xfer_struct.sinfo     = sinfo;       /* send completion data */
        
        xfer_struct.org_vec   = vec;
        xfer_struct.tgt_cntr  = tgt_cntr;
        xfer_struct.org_cntr  = org_cntr;
        xfer_struct.cmpl_cntr = cmpl_cntr;
    
    
        LAPI_Xfer(hndl, &xfer_struct);
        .
        .
        .
    }
    
有关头处理程序定义的更多信息,请参阅 LAPI_Amsendv 子例程。

位置

/usr/lib/liblapi_r.a