SIMD IntrinsicsのC ++ラッパー
SIMD(単一命令、複数のデータ)は、長年にわたって利用可能なマイクロプロセッサの機能です。 SIMD命令は、一度に値のバッチで単一の操作を実行するため、コードの実行を大幅に加速する方法を提供します。ただし、これらの指示は、マイクロプロセッサベンダーとコンパイラ間で異なります。
xsimd 、図書館の著者にこれらの機能を使用するための統一された手段を提供します。つまり、単一の値と同じ算術演算子を持つ数値のバッチを操作できます。また、バッチで動作する一般的な数学関数の加速された実装も提供します。
XTENSORを超えて、XSIMDは、Mozilla Firefox、Apache Arrow、Pythran、Kritaなどの主要なオープンソースプロジェクトで採用されています。
XSIMDプロジェクトは、SIMDの本質的なラッパーを実装する方法に関する一連のブログ記事から始まりました。ブログのアーカイブは、C ++科学者のここにあります。記事に記載されているデザインは、バージョン8.0までXSIMDの実際のアーキテクチャに近いままでした。
数学的関数は、現在廃止されたboost.simdプロジェクトで最初に実装されたアルゴリズムの軽量の実装です。
xsimdには、C ++ 11の準拠コンパイラが必要です。次のC ++コンパイラがサポートされています。
| コンパイラ | バージョン |
|---|---|
| Microsoft Visual Studio | MSVC 2015アップデート2以上 |
| G ++ | 4.9以上 |
| クラン | 4.0以上 |
次のSIMD命令セット拡張機能がサポートされています。
| 建築 | 命令セット拡張機能 |
|---|---|
| x86 | SSE2、SSE3、SSSE3、SSE4.1、SSE4.2、AVX、AVX2、FMA3+SSE、FMA3+AVX、FMA3+AVX2 |
| x86 | avx512bw、avx512cd、avx512dq、avx512f(gcc7以上) |
| X86 AMD | FMA4 |
| アーム | Neon、Neon64、SVE128/256/512(ベクターサイズを固定) |
| WebAssembly | WASM |
| RISC-V | RISC-V128/256/512(ベクターサイズを固定) |
XSIMDのパッケージは、Mamba(またはConda)パッケージマネージャーで入手できます。
mamba install -c conda-forge xsimdXSIMDのパッケージは、Spack Package Managerで入手できます。
spack install xsimd
spack load xsimdcmakeを使用してソースから直接インストールできます。
cmake -D CMAKE_INSTALL_PREFIX=your_install_prefix .
make installxsimdの使用を開始するには、完全なドキュメントをご覧ください
http://xsimd.readthedocs.io/
xsimd 、XTLライブラリにオプションの依存関係があります。
xsimd | xtl (オプション) |
|---|---|
| マスター | ^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 |
xtl::xcomplexのベクトル化をサポートする場合は、 xtlへの依存関係が必要です。この場合、C ++ 14サポートを有効にしてプロジェクトを構築する必要があります。
ライブラリのバージョン8は完全に書き直されており、7.xバージョンにはわずかな違いがあります。移行ガイドはまもなく利用可能になります。その間、次の例は、ライブラリの両方のバージョン7と8の使用方法を示していますか?
以下は、AVX拡張がサポートされていると仮定して、4つのダブルフローティングポイント値の2セットの平均を計算する例です。
# 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 ;
}例を構築するときにAVX拡張機能を有効にすることを忘れないでください。 GCCまたはClangを使用すると、これは-mavxフラグで行われます。MSVCでは、 /arch:AVXオプションを渡す必要があります。
この例は出力します:
( 2.0 , 3.0 , 4.0 , 5.0 )ベクトルで動作し、利用可能な最もパフォーマンスのある命令セットを使用する同じ計算:
# 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 .;
}
}テストを構築するには、cmakeが必要です。
cmake 、ほとんどのLinuxディストリビューションのパッケージとして入手できます。その上、彼らはまた、 conda Package Manager(Windowsでも)でインストールすることもできます。
conda install -c conda-forge cmake cmakeがインストールされたら、テストを構築して実行できます。
mkdir build
cd build
cmake ../ -DBUILD_TESTS=ON
make xtest Travis CIとの継続的な統合のコンテキストでは、テストはconda環境で実行されます。
cd test
conda env create -f ./test-environment.yml
source activate test-xsimd
cd ..
cmake . -DBUILD_TESTS=ON
make xtestXSIMDのドキュメントは、3つのツールで構築されています
doxygenは個別にインストールする必要がありますが、入力して呼吸をインストールできます
pip install breathe呼吸はcondaとともに設置することもできます
conda install -c conda-forge breathe最後に、ドキュメントを作成します
make html docsサブディレクトリから。
共有著作権モデルを使用して、すべての貢献者が貢献の著作権を維持できるようにします。
このソフトウェアは、BSD-3-Clauseライセンスの下でライセンスされています。詳細については、ライセンスファイルを参照してください。