Select
L'asc-devkit est le langage de développement de programmes d'opérateurs dédié aux processeurs AI Ascend de Huawei CANN. Il supporte nativement les normes C et C++ et est principalement composé d'une bibliothèque de classes et d'une couche d'extensions linguistiques, fournissant une API multi-niveaux pour répondre aux besoins de développement d'opérateurs dans diverses scénarios.
Compatibilité matérielle
| Produit | Support |
|---|---|
| Ascend 950PR / Ascend 950DT | Oui |
| Séries d'entraînement / inférence Atlas A3 | Non |
| Séries d'entraînement / inférence Atlas A2 | Non |
| Produits d'inférence Atlas 200I/500 A2 | Non |
| Produits d'inférence Atlas AI Core | Non |
| Produits d'inférence Atlas Vector Core | Non |
| Séries d'entraînement Atlas | Non |
Description fonctionnelle
À partir de deux opérandes sources srcReg0 et srcReg1, la fonction sélectionne les éléments en fonction des bits du masque pour produire l'opérande destination dstReg. La règle de sélection est la suivante : lorsqu'un bit du masque vaut 1, l'élément correspondant est pris depuis srcReg0 ; lorsque le bit vaut 0, l'élément proveint de srcReg1.
Prototype de la fonction
template <typename T = DefaultType, typename U>
__simd_callee__ inline void Select(U& dstReg, U& srcReg0, U& srcReg1, MaskReg& mask)
Paramètres
Paramètres template
| Nom | Description |
|---|---|
| T | Type de données des opérandes. Pour les Ascend 950PR/950DT, les types supportés sont : bool, uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, half, float, bfloat16_t, uint64_t, int64_t. |
| U | Type RegTensor des opérandes sources et destination, par exemple RegTensor<half>. Ce type est déduit automatiquement par le compilateur. |
Paramètres de la fonction
| Nom | Entrée/Sortie | Description |
|---|---|---|
| dstReg | Sortie | Opérande destination, de type RegTensor. |
| srcReg0, srcReg1 | Entrée | Opérandes sources, de type RegTensor. Leurs types de données doivent correspondre à celui de la destination. |
| mask | Entrée | Définit la règle de sélection : un bit à 1 dans le masque entraîne la sélection dans srcReg0, un bit à 0 la sélection dans srcReg1. |
Valeur de retour
Aucune.
Contraintes
Aucune.
Exemple d'appel
template<typename T>
__simd_vf__ inline void ProcessSelection(__ubuf__ T* output, __ubuf__ T* inputA, __ubuf__ T* inputB,
uint32_t elementCount, uint32_t blockSize, uint16_t blocks)
{
AscendC::Reg::RegTensor<T> regA;
AscendC::Reg::RegTensor<T> regB;
AscendC::Reg::RegTensor<T> resultReg;
AscendC::Reg::MaskReg selMask;
AscendC::Reg::MaskReg conditionMask;
for (uint16_t blockIdx = 0; blockIdx < blocks; blockIdx++) {
selMask = AscendC::Reg::UpdateMask<T>(elementCount);
AscendC::Reg::LoadAlign(regA, inputA + blockIdx * blockSize);
AscendC::Reg::LoadAlign(regB, inputB + blockIdx * blockSize);
AscendC::Reg::Compare<T, AscendC::CMPMODE::EQ>(conditionMask, regA, regB, selMask);
AscendC::Reg::Select(resultReg, regA, regB, conditionMask);
AscendC::Reg::StoreAlign(output + blockIdx * blockSize, resultReg, selMask);
}
}