LAPI_Rmw64 Sous-routine
Objectif
Fournit des primitives de synchronisation de données pour les applications 64 bits.
Bibliothèque
Bibliothèque de disponibilité (liblapi_r.a)
Syntaxe C
#include <lapi.h>
int LAPI_Rmw64(hndl, op, tgt, tgt_var, in_val, prev_tgt_val, org_cntr)
lapi_handle_t hndl;
Rmw_ops_t op;
uint tgt;
long long *tgt_var;
long long *in_val;
long long *prev_tgt_val;
lapi_cntr_t *org_cntr;Syntaxe FORTRAN
include 'lapif.h'
LAPI_RMW64(hndl, op, tgt, tgt_var, in_val, prev_tgt_val, org_cntr, ierror)
INTEGER hndl
INTEGER op
INTEGER tgt
INTEGER (KIND=LAPI_ADDR_TYPE) :: tgt_var
INTEGER (KIND=LAPI_LONG_LONG_TYPE) :: in_val, prev_tgt_val
TYPE (LAPI_CNTR_T) :: org_cntr
INTEGER ierrorDescriptif
Communication point à point Type of call: (non bloquante)
Cette sous-routine est la version 64 bits de LAPI_Rmw. Il est utilisé pour synchroniser deux pièces indépendantes de données 64 bits, telles que deux tâches partageant une structure de données commune. L'opération est effectuée à la tâche cible (Tgt) et est atomique. L'opération prend une valeur d'entrée (_val) à partir de l'origine et effectue l'une des quatre opérations (Opp.) sur une variable (Var_tgt) sur la cible (Tgt), puis remplace la variable cible (Var_tgt) par les résultats de l'opération (Opp.). La valeur d'origine (Valeur_tgt) de la variable cible (Var_tgt) est renvoyée à l'origine.
*prev_tgt_val = *tgt_var;
*tgt_var = f(*tgt_var, *in_val);
où :
F (a, b) = a + b pour FETCH_AND_ADD
F (a, b) = a | b pour FETCH_AND_OR (bitwise ou)
f (a, b) = b pour SWAP
if(*tgt_var == in_val[0]) {
*prev_tgt_val = TRUE;
*tgt_var = in_val[1];
} else {
*prev_tgt_val = FALSE;
}
Cette sous-routine peut également être utilisée sur un processeur 32 bits.
Tous les appels LAPI_Rmw64 ne sont pas bloquants. Pour tester l'achèvement, utilisez les sous-routines LAPI_Getcntr et LAPI_Waitcntr . LAPI_Rmw64 n'inclut pas de compteur cible (tgt_cntr), de sorte que les appels LAPI_Rmw64 ne fournissent aucune indication d'achèvement sur la tâche cible (tgt).
Paramètres
- ENTREE
- Hndl
- Indique le descripteur LAPI.
- Opp.
- Indique l'opération à effectuer. Les opérations valides sont les suivantes:
- COMPARE_AND_SWAP
- FETCH_AND_ADD
- FETCH_AND_OR
- SWAP
- Tgt
- Indique l'ID tâche de la tâche cible dans laquelle se trouve la variable read-modify-write (Rmw64). La valeur de ce paramètre doit être comprise dans la plage 0 < = tgt < NUM_TASKS.
- Var_tgt
- Indique la variable read-modify-write (Rmw64) cible (dans FORTRAN) ou son adresse (en C). La valeur de ce paramètre ne peut pas être NULL (en C) ou LAPI_ADDR_NULL (en FORTRAN).
- _val
- Indique la valeur transmise à l'opération (Opp.). Cette valeur ne peut pas être NULL (en C) ou LAPI_ADDR_NULL (en FORTRAN).
- Entrée-sortie
- Valeur_tgt
- Indique l'emplacement à l'origine dans lequel le fichier Var_tgt précédent sur la tâche cible est stocké avant l'exécution de l'opération (Opp.). La valeur de ce paramètre peut être NULL (en C) ou LAPI_ADDR_NULL (en FORTRAN).
- Org_cntr
- Indique l'adresse du compteur d'origine (en C) ou le compteur d'origine (dans FORTRAN). Si Valeur_tgt est défini, le compteur d'origine (Org_cntr) est incrémenté lorsque Valeur_tgt est renvoyé au côté de l'origine. Si Valeur_tgt n'est pas défini, le compteur d'origine (Org_cntr) est mis à jour une fois que l'opération (Opp.) est terminée sur le côté cible.
- Sortie
- Ierror
- Indique un code retour FORTRAN. C'est toujours le dernier paramètre.
Restrictions
Les statistiques LAPI sont Pas pour la communication de mémoire partagée et le transfert de données, ou pour les messages qu'une tâche envoie à elle-même.
C Exemples
- Pour synchroniser une valeur de données entre deux tâches (avec FETCH_AND_ADD):
{ long long local_var; long long *addr_list; /* both tasks initialize local_var to a value */ /* local_var addresses are exchanged and stored */ /* in addr_list (using LAPI_Address_init64) */ /* addr_list[tgt] now contains address of */ /* local_var on tgt */ . . . /* add value to local_var on some task */ /* use LAPI to add value to local_var on remote task */ LAPI_Rmw64(hndl, FETCH_AND_ADD, tgt, addr_list[tgt], value, prev_tgt_val, &org_cntr); /* local_var on remote task has been increased */ /* by value. prev_tgt_val now contains value of */ /* local_var on remote task before the addition */ } - Pour synchroniser une valeur de données entre deux tâches (avec SWAP):
{ long long local_var; long long *addr_list; /* local_var addresses are exchanged and stored */ /* in addr_list (using LAPI_Address_init64). */ /* addr_list[tgt] now contains the address of */ /* local_var on tgt. */ . . . /* local_var is assigned some value */ /* assign local_var to local_var on the remote task */ LAPI_Rmw64(hndl, SWAP, tgt, addr_list[tgt], local_var, prev_tgt_val, &org_cntr); /* local_var on the remote task is now equal to local_var */ /* on the local task. prev_tgt_val now contains the value */ /* of local_var on the remote task before the swap. */ } - Pour permuter de manière conditionnelle une valeur de données (avec COMPARE_AND_SWAP):
{ long long local_var; long long *addr_list; long long in_val[2]; /* local_var addresses are exchanged and stored */ /* in addr_list (using LAPI_Address_init64). */ /* addr_list[tgt] now contains the address of */ /* local_var on tgt. */ . . . /* if local_var on remote_task is equal to comparator, */ /* assign value to local_var on the remote task */ in_val[0] = comparator; in_val[1] = value; LAPI_Rmw64(hndl, COMPARE_AND_SWAP, tgt, addr_list[tgt], in_val, prev_tgt_val, &org_cntr); /* local_var on remote task is now in_val[1] if it */ /* had previously been equal to in_val[0]. If the */ /* swap was performed, prev_tgt_val now contains */ /* TRUE; otherwise, it contains FALSE. */ }
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_IN_VAL_NULL
- Indique que le pointeur in_val est NULL (en C) ou que la valeur de in_val est LAPI_ADDR_NULL (en FORTRAN).
- ECHEC DE LAPI_ERR_RMW_OP
- Indique que Opp. n'est pas valide.
- ERR_ERR_TGT
- Indique que le Tgt transmis ne correspond pas à la plage de tâches définie dans le travail.
- 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_VAR_NULL
- Indique que l'adresse tgt_var est NULL (en C) ou que la valeur de tgt_var est LAPI_ADDR_NULL (en FORTRAN).
Emplacement
- /usr/lib/liblapi_r.a