LAPI_Putv 子例程
用途
将数据的向量从本地任务传输到远程任务。
库
可用性库 (liblapi_r.a)
C 语法
#include <lapi.h>
int LAPI_Putv(hndl, tgt, tgt_vec, org_vec, tgt_cntr, org_cntr, cmpl_cntr)
lapi_handle_t hndl;
uint tgt;
lapi_vec_t *tgt_vec;
lapi_vec_t *org_vec;
lapi_cntr_t *tgt_cntr;
lapi_cntr_t *org_cntr;
lapi_cntr_t *cmpl_cntr;
typedef struct {
lapi_vectype_t vec_type; /* operation code */
uint num_vecs; /* number of vectors */
void **info; /* vector of information */
ulong *len; /* vector of lengths */
} lapi_vec_t;FORTRAN 语法
include 'lapif.h'
LAPI_PUTV(hndl, tgt, tgt_vec, org_vec, tgt_cntr, org_cntr , cmpl_cntr, ierror)
INTEGER hndl
INTEGER tgt
INTEGER (KIND=LAPI_ADDR_TYPE) :: tgt_vec
TYPE (LAPI_VEC_T) :: org_vec
INTEGER (KIND=LAPI_ADDR_TYPE) :: tgt_cntr
TYPE (LAPI_CNTR_T) :: org_cntr
TYPE (LAPI_CNTR_T) :: cmpl_cntr
INTEGER ierrorLAPI_VEC_T 类型的 32 位版本定义为:TYPE LAPI_VEC_T
SEQUENCE
INTEGER(KIND = 4) :: vec_type
INTEGER(KIND = 4) :: num_vecs
INTEGER(KIND = 4) :: info
INTEGER(KIND = 4) :: len
END TYPE LAPI_VEC_TLAPI_VEC_T 类型的 64 位版本定义为:TYPE LAPI_VEC_T
SEQUENCE
INTEGER(KIND = 4) :: vec_type
INTEGER(KIND = 4) :: num_vecs
INTEGER(KIND = 8) :: info
INTEGER(KIND = 8) :: len
END TYPE LAPI_VEC_T描述
Type of call: 点到点通信 (非阻塞)
LAPI_Putv 是 LAPI_Put 调用的向量版本。 使用此子例程将数据的向量从源任务传输到目标任务。 源向量描述和目标向量描述位于 origin 任务的地址空间中。 但是,在目标向量的 info 数组中指定的值必须是 target 任务的地址空间中的地址。
调用程序 不能 假定可以更改源缓冲区,或者目标任务上的目标缓冲区的内容在函数返回时已准备就绪可供使用。 在源计数器 (奥尔格-奇特尔) 递增之后,源缓冲区可以由源任务修改。 目标计数器 (tgt_cntr) 递增后,目标任务就可以修改目标缓冲区。 如果提供完成计数器 (cmpl_cntr) ,那么它将在目标计数器 (tgt_cntr) 在目标处递增后在源处递增。 如果任何计数器或计数器地址的值为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中) ,那么将发生数据传输,但不会发生相应的计数器增量。
如果正在传输带条纹的向量,那么每个块的大小不得大于带条纹的大小 (以字节为单位)。
奥尔格韦茨 所指向的任何向量的长度都必须等于 特克特韦茨所指向的对应向量的长度。
LAPI 不会检查源或目标上的向量之间是否有任何重叠区域。 如果目标端存在重叠区域,那么在执行该操作后将取消定义目标缓冲区的内容。
请参阅 LAPI_Amsendv ,以获取有关使用各种向量类型的更多信息。 (LAPI_Putv 不支持 LAPI_GEN_GENERIC 类型。)
参数
- INPUT
- 恩德尔
- 指定 LAPI 句柄。
- 特格特
- 指定该目标任务的任务标识。 The value of this parameter must be in the range 0 <= 哥特 < NUM_TASKS.
- 特克特韦茨
- 指向目标的向量描述。
- 奥尔格韦茨
- 指向原点矢量描述。
- 输入/输出
- tgt_cntr
- 指定目标计数器地址。 目标计数器将在消息完成时递增。 如果此参数为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中) ,那么不会更新目标计数器。
- 奥尔格-奇特尔
- 指定源计数器地址 (以 C 为单位) 或源计数器 (以 FORTRAN 为单位)。 在缓冲区可用性时,源计数器将递增。 如果此参数为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中) ,那么不会更新源计数器。
- cmpl_cntr
- 指定反映 tgt_cntr的完成计数器地址 (以 C 为单位) 或完成计数器 (以 FORTRAN 为单位)。 在 tgt_cntr 递增后,完成计数器将在源处递增。 如果此参数为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中) ,那么不会更新完成计数器。
- 输出
- 国际错误
- 指定 FORTRAN 返回码。 这始终是最后一个参数。
C 示例
要放置 LAPI_GEN_IOVECTOR:
{
/* retrieve a remote data buffer address for data to transfer, */
/* such as through LAPI_Address_init */
/* task that calls LAPI_Putv sets up both org_vec and tgt_vec */
org_vec->num_vecs = NUM_VECS;
org_vec->vec_type = LAPI_GEN_IOVECTOR;
org_vec->len = (unsigned long *)
malloc(NUM_VECS*sizeof(unsigned long));
org_vec->info = (void **) malloc(NUM_VECS*sizeof(void *));
/* each org_vec->info[i] gets a base address on the origin task */
/* each org_vec->len[i] gets the number of bytes to transfer */
/* from org_vec->info[i] */
tgt_vec->num_vecs = NUM_VECS;
tgt_vec->vec_type = LAPI_GEN_IOVECTOR;
tgt_vec->len = (unsigned long *)
malloc(NUM_VECS*sizeof(unsigned long));
tgt_vec->info = (void **) malloc(NUM_VECS*sizeof(void *));
/* each tgt_vec->info[i] gets a base address on the target task */
/* each tgt_vec->len[i] gets the number of bytes to write to vec->info[i] */
/* For LAPI_GEN_IOVECTOR, num_vecs, vec_type, and len must be the same */
LAPI_Putv(hndl, tgt, tgt_vec, org_vec, tgt_cntr, org_cntr, compl_cntr);
/* tgt_cntr, org_cntr and compl_cntr can all be NULL */
/* data will be transferred as follows: */
/* org_vec->len[0] bytes will be retrieved from */
/* org_vec->info[0] and written to tgt_vec->info[0] */
/* org_vec->len[1] bytes will be retrieved from */
/* org_vec->info[1] and written to tgt_vec->info[1] */
.
.
.
/* org_vec->len[NUM_VECS-1] bytes will be retrieved */
/* from org_vec->info[NUM_VECS-1] and written to */
/* tgt_vec->info[NUM_VECS-1] */
}
有关其他向量类型的信息,请参阅 LAPI_Amsendv 中的示例。返回值
- LAPI_SUCCESS
- 指示已成功完成函数调用。
- LAPI_ERR_HNDL_INVALID
- 指示传入的 恩德尔 无效 (未初始化或处于 "已终止" 状态)。
- 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_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_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_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_VEC_LEN_DIFF
- 指示 奥尔格韦茨 和 特克特韦茨 具有不同的长度 (len [])。
- LAPI_ERR_VEC_NUM_DIFF
- 指示 奥尔格韦茨 和 特克特韦茨 具有不同的 努 _vecs。
- LAPI_ERR_VEC_TYPE_DIFF
- 指示 奥尔格韦茨 和 特克特韦茨 具有不同的向量类型 (向量类型)。
位置
- /usr/lib/liblapi_r.a