Fonction Rsqrt
La fonction Rsqrt effectue un calcul élément par élément de l'inverse de la racine carrée, selon la formule suivante : sortie = 1 / √(entrée).
Compatibilité produits
| Produit | Support |
|---|---|
| Ascend 950PR / Ascend 950DT | ✓ |
| Atlas A3 série entraînement / série inférence | ✓ |
| Atlas A2 série entraînement / série inférence | ✓ |
| Kirin X90 | ✓ |
| Kirin 9030 | ✓ |
Prototypes de fonctions
Calcul sur les n premiers éléments d'un tenseur
template <typename T, const RsqrtConfig& config = DEFAULT_RSQRT_CONFIG>
__aicore__ inline void Rsqrt(const LocalTensor<T>& dest, const LocalTensor<T>& source, const int32_t& elementCount)
Calcul sur des découpages multidimensionnels d'un tenseur
Mode masque bit à bit
template <typename T, bool appliquerMasque = true, const RsqrtConfig& config = DEFAULT_RSQRT_CONFIG>
__aicore__ inline void Rsqrt(const LocalTensor<T>& dest, const LocalTensor<T>& source, uint64_t masqueBits[], const uint8_t repetitions, const UnaryRepeatParams& paramRep)
Mode masque continu
template <typename T, bool appliquerMasque = true, const RsqrtConfig& config = DEFAULT_RSQRT_CONFIG>
__aicore__ inline void Rsqrt(const LocalTensor<T>& dest, const LocalTensor<T>& source, uint64_t masqueContinu, const uint8_t repetitions, const UnaryRepeatParams& paramRep)
Description des paramètres
Paramètres du modèle
| Nom du paramètre | Description |
|---|---|
| T | Type de données des opérandes. Pour les séries Atlas A2 et A3, ainsi que Ascend 950 et Kirin, les types supportés sont : half et float. |
| appliquerMasque | Détermine si le masque est défini en interne. - true : masque défini dans l'interface. - false : masque défini par l'extérieur via SetVectorMask, avec le masque mis à MASK_PLACEHOLDER. |
| config | Configuration de précision pour le calcul. Type RsqrtConfig, défini ainsi : enum class RsqrtAlgo { INTRINSIC = 0, FAST_INVERSE, PRECISION_1ULP_FTZ_TRUE, PRECISION_0ULP_FTZ_FALSE, PRECISION_1ULP_FTZ_FALSE, }; struct RsqrtConfig { RsqrtAlgo algo = RsqrtAlgo::INTRINSIC; }; Les valeurs de algo contrôlent le mode de précision. Par défaut : DEFAULT_RSQRT_CONFIG = { RsqrtAlgo::INTRINSIC }. |
Paramètres d'appel
| Nom | Entrée/Sortie | Description |
|---|---|---|
| dest | Sortie | Opérande de destination. Type LocalTensor avec TPosition VECIN/VECCALC/VECOUT, alignement 32 octets. |
| source | Entrée | Opérande source. Type identique à dest, alignement 32 octets. |
| elementCount | Entrée | Nombre d'éléments à traiter. |
| masqueBits[]/masqueContinu | Entrée | Contrôle des éléments calculés par itération. En mode bit à bit, les bits à 1 activent le calcul ; en mode continu, la valeur spécifie le nombre d'éléments consécutifs. |
| repetitions | Entrée | Nombre d'itérations répétées pour le calcul vectoriel. |
| paramRep | Entrée | Paramètres de pas d'adresse, de type UnaryRepeatParams. |
Valeur de retour
Aucune.
Contraintes
- Alignement d'adresse des opérandes selon les contraintes générales.
- Pas de chevauchement d'adresses entre opérandes source et destination.
- Si l'entrée contient des valeurs non positives, les résultats peuvent être indéfinis.
- Pour une haute précision, il est recommandé d'utiliser Div et Sqrt au lieu de Rsqrt, car les erreurs pour half et float ne respectent pas les seuils standards.
Exemples d'appel
Calcul sur découpage multidimensionnel - mode masque continu
uint64_t masqueCalcul = 256 / sizeof(half); // Calcul du masque basé sur la taille des éléments
// Répétitions : 4, avec 128 éléments par itération, total 512 éléments
// Pas de bloc pour dest et source : 1, sans espace inter-blocs
// Pas de répétition pour dest et source : 8, sans espace inter-répétitions
AscendC::Rsqrt(tensorDest, tensorSrc, masqueCalcul, 4, { 1, 1, 8, 8 });
Calcul sur découpage multidimensionnel - mode masque bit à bit
uint64_t masqueBits[2] = { UINT64_MAX, UINT64_MAX }; // Activation de tous les bits
// Mêmes paramètres que précédemment
AscendC::Rsqrt(tensorDest, tensorSrc, masqueBits, 4, { 1, 1, 8, 8 });
Calcul sur les n premiers éléments
// Appel standard
AscendC::Rsqrt(tensorDest, tensorSrc, 512);
// Configuration pour une précision de 0 ulp
static constexpr RsqrtConfig configRapide = { RsqrtAlgo::FAST_INVERSE };
Rsqrt<T, configRapide>(tensorDest, tensorSrc, 512);
// Calcul pour données subnormales
static constexpr RsqrtConfig configSubnormal = { RsqrtAlgo::PRECISION_0ULP_FTZ_FALSE };
Rsqrt<T, configSubnormal>(tensorDest, tensorSrc, 512);
Exemple de résultat :
Données source : [0.8335, 2.2, 2.672, ..., 2.312, 5.36]
Données destination : [1.094, 0.676, 0.6113, ..., 0.6562, 0.4316]