C ++ Wrapper für SIMD -Intrinsics
SIMD (einzelne Anweisungen, mehrere Daten) ist eine Funktion von Mikroprozessoren, die seit vielen Jahren zur Verfügung stehen. SIMD -Anweisungen führen eine einzelne Operation auf einer Stapel von Werten gleichzeitig aus und bieten somit eine Möglichkeit, die Codeausführung erheblich zu beschleunigen. Diese Anweisungen unterscheiden sich jedoch zwischen Mikroprozessor -Anbietern und Compilern.
xsimd bietet ein einheitliches Mittel zur Verwendung dieser Funktionen für Bibliotheksautoren. Es ermöglicht nämlich die Manipulation von Zahlenstapeln mit denselben arithmetischen Operatoren wie bei Einzelwerten. Es bietet auch eine beschleunigte Implementierung gemeinsamer mathematischer Funktionen, die auf Chargen arbeiten.
Beyond Xtensor wurde XSIMD von großen Open-Source-Projekten wie Mozilla Firefox, Apache Arrow, Pythran und Krita übernommen.
Das XSIMD -Projekt begann mit einer Reihe von Blog -Artikeln von Johan Mabille, um Wrapper für SIMD -Intrinsicts zu implementieren. Die Archive des Blogs finden Sie hier: der C ++ - Wissenschaftler. Das in den Artikeln beschriebene Design blieb bis Version 8.0 nahe der tatsächlichen Architektur von XSIMD.
Die mathematischen Funktionen sind eine leichte Implementierung der Algorithmen, die ursprünglich im jetzt veralteten Boost.Simd -Projekt implementiert wurden.
xsimd benötigt einen C ++ 11 -konformen Compiler. Die folgenden C ++ - Compiler werden unterstützt:
| Compiler | Version |
|---|---|
| Microsoft Visual Studio | MSVC 2015 Update 2 und höher |
| G ++ | 4.9 und höher |
| Klang | 4.0 und höher |
Die folgenden Extensionen der SIMD -Anweisungssatz werden unterstützt:
| Architektur | Anweisungssatzerweiterungen |
|---|---|
| x86 | SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, FMA3+SSE, FMA3+AVX, FMA3+AVX2 |
| x86 | AVX512BW, AVX512CD, AVX512DQ, AVX512F (GCC7 und höher) |
| x86 AMD | Fma4 |
| ARM | Neon, Neon64, SVE128/256/512 (feste Vektorgröße) |
| WebAssembly | Wasm |
| RISC-V | RISC-V128/256/512 (feste Vektorgröße) |
Ein Paket für XSIMD ist im Paketmanager von Mamba (oder Conda) erhältlich.
mamba install -c conda-forge xsimdEin Paket für XSIMD ist im Spack -Paket -Manager verfügbar.
spack install xsimd
spack load xsimdSie können es direkt mit CMake aus den Quellen installieren:
cmake -D CMAKE_INSTALL_PREFIX=your_install_prefix .
make install Um mit xsimd zu beginnen, lesen Sie die vollständige Dokumentation
http://xsimd.readthedocs.io/
xsimd hat eine optionale Abhängigkeit von der XTL -Bibliothek:
xsimd | xtl (optional) |
|---|---|
| Master | ^0,7,0 |
| 12.x | ^0,7,0 |
| 11.x | ^0,7,0 |
| 10.x | ^0,7,0 |
| 9.x | ^0,7,0 |
| 8.x | ^0,7,0 |
Die Abhängigkeit von xtl ist erforderlich, wenn Sie die Vektorisierung für xtl::xcomplex unterstützen möchten. In diesem Fall müssen Sie Ihr Projekt mit C ++ 14 -Unterstützung erstellen.
Die Version 8 der Bibliothek ist ein komplettes Umschreiben und es gibt einige geringfügige Unterschiede mit 7.x -Versionen. Ein Migrationshandbuch wird in Kürze verfügbar sein. In der Zwischenzeit zeigen die folgenden Beispiele, wie beide Versionen 7 und 8 der Bibliothek verwendet werden.
Hier ist ein Beispiel, das den Mittelwert von zwei Sätzen von 4 Doppel -Schwimmpunktwerten berechnet, sofern die AVX -Erweiterung unterstützt wird:
# include < iostream >
# include " xsimd/xsimd.hpp "
namespace xs = xsimd;
int main ( int argc, char * argv[])
{
xs::batch< double , xs::avx2> a = { 1.5 , 2.5 , 3.5 , 4.5 };
xs::batch< double , xs::avx2> b = { 2.5 , 3.5 , 4.5 , 5.5 };
auto mean = (a + b) / 2 ;
std::cout << mean << std::endl;
return 0 ;
} Vergessen Sie nicht, AVX -Erweiterung beim Erstellen des Beispiels zu aktivieren. Mit GCC oder Clang erfolgt dies mit dem -mavx -Flag, auf MSVC müssen Sie die Option /arch:AVX übergeben.
Dieses Beispiel gibt aus:
( 2.0 , 3.0 , 4.0 , 5.0 )Die gleiche Berechnung, die auf Vektoren arbeitet und den am besten verfügbaren Anweisungssatz verwendet:
# include < cstddef >
# include < vector >
# include " xsimd/xsimd.hpp "
namespace xs = xsimd;
using vector_type = std::vector< double , xsimd::aligned_allocator< double >>;
void mean ( const vector_type& a, const vector_type& b, vector_type& res)
{
std:: size_t size = a. size ();
constexpr std:: size_t simd_size = xsimd::simd_type< double >::size;
std:: size_t vec_size = size - size % simd_size;
for (std:: size_t i = 0 ; i < vec_size; i += simd_size)
{
auto ba = xs::load_aligned (&a[i]);
auto bb = xs::load_aligned (&b[i]);
auto bres = (ba + bb) / 2 .;
bres. store_aligned (&res[i]);
}
for (std:: size_t i = vec_size; i < size; ++i)
{
res[i] = (a[i] + b[i]) / 2 .;
}
}Das Erstellen der Tests erfordert CMake.
cmake ist als Paket für die meisten Linux -Verteilungen erhältlich. Außerdem können sie auch mit dem conda Paket Manager (sogar unter Windows) installiert werden:
conda install -c conda-forge cmake Sobald cmake installiert ist, können Sie die Tests erstellen und ausführen:
mkdir build
cd build
cmake ../ -DBUILD_TESTS=ON
make xtest Im Zusammenhang mit der kontinuierlichen Integration mit Travis CI werden Tests in einer conda -Umgebung durchgeführt, die mit aktiviert werden kann
cd test
conda env create -f ./test-environment.yml
source activate test-xsimd
cd ..
cmake . -DBUILD_TESTS=ON
make xtestDie Dokumentation von Xsimd ist mit drei Werkzeugen erstellt
Während Doxygen separat installiert werden muss, können Sie Breathe durch Eingabe installieren
pip install breathe Atem kann auch mit conda installiert werden
conda install -c conda-forge breatheErstellen Sie schließlich die Dokumentation mit
make html Aus dem Unterverzeichnis docs .
Wir verwenden ein gemeinsam genutztes Urheberrechtsmodell, mit dem alle Mitwirkenden das Urheberrecht über ihre Beiträge aufrechterhalten können.
Diese Software ist unter der BSD-3-Klausel-Lizenz lizenziert. Weitere Informationen finden Sie in der Lizenzdatei.