LAPI_Putv Sous-routine

Objectif

Transfère les vecteurs de données d'une tâche locale vers une tâche distante.

Bibliothèque

Bibliothèque de disponibilité (liblapi_r.a)

Syntaxe 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;

Syntaxe 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
La version 32 bits du type LAPI_VEC_T est définie comme suit:
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
La version 64 bits du type LAPI_VEC_T est définie comme suit:
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

Descriptif

Communication point à point Type of call: (non bloquante)

LAPI_Putv est la version vectorielle de l'appel LAPI_Put . Utilisez cette sous-routine pour transférer des vecteurs de données de la tâche d'origine vers la tâche cible. Les descriptions de vecteurs d'origine et les descriptions de vecteurs cible se trouvent dans l'espace adresse de la tâche origin . Toutefois, les valeurs spécifiées dans le tableau info du vecteur cible doivent être des adresses dans l'espace adresse de la tâche target .

Le programme appelant Impossible suppose que la mémoire tampon d'origine peut être modifiée ou que le contenu des mémoires tampons cible de la tâche cible est prêt à être utilisé lors du retour de fonction. Une fois le compteur d'origine (Org_cntr) incrémenté, les mémoires tampon d'origine peuvent être modifiées par la tâche d'origine. Une fois que le compteur cible (Tgt_cntr) est incrémenté, les mémoires tampon cible peuvent être modifiées par la tâche cible. Si vous fournissez un compteur d'achèvement (Cmpl_cntr), il est incrémenté à l'origine une fois que le compteur cible (Tgt_cntr) a été incrémenté à la cible. Si les valeurs de l'un des compteurs ou des adresses de compteur sont NULL (en C) ou LAPI_ADDR_NULL (en FORTRAN), le transfert de données a lieu, mais les incréments de compteur correspondants n'ont pas lieu.

Si un vecteur strié est transféré, la taille de chaque bloc ne doit pas être supérieure à la taille de segment en octets.

La longueur de n'importe quel vecteur désigné par Org_vec doit être égale à la longueur du vecteur correspondant désigné par Tgt_vec.

LAPI ne vérifie pas les régions qui se chevauchent entre les vecteurs, soit à l'origine, soit à la cible. Si les régions qui se chevauchent existent sur le côté cible, le contenu de la mémoire tampon cible n'est pas défini après l'opération.

Pour plus d'informations sur l'utilisation des différents types de vecteur, voir LAPI_Amsendv . (LAPI_Putv ne prend pas en charge le type LAPI_GEN_GENERIC .)

Paramètres

ENTREE
Hndl
Indique le descripteur LAPI.
Tgt
Indique l'ID tâche de la tâche cible. La valeur de ce paramètre doit être comprise dans la plage 0 < = tgt < NUM_TASKS.
Tgt_vec
Pointe vers la description de vecteur cible.
Org_vec
Pointe vers la description du vecteur d'origine.
Entrée-sortie
Tgt_cntr
Indique l'adresse du compteur cible. Le compteur cible est incrémenté à la fin du message. Si ce paramètre est NULL (en C) ou LAPI_ADDR_NULL (en FORTRAN), le compteur cible n'est pas mis à jour.
Org_cntr
Indique l'adresse du compteur d'origine (en C) ou le compteur d'origine (dans FORTRAN). Le compteur d'origine est incrémenté à la disponibilité de la mémoire tampon. Si ce paramètre est NULL (en C) ou LAPI_ADDR_NULL (en FORTRAN), le compteur d'origine n'est pas mis à jour.
Cmpl_cntr
Indique l'adresse du compteur d'achèvement (en C) ou le compteur d'achèvement (dans FORTRAN) qui est le reflet de Tgt_cntr. Le compteur d'achèvement est incrémenté à l'origine après l'incrémentation de Tgt_cntr . Si ce paramètre est NULL (en C) ou LAPI_ADDR_NULL (en FORTRAN), le compteur d'achèvement n'est pas mis à jour.
Sortie
Ierror
Indique un code retour FORTRAN. C'est toujours le dernier paramètre.

C Exemples

Pour mettre un 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]                        */

}
Voir l'exemple dans LAPI_Amsendv pour plus d'informations sur les autres types de vecteur.

Valeurs renvoyées

LAPI_SUCCESS
Indique que l'appel de fonction a abouti.
LAPI_ERR_HNDL_INVALID
Indique que le Hndl transmis n'est pas valide (non initialisé ou à l'état arrêté).
LAPI_ERR_ORG_EXTENT
Indique que l'extension de org_vec(stride * num_vecs) est supérieure à la valeur de la constante LAPI LAPI_MAX_MSG_SZ.
LAPI_ERR_ORG_STRIDE
Indique que la segmentation Org_vec est inférieure à bloc.
ADRESSE_ERR_ORG_ADRESSE_VECTEUR_ORDINATEUR
Indique que org_vec->info [ i ] est NULL (en C) ou LAPI_ADDR_NULL (en FORTRAN), mais que sa longueur (org_vec->len [ i ]) n'est pas 0.
LAPI_ERR_ORG_VEC_LEN
Indique que la somme de org_vec->len est supérieure à la valeur de la constante LAPI LAPI_MAX_MSG_SZ.
LAPI_ERR_ORG_VEC_NULL
Indique que org_vec est NULL (en C) ou LAPI_ADDR_NULL (en FORTRAN).
LAPI_ERR_ORG_VEC_TYPE
Indique que Org_vec->Type_vecteur n'est pas valide.
LAPI_ERR_STRIDE_ORG_VEC_ADDR_NULL
Indique que l'adresse de vecteur segmentée org_vec->info[ 0 ] est NULL (en C) ou LAPI_ADDR_NULL (en FORTRAN).
LAPI_ERR_STRIDE_TGT_VEC_ADDR_NULL
Indique que l'adresse de vecteur segmentée tgt_vec->info[ 0 ] est NULL (en C) ou LAPI_ADDR_NULL (en FORTRAN).
ERR_ERR_TGT
Indique que le Tgt transmis ne correspond pas à la plage de tâches définie dans le travail.
LAPI_ERR_TGT_EXTENSION
Indique que l'étendue de tgt_vec(stride * num_vecs) est supérieure à la valeur de la constante LAPI LAPI_MAX_MSG_SZ.
LAPI_ERR_TGT_PURGÉ
Indique que la sous-routine a été renvoyée tôt car LAPI_Purge_totask() a été appelé.
ERR_ERR_TGT_STRIDE
Indique que la segmentation Tgt_vec est inférieure à bloc.
ADRESSE_ERR_TGT_TGT_V
Indique que tgt_vec->info[ i ] est NULL (en C) ou LAPI_ADDR_NULL (en FORTRAN), mais que sa longueur (tgt_vec->len[ i ]) n'est pas 0.
LAPI_ERR_TGT_VEC_LEN
Indique que la somme de tgt_vec->len est supérieure à la valeur de la constante LAPI LAPI_MAX_MSG_SZ.
LAPI_ERR_TGT_VEC_NULL
Indique que tgt_vec est NULL (en C) ou LAPI_ADDR_NULL (en FORTRAN).
LAPI_ERR_TGT_VEC_TYPE
Indique que Tgt_vec->Type_vecteur n'est pas valide.
LAPI_ERR_VEC_LEN_DIFF
Indique que Org_vec et Tgt_vec ont des longueurs différentes (Len [ ]).
NUMÉRO_ERR_ERR_PORTABLE
Indique que Org_vec et Tgt_vec ont des Num_vecsdifférents.
TYPE_ERR_ERR_PORTABLE
Indique que Org_vec et Tgt_vec ont des types de vecteurs différents (Type_vecteur).

Emplacement

/usr/lib/liblapi_r.a