読者です 読者をやめる 読者になる 読者になる

C++1y SIMDライブラリの提案

C++

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_forsimd_for_chunkといった、内部的にSIMD命令で処理されるfor文を提供する案です。


どちらも、すでに実装があって試せるので、その使用経験に基いて採用が決まることになるのだと思います。個人的には、構文やノーテーションでの提供は、抽象化と相性が悪いと思っているので、ライブラリベースが好みです。