SIMD library
La bibliothèque SIMD fournit des types portables pour exprimer explicitement le parallélisme de données et structurer les données pour un accès SIMD plus efficace.
Un objet de type
simd<T>
se comporte de manière analogue aux objets de type
T
. Mais alors que
T
stocke et manipule une seule valeur,
simd<T>
stocke et manipule plusieurs valeurs (appelées
width
mais identifiées comme
size
pour la cohérence avec le reste de la bibliothèque standard ; cf.
simd_size
).
Chaque opérateur et opération sur
simd<T>
agit
élément par élément
(sauf pour les opérations
horizontales
, qui sont clairement indiquées comme telles). Cette règle simple exprime le parallélisme de données et sera utilisée par le compilateur pour générer des instructions SIMD et/ou des flux d'exécution indépendants.
La largeur des types
simd<T>
et
native_simd<T>
est déterminée par l'implémentation au moment de la compilation. En revanche, la largeur du type
fixed_size_simd<T, N>
est fixée par le développeur à une taille spécifique.
Un modèle recommandé pour utiliser un mélange de différents types SIMD avec une haute efficacité utilise native_simd et rebind_simd :
#include <experimental/simd> namespace stdx = std::experimental; using floatv = stdx::native_simd<float>; using doublev = stdx::rebind_simd_t<double, floatv>; using intv = stdx::rebind_simd_t<int, floatv>;
Cela garantit que l'ensemble des types ont la même largeur et peuvent donc être convertis mutuellement. Une conversion avec des largeurs incompatibles n'est pas définie car elle supprimerait des valeurs ou devrait inventer des valeurs. Pour les opérations de redimensionnement, la bibliothèque SIMD fournit les fonctions split et concat .
|
Défini dans l'en-tête
<experimental/simd>
|
Table des matières |
Classes principales
|
(parallelism TS v2)
|
type vectoriel parallèle en données
(modèle de classe) |
|
(parallelism TS v2)
|
type parallèle en données avec le type d'élément bool
(modèle de classe) |
Étiquettes ABI
|
Défini dans l'espace de noms
std::experimental::simd_abi
|
|
|
(parallelism TS v2)
|
type de balise pour stocker un seul élément
(typedef) |
|
(parallelism TS v2)
|
type de balise pour stocker un nombre spécifié d'éléments
(alias template) |
|
(parallelism TS v2)
|
type de balise qui garantit la compatibilité ABI
(alias template) |
|
(parallelism TS v2)
|
type de balise le plus efficace
(alias template) |
|
(parallelism TS v2)
|
le nombre maximum d'éléments garanti d'être supporté par fixed
(constant) |
|
(parallelism TS v2)
|
obtient un type ABI pour un type d'élément et un nombre d'éléments donnés
(class template) |
Balises d'alignement
|
(parallelism TS v2)
|
indicateur d'alignement de l'adresse de chargement/stockage sur l'alignement des éléments
(classe) |
|
(parallelism TS v2)
|
indicateur d'alignement de l'adresse de chargement/stockage sur l'alignement du vecteur
(classe) |
|
(parallelism TS v2)
|
indicateur d'alignement de l'adresse de chargement/stockage sur l'alignement spécifié
(modèle de classe) |
Expression Where
|
(parallelism TS v2)
|
éléments sélectionnés avec opérations non mutables
(modèle de classe) |
|
(parallelism TS v2)
|
éléments sélectionnés avec opérations mutables
(modèle de classe) |
|
(parallelism TS v2)
|
produit const_where_expression et where_expression
(modèle de fonction) |
Casts
|
(parallelism TS v2)
|
conversion élément par élément par static_cast
(modèle de fonction) |
|
(parallelism TS v2)
|
conversion ABI élément par élément
(modèle de fonction) |
|
(parallelism TS v2)
|
divise un objet simd unique en plusieurs objets
(modèle de fonction) |
|
(parallelism TS v2)
|
concatène plusieurs objets simd en un seul
(modèle de fonction) |
Algorithmes
|
(parallelism TS v2)
|
opération min élément par élément
(modèle de fonction) |
|
(parallelism TS v2)
|
opération max élément par élément
(modèle de fonction) |
|
(parallelism TS v2)
|
opération minmax élément par élément
(modèle de fonction) |
|
(parallelism TS v2)
|
opération clamp élément par élément
(modèle de fonction) |
Réduction
|
(parallelism TS v2)
|
réduit le vecteur à un seul élément
(modèle de fonction) |
Réduction de masque
|
(parallelism TS v2)
|
réductions de
simd_mask
en
bool
(modèle de fonction) |
|
(parallelism TS v2)
|
réduction de
simd_mask
au nombre de valeurs
true
(modèle de fonction) |
|
(parallelism TS v2)
|
réductions de
simd_mask
en l'indice de la première ou dernière valeur
true
(modèle de fonction) |
Traits
|
(parallelism TS v2)
|
vérifie si un type est un type
simd
ou
simd_mask
(modèle de classe) |
|
(parallelism TS v2)
|
vérifie si un type est un type de balise ABI
(modèle de classe) |
|
(parallelism TS v2)
|
vérifie si un type est un type de drapeau simd
(modèle de classe) |
|
(parallelism TS v2)
|
obtient le nombre d'éléments d'un type d'élément et d'une balise ABI donnés
(modèle de classe) |
|
(parallelism TS v2)
|
obtient un alignement approprié pour
vector_aligned
(modèle de classe) |
|
(parallelism TS v2)
|
change le type d'élément ou le nombre d'éléments de
simd
ou
simd_mask
(modèle de classe) |
Fonctions mathématiques
Toutes les fonctions dans
<cmath>
, à l'exception des fonctions mathématiques spéciales, sont surchargées pour
simd
.
Exemple
#include <experimental/simd> #include <iostream> #include <string_view> namespace stdx = std::experimental; void println(std::string_view name, auto const& a) { std::cout << name << ": "; for (std::size_t i{}; i != std::size(a); ++i) std::cout << a[i] << ' '; std::cout << '\n'; } template<class A> stdx::simd<int, A> my_abs(stdx::simd<int, A> x) { where(x < 0, x) = -x; return x; } int main() { const stdx::native_simd<int> a = 1; println("a", a); const stdx::native_simd<int> b([](int i) { return i - 2; }); println("b", b); const auto c = a + b; println("c", c); const auto d = my_abs(c); println("d", d); const auto e = d * d; println("e", e); const auto inner_product = stdx::reduce(e); std::cout << "inner product: " << inner_product << '\n'; const stdx::fixed_size_simd<long double, 16> x([](int i) { return i; }); println("x", x); println("cos²(x) + sin²(x)", stdx::pow(stdx::cos(x), 2) + stdx::pow(stdx::sin(x), 2)); }
Sortie :
a: 1 1 1 1 b: -2 -1 0 1 c: -1 0 1 2 d: 1 0 1 2 e: 1 0 1 4 inner product: 6 x: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 cos²(x) + sin²(x): 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Voir aussi
|
tableaux numériques, masques de tableau et tranches de tableau
(modèle de classe) |
Liens externes
| 1. | L'implémentation de la Section 9 "Types Parallèles de Données" de l'ISO/IEC TS 19570:2018 — github.com |
| 2. |
Implémentation TS disponible pour
GCC/libstdc++
(
std::experimental::simd
est livré avec GCC-11) — gcc.gnu.org
|