LAPI_Getv 子例程
用途
将数据向量从远程任务复制到本地任务。
库
可用性库 (liblapi_r.a)
C 语法
#include <lapi.h>
int LAPI_Getv(hndl, tgt, tgt_vec, org_vec, tgt_cntr, org_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;
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_GETV(hndl, tgt, tgt_vec, org_vec, tgt_cntr, org_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
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_Get 调用的向量版本。 使用 LAPI_Getv 将数据向量从目标任务传输到源任务。 源和目标向量描述都位于源任务的地址空间中。 但是,在目标向量的 info 数组中指定的值必须是目标任务的地址空间中的地址。
调用程序 无法 假定可以更改源缓冲区,或者在函数返回时,源任务上的源缓冲区的内容可供使用。 源计数器 (org_cntr) 递增后,源任务可以修改源缓冲区。 在目标计数器 (tgt_cntr) 递增后,目标任务可以修改目标缓冲区。 如果提供完成计数器 (cmpl_cntr) ,那么在目标计数器 (tgt_cntr) 在目标上递增后,将在源上递增。 如果任何计数器或计数器地址的值为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中) ,那么将发生数据传输,但不会发生相应的计数器增量。
如果未满足以下任何需求,那么将发生错误情况:
- 向量类型 org_vec->向量类型 和 哥特韦茨->向量类型 必须相同。
- 如果正在传输条带化向量,那么每个块的大小不得大于条带化大小 (以字节为单位)。
- tgt_vec 指向的任何向量的长度必须等于 org_vec指向的相应向量的长度。
LAPI 不会在源或目标上的向量之间检查任何重叠区域。 如果源端存在重叠区域,那么在操作后将取消定义源缓冲区的内容。
有关使用不同 LAPI 向量类型的转换的详细信息,请参阅 LAPI_Amsendv 。 (LAPI_Getv 不支持 LAPI_GEN_GENERIC 类型。)
参数
- INPUT
- hndl
- 指定 LAPI 句柄。
- tgt
- 指定目标任务的任务标识。 The value of this parameter must be in the range 0 <= 哥特 < NUM_TASKS.
- tgt_vec
- 指向目标向量描述。
- org_vec
- 指向源向量描述。
- 输入/输出
- tgt_cntr
- 指定目标计数器地址。 一旦可以修改目标上的数据缓冲区,目标计数器就会递增。 如果此参数的值为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中) ,那么不会更新目标计数器。
- org_cntr
- 指定源计数器地址 (C) 或源计数器 (FORTRAN)。 数据到达源后,源计数器将递增。 如果此参数的值为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中) ,那么不会更新源计数器。
- 输出
- ierror
- 指定 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_Getv 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 write to */
/* 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 transfer */
/* from vec->info[i] */
/* For LAPI_GEN_IOVECTOR, num_vecs, vec_type, and len must be */
/* the same */
LAPI_Getv(hndl, tgt, tgt_vec, org_vec, tgt_cntr, org_cntr);
/* tgt_cntr and org_cntr can both be NULL */
/* data will be retrieved as follows: */
/* org_vec->len[0] bytes will be retrieved from */
/* tgt_vec->info[0] and written to org_vec->info[0] */
/* org_vec->len[1] bytes will be retrieved from */
/* tgt_vec->info[1] and written to org_vec->info[1] */
.
.
.
/* org_vec->len[NUM_VECS-1] bytes will be retrieved */
/* from tgt_vec->info[NUM_VECS-1] and written to */
/* org_vec->info[NUM_VECS-1] */
}
有关其他向量类型的示例,请参阅 LAPI_Amsendv。返回值
- 成功 (LAPI_SUCCESS)
- 指示函数调用已成功完成。
- LAPI_ERR_HNDL_INVALID
- 指示传入的 hndl 无效 (未初始化或处于终止状态)。
- LAPI_ERR_ORG_EXTENT
- 指示 org_vec的扩展数据块 (stride * num_vecs) 大于 LAPI 常量 LAPI_MAX_MSG_SZ的值。
- LAPI_ERR_ORG_STRIDE
- 指示 org_vec stride 小于块大小。
- LAPI_ERR_ORG_VEC_ADDR
- 指示某些 org_vec->info[i] 为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中)。 但对应的长度 (org_vec->len[i]) 不是 0。
- LAPI_ERR_ORG_VEC_LEN
- Indicates that the total sum of all org_vec->伦[我] (where [我] is in the range 0 <= 我 <= org_vec->数字向量) is greater than the value of LAPI constant LAPI_MAX_MSG_SZ.
- LAPI_ERR_ORG_VEC_NULL
- 指示 org_vec 为 NULL (在 C 中) 或 LAPI_ADDR_NULL (在 FORTRAN 中)。
- LAPI_ERR_ORG_VEC_TYPE
- 指示 org_vec->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
- 指示传入的 tgt 超出作业中定义的任务范围。
- LAPI_ERR_TGT_EXTENT
- 指示 tgt_vec的扩展数据块 (stride * num_vecs) 大于 LAPI 常量 LAPI_MAX_MSG_SZ的值。
- 已清除的 LAPI_ERR_TGT_PURGED
- 指示由于调用了 LAPI_Purge_totask() 而提前返回了子例程。
- LAPI_ERR_TGT_STRIDE
- 指示 tgt_vec的条带小于其块大小。
- 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
- 指示 tgt_vec->vec_type 无效。
- LAPI_ERR_VEC_LEN_DIFF
- 指示 org_vec 和 tgt_vec 具有不同的长度 (len[])。
- LAPI_ERR_VEC_NUM_DIFF
- 指示 org_vec 和 哥特韦茨 具有不同的 数字向量。
- LAPI_ERR_VEC_TYPE_DIFF
- 指示 org_vec 和 哥特韦茨 具有不同的向量类型 (向量类型)。
位置
- /usr/lib/liblapi_r.a