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 ierror
LAPI_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_T
LAPI_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_vectgt_vec 具有不同的长度 (len[])。
LAPI_ERR_VEC_NUM_DIFF
指示 org_vec哥特韦茨 具有不同的 数字向量
LAPI_ERR_VEC_TYPE_DIFF
指示 org_vec哥特韦茨 具有不同的向量类型 (向量类型)。

位置

/usr/lib/liblapi_r.a