Vc は現在メンテナンス モードにあり、積極的に開発されていません。ただし、コミュニティからのバグ修正を含むプル リクエストのレビューは継続します。
std-simd への切り替えに興味があるかもしれません。 GCC 11 には、libstdc++ の一部としてstd::simd
の実験版が含まれており、これも Clang で動作します。 Vc 1.4 には存在するがstd-simdには存在しない機能は、最終的には Vc 2.0 になり、その後std-simdに依存します。
最近の世代の CPU、特に GPU では、効率を最大限に高めるためにデータ並列コードが必要です。データの並列処理では、同じ一連の操作を異なる入力データに適用する必要があります。したがって、CPU と GPU は、命令のデコードとスケジューリングに必要なハードウェアを削減し、同じ命令を同期して実行する算術論理演算ユニットを増やすことができます。 CPU アーキテクチャでは、これは SIMD レジスタと命令を介して実装されます。 1 つの SIMD レジスタは N 個の値を格納でき、1 つの SIMD 命令はそれらの値に対して N 個の演算を実行できます。 GPU アーキテクチャでは、単一の命令デコーダ/スケジューラによって N 個のスレッドが完全に同期して実行されます。各スレッドにはローカル メモリと、ロードおよびストアのメモリ内のオフセットを計算するための指定されたインデックスがあります。
現在の C++ コンパイラーは、スカラー コードを SIMD 命令に自動変換 (自動ベクトル化) できます。ただし、コンパイラは、開発者が C++ で純粋にスカラー実装を作成したときに失われたアルゴリズムの固有プロパティを再構築する必要があります。したがって、C++ コンパイラーは、指定されたコードを最も効率的なデータ並列バリアントにベクトル化できません。特に、複数の関数や変換単位にまたがる大規模なデータ並列ループは、効率的な SIMD コードに変換されないことがよくあります。
Vc ライブラリは欠落しているリンクを提供します。その型を使用すると、複数の値に対するデータ並列操作を明示的に記述することができます。したがって、並列処理は型システムを介して追加されます。競合するアプローチでは、新しい制御構造を介して並列処理が行われ、その結果、これらの制御構造の本体内で新しいセマンティクスが確立されます。
Vc は、C++ コードの明示的なベクトル化を容易にする無料のソフトウェア ライブラリです。これは直感的な API を備えており、異なるコンパイラおよびコンパイラ バージョン間での移植性、および異なるベクトル命令セット間での移植性を提供します。したがって、Vc で書かれたアプリケーションは次のようにコンパイルできます。
Intel が ICC 18 で MIC サポートを終了した後、Vc 1.4 もそのサポートを削除しました。
std::vector<Particle>
の合計運動量と時間ステップstd::vector<float>
に対する反復simdize
を示す N-vortex ソルバー。プレーンな-mavx2 -mfma
と比較して、 -march
フラグがいかに重要であるかに注意してください。組み込み浮動小数点を使用して 3D スカラー積を計算するコードから始めましょう。
using Vec3D = std::array< float , 3 >;
float scalar_product (Vec3D a, Vec3D b) {
return a[ 0 ] * b[ 0 ] + a[ 1 ] * b[ 1 ] + a[ 2 ] * b[ 2 ];
}
Vc を使用すると、 float_v
型を使用してコードを簡単にベクトル化できます。
using Vc::float_v
using Vec3D = std::array<float_v, 3 >;
float_v scalar_product (Vec3D a, Vec3D b) {
return a[ 0 ] * b[ 0 ] + a[ 1 ] * b[ 1 ] + a[ 2 ] * b[ 2 ];
}
上記は、ターゲット ハードウェアの機能に応じて、並列計算される 1、4、8、16 などのスカラー積にスケールされます。
比較のために、インテル SSE 組み込み関数を使用した同じベクトル化はより冗長で、接頭辞表記 (つまり、関数呼び出し) を使用します。
using Vec3D = std::array<__m128, 3 >;
__m128 scalar_product (Vec3D a, Vec3D b) {
return _mm_add_ps ( _mm_add_ps ( _mm_mul_ps (a[ 0 ], b[ 0 ]), _mm_mul_ps (a[ 1 ], b[ 1 ])),
_mm_mul_ps (a[ 2 ], b[ 2 ]));
}
上記は AVX、AVX-512 などに拡張できず、他の SIMD ISA に移植することもできません。
cmake >= 3.0
C++11 コンパイラ:
git clone https://github.com/VcDevel/Vc.git
cd Vc
git submodule update --init
$ mkdir build
$ cd build
$ cmake ..
必要に応じて、インストール ディレクトリを指定します。
$ cmake -DCMAKE_INSTALL_PREFIX=/opt/Vc ..
必要に応じて、単体テストの構築を含めます。
$ cmake -DBUILD_TESTING=ON ..
Windows では、複数のバージョンの Visual Studio がインストールされている場合は、次のいずれかを選択できます。
$ cmake -G " Visual Studio 16 2019 " ..
使用可能なジェネレーターのリストについては、 cmake --help
参照してください。
$ cmake --build . -j 16
$ cmake --install . # may require permissions
Windows では、Visual Studio でVc.sln
開いて、IDE からビルド/インストールすることもできます。
ドキュメントは doxygen 経由で生成されます。 doc
サブディレクトリでdoxygen
実行すると、ドキュメントを構築できます。あるいは、次の場所でドキュメントの夜間ビルドを見つけることができます。
Vc の機能を C++ 標準ライブラリに統合する作業を行います。
Vc は、3 条項 BSD ライセンスの条件に基づいてリリースされます。