N3571 A Proposal to add Single Instruction Multiple Data Computation to the Standard Library
ひとつのCPU命令で複数のデータを操作する、SIMD(Single Instruction Multiple Data)を抽象化したライブラリの提案。これは、スレッドを使用するタスク並列性に対して、データ並列性と呼ばれている分野の技術です。
この提案は、Boost.SIMDとしてBoostに提案される予定のライブラリが元になっています。Boost.SIMDについては、私が翻訳したスライド資料もあるので、合わせて参照してください(Boost.SIMDによる実用的なSIMDアクセラレーション)。
このライブラリは、SIMDを抽象化したpack
型と、それに対して操作を行うaccumulate()
やtransform()
といったアルゴリズムを提供します。
int main() { float s; std::vector<float, simd::allocator<float> > v = {1 , -2 ,3 , -4}; // 初期化子リストでpackを構築 pack<float> x{1 ,2 ,3 ,4}; // load関数の使い方 pack<float> b = std::simd::load<std::simd::pack<float> >(&v[0]); // スカラ値からpackを構築 pack<float> a(1.37); // packのデフォルト構築 pack<float> r; // 演算子と関数呼び出し r += std::simd::min(a*x+b,b); // accumulateアルゴリズムを使用する r[0] = 1.f + r[0]; s = accumulate(r.begin(), r.end(), 0.f); return 0; }
# pack
型の定義を見て、以下のようなアラインメントの指定ができることを初めて知りました。
template <class T, std :: size_t N = unspecified> struct alignas(sizeof(T)*N) pack;
Boost Developer MLで、フィードバックを募集しているようです。
Going forward with Boost.SIMD - boost.devel
また、Boost.SIMDのライブラリベースの提案のほかに、SIMDの言語命令サポートの提案も出ています。
N3561 Semantics of Vector Loops
simd_for (int i = 0; i < n; ++i) { y[i] += a*x[i]; z[i] -= b*x[i]; }
こちらは、IntelのCilk Plusベースですね。simd_for
やsimd_for_chunk
といった、内部的にSIMD命令で処理されるfor文を提供する案です。
どちらも、すでに実装があって試せるので、その使用経験に基いて採用が決まることになるのだと思います。個人的には、構文やノーテーションでの提供は、抽象化と相性が悪いと思っているので、ライブラリベースが好みです。