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 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_PutvLAPI_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