LAPI_Getv Sous-routine

Objectif

Copie des vecteurs de données d'une tâche distante vers une tâche locale.

Bibliothèque

Bibliothèque de disponibilité (liblapi_r.a)

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

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

Cette sous-routine est la version vectorielle de l'appel LAPI_Get . Utilisez LAPI_Getv pour transférer des vecteurs de données de la tâche cible vers la tâche d'origine. Les descriptions de vecteurs d'origine et de cible se trouvent dans l'espace adresse de la tâche d'origine. 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 cible.

Le programme appelant ne peut pas supposer que la mémoire tampon d'origine peut être modifiée ou que le contenu des mémoires tampon d'origine sur la tâche d'origine est prêt à être utilisé lors du retour de la 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 le compteur cible (tgt_cntr) 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 après 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 l'une des conditions suivantes n'est pas remplie, une condition d'erreur se produit:
  • Les types de vecteur org_vec->type_vecteur et Tgt_vec->type_vecteur doivent être identiques.
  • Si un vecteur strié est transféré, la taille de chaque bloc ne doit pas être supérieure à la taille de stride en octets.
  • La longueur de tout vecteur désigné par tgt_vec doit être égale à la longueur du vecteur désigné par org_vec.

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

Voir LAPI_Amsendv pour plus de détails sur la communication à l'aide de différents types de vecteur LAPI. (LAPI_Getv ne prend pas en charge le type LAPI_GEN_GENERIC .)

Paramètres

ENTREE
hndl
Indique le descripteur LAPI.
tgt
Indique l'ID de la tâche cible. La valeur de ce paramètre doit être comprise dans la plage 0 < = tgt < NUM_TASKS.
v_tg
Pointe vers la description du 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é une fois que la mémoire tampon de données sur la cible peut être modifiée. Si la valeur de 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 (en FORTRAN). Le compteur d'origine est incrémenté une fois que les données arrivent à l'origine. Si la valeur de ce paramètre est NULL (en C) ou LAPI_ADDR_NULL (en FORTRAN), le compteur d'origine n'est pas mis à jour.
Sortie
erreur ierror
Indique un code retour FORTRAN. Il s'agit toujours du dernier paramètre.

Exemples C

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

}
Pour des exemples d'autres types de vecteurs, voir LAPI_Amsendv.

Valeurs renvoyées

SUCCÈS_LAPIEU
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é).
NOMBRE_ERREUR_ORG_PÉREMPTION
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 bande org_vec est inférieure à la taille de bloc.
ADRESSE_ORG_ERR_LAPI_ADR
Indique que certaines org_vec->info[i] sont NULL (en C) ou LAPI_ADDR_NULL (en FORTRAN). mais la longueur correspondante (org_vec->len[i]) n'est pas 0.
LONGUEUR_VEC_ORG_ERREUR_LAPI_FR
Indique que la somme totale de toutes les org_vec->len[i] (où [i] est comprise dans la plage 0 < = i < = org_vec->num_vecs) 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).
TYPE_VEC_ORG_ERREUR_LAPI_
Indique que le org_vec->type_vecteur n'est pas valide.
LAPI_ERR_STRIDE_ORG_VEC_ADDR_NULL
Indique que l'adresse de base du vecteur strié 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).
LAPI_ERR_TGT
Indique que le tgt transmis est en dehors de la plage de tâches définie dans le travail.
ET_ERREUR_LAPI_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é.
LAPI_ERR_TGT_STRIDE
Indique que la foulée de tgt_vecest inférieure à sa taille de bloc.
ADRESSE_VECT_ERR_LAPI_TGT_ADR
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.
LONGUEUR_VECT_ERR_PÉREMPTION
Indique que la somme de tgt_vec->len est supérieure à la valeur de la constante LAPI LAPI_MAX_MSG_SZ.
CADRE_ERR_TGT_VEC_NULL
Indique que tgt_vec est NULL (en C) ou LAPI_ADDR_NULL (en FORTRAN).
TYPE_VECT_ERR_LAPI_TGT_TYPE
Indique que le 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[]).
VEC_ERR_LAPI_NUM_DIFF
Indique que org_vec et Tgt_vec ont des nombre_vecsdifférents.
VECT_ERR_VECT_DIFF
Indique que org_vec et Tgt_vec ont des types de vecteur différents (type_vecteur).

Emplacement

/usr/lib/liblapi_r.a