Pembungkus C ++ untuk intrinsik SIMD
SIMD (instruksi tunggal, beberapa data) adalah fitur mikroprosesor yang telah tersedia selama bertahun -tahun. Instruksi SIMD melakukan operasi tunggal pada batch nilai sekaligus, dan dengan demikian memberikan cara untuk secara signifikan mempercepat eksekusi kode. Namun, instruksi ini berbeda antara vendor mikroprosesor dan kompiler.
xsimd menyediakan sarana terpadu untuk menggunakan fitur -fitur ini untuk penulis perpustakaan. Yaitu, ini memungkinkan manipulasi batch angka dengan operator aritmatika yang sama seperti untuk nilai tunggal. Ini juga menyediakan implementasi fungsi matematika umum yang beroperasi pada batch.
Di luar Xtensor, Xsimd telah diadopsi oleh proyek-proyek sumber terbuka utama, seperti Mozilla Firefox, Apache Arrow, Pythran, dan Krita.
Proyek XSIMD dimulai dengan serangkaian artikel blog oleh Johan Mabille tentang cara mengimplementasikan pembungkus untuk intrinsik SIMD. Arsip blog dapat ditemukan di sini: ilmuwan C ++. Desain yang dijelaskan dalam artikel tetap dekat dengan arsitektur XSIMD hingga versi 8.0.
Fungsi matematika adalah implementasi yang ringan dari algoritma yang awalnya diterapkan dalam proyek Boost.
xsimd membutuhkan kompiler yang sesuai dengan C ++ 11. Kompiler C ++ berikut didukung:
| Penyusun | Versi |
|---|---|
| Microsoft Visual Studio | MSVC 2015 UPDATE 2 dan di atas |
| G ++ | 4.9 ke atas |
| dentang | 4.0 dan di atas |
Ekstensi set instruksi SIMD berikut didukung:
| Arsitektur | Instruksi mengatur ekstensi |
|---|---|
| x86 | SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, FMA3+SSE, FMA3+AVX, FMA3+AVX2 |
| x86 | AVX512BW, AVX512CD, AVX512DQ, AVX512F (GCC7 dan lebih tinggi) |
| x86 AMD | FMA4 |
| LENGAN | Neon, Neon64, SVE128/256/512 (ukuran vektor tetap) |
| WebAssembly | Wasm |
| Risc-v | RISC-V128/256/512 (ukuran vektor tetap) |
Paket untuk XSIMD tersedia di paket paket Mamba (atau Conda).
mamba install -c conda-forge xsimdPaket untuk XSIMD tersedia di Spack Package Manager.
spack install xsimd
spack load xsimdAnda dapat langsung menginstalnya dari sumber dengan CMake:
cmake -D CMAKE_INSTALL_PREFIX=your_install_prefix .
make install Untuk memulai dengan menggunakan xsimd , lihat dokumentasi lengkapnya
http://xsimd.readthedocs.io/
xsimd memiliki ketergantungan opsional pada perpustakaan XTL:
xsimd | xtl (opsional) |
|---|---|
| menguasai | ^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 |
Diperlukan ketergantungan pada xtl jika Anda ingin mendukung vektorisasi untuk xtl::xcomplex . Dalam hal ini, Anda harus membangun proyek Anda dengan dukungan C ++ 14 diaktifkan.
Versi 8 dari perpustakaan adalah penulisan ulang lengkap dan ada beberapa perbedaan dengan versi 7.x. Panduan migrasi akan segera tersedia. Sementara itu, contoh -contoh berikut menunjukkan cara menggunakan kedua versi 7 dan 8 perpustakaan?
Berikut adalah contoh yang menghitung rata -rata dua set dari 4 nilai titik mengambang ganda, dengan asumsi ekstensi AVX didukung:
# 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 ;
} Jangan lupa untuk mengaktifkan ekstensi AVX saat membangun contoh. Dengan GCC atau Clang, ini dilakukan dengan bendera -mavx , di MSVC Anda harus lulus opsi /arch:AVX .
Contoh ini output:
( 2.0 , 3.0 , 4.0 , 5.0 )Perhitungan yang sama beroperasi pada vektor dan menggunakan set instruksi paling berkinerja yang tersedia:
# 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 .;
}
}Membangun tes membutuhkan cmake.
cmake tersedia sebagai paket untuk sebagian besar distribusi Linux. Selain itu, mereka juga dapat diinstal dengan conda Package Manager (bahkan di Windows):
conda install -c conda-forge cmake Setelah cmake dipasang, Anda dapat membangun dan menjalankan tes:
mkdir build
cd build
cmake ../ -DBUILD_TESTS=ON
make xtest Dalam konteks integrasi berkelanjutan dengan Travis CI, tes dijalankan di lingkungan conda , yang dapat diaktifkan
cd test
conda env create -f ./test-environment.yml
source activate test-xsimd
cd ..
cmake . -DBUILD_TESTS=ON
make xtestDokumentasi XSIMD dibangun dengan tiga alat
Saat doxygen harus dipasang secara terpisah, Anda dapat menginstal napas dengan mengetik
pip install breathe Breathe juga dapat dipasang dengan conda
conda install -c conda-forge breatheAkhirnya, bangun dokumentasi dengan
make html dari subdirektori docs .
Kami menggunakan model hak cipta bersama yang memungkinkan semua kontributor untuk mempertahankan hak cipta atas kontribusi mereka.
Perangkat lunak ini dilisensikan di bawah lisensi BSD-3-Clause. Lihat file lisensi untuk detailnya.