インテル® oneAPI DPC++ ライブラリー (インテル® oneDPL) は、インテル® oneAPI DPC++/C++ コンパイラーと連携して、開発者に生産性の高い API を提供します。さまざまなデバイスにわたるハイパフォーマンス並列アプリケーションの SYCL* プログラミング作業を最小限に抑えることができます。

インテル® oneDPL には、次のコンポーネントが含まれます。

インテル® oneDPL についての一般的な情報は、oneDPL GitHub* リポジトリー (英語)、インテル® oneAPI DPC++ ライブラリー・ガイド (英語)、インテル® oneAPI DPC++ ライブラリーの製品ページ (英語) を参照してください。

インストール

インテル® oneDPL の「リリースノート」 (英語) の次のセクションを確認します。

インテル® oneDPL を使用するには、インテル® oneAPI ベース・ツールキット (ベースキット) をインストールします。

並列 API を使用するには、対応するヘッダーファイルをソースコードにインクルードします。

すべてのインテル® oneDPL ヘッダーファイルは、oneapi/dpl ディレクトリーにあります。#include <oneapi/dpl/…> でインクルードします。インテル® oneDPL のほとんどのクラスと関数は、oneapi::dpl 名前空間を使用します。

検証済みの C++ 標準 API を使用するには、対応する C++ 標準ヘッダーファイルをインクルードして、std 名前空間を使用する必要があります。

pkg-config のサポート

インストールされているライブラリーに関する情報を取得し、1 つ以上のライブラリーをコンパイルおよびリンクするには、pkg-config プログラムを使用します。

pkg-config をインテル® oneDPL で使用する

pkg-config を --cflags フラグとともに使用して、インテル® oneDPL ディレクトリーのインクルード・パスを取得します。

dpcpp test.cpp $(pkg-config --cflags dpl)

Microsoft* Visual C++* コンパイラーを使用する場合は、--msvc-syntax フラグが必要です。このフラグを指定すると、コンパイルフラグとリンクフラグが適切な形式に変換されます。

dpcpp test.cpp $(pkg-config --msvc-syntax --cflags dpl)

注: pkg-config ツールを使用すると、ハードコーディングされた長いパスを使用しなくてすむため、コンパイルの移植性が高まります。

使用例

インテル® oneDPL のサンプルコードは oneAPI GitHub* サンプル・リポジトリー (英語) から入手できます。各サンプルには、ビルド手順を含む README があります。

<oneapi/dpl/random> ヘッダーの使用例

このサンプルは、インテル® oneDPL 乱数ジェネレーターの使い方を説明します。乱数ジェネレーター・エンジン・オブジェクト (疑似乱数のソース)、分布オブジェクト (確率分布の指定)、および乱数そのものの生成方法を示します。乱数ジェネレーターは、計算速度を向上するためベクトル化されます。

この例は、デフォルトの SYCL* デバイスで計算を実行します。SYCL_DEVICE_TYPE 環境変数を CPU または GPU に設定できます。

template<int VecSize>
void random_fill(float* usmptr, std::size_t n) {
    auto zero = oneapi::dpl::counting_iterator<std::size_t>(0);

    std::for_each(oneapi::dpl::execution::dpcpp_default,
        zero, zero + n/VecSize,
        [usmptr](std::size_t i) {
            auto offset = i * VecSize;

            oneapi::dpl::minstd_rand_vec<VecSize> engine(seed, offset);
            oneapi::dpl::uniform_real_distribution<sycl::vec<float, VecSize>> distr;

            auto res = distr(engine);
            res.store(i, sycl::global_ptr<float>(usmptr));
        });
}

Pi ベンチマークの使用例

この例は、モンテカルロ法を使用して π の値を推定します。基本的な考え方は、正方形の中にランダムな点を生成し、そのランダムな点のうち何割が正方形に内接する 1/4 円の中にあるかを調べるというものです。期待値は、1/4 円と正方形の面積の比 (π/4) です。観測された 1/4 円の中にある点の割合を、π/4 の推定値とすることができます。

この例では、乱数ジェネレーター・エンジン・オブジェクト (擬似乱数のソース) と分布オブジェクト (確率分布の指定) を作成して乱数を生成し、正方形 S に収まる点の数をカウントするリダクションを実行します。コードを簡素化するため、乱数生成はスカラー形式で実行されます。

π グラフ
float estimated_pi;
{
    sycl::queue q(sycl::gpu_selector{});
    auto policy = oneapi::dpl::execution::make_device_policy(q);

    float sum = std::transform_reduce( policy,
                                      oneapi::dpl::counting_iterator<int>(0),
                                      oneapi::dpl::counting_iterator<int>(N),
                                      0.0f,
                                      std::plus<float>{},
                                      [=](int n){
                                          float local_sum = 0.0f;
                                          oneapi::dpl::minstd_rand engine(SEED, n * ITER * 2);
                                          oneapi::dpl::uniform_real_distribution<float> distr;
                                          for(int i = 0; i < ITER; ++i) {
                                              float x = distr(engine);
                                              float y = distr(engine);
                                              if (x * x + y * y <= 1.0)
                                                  local_sum += 1.0;
                                          }
                                          return local_sum / (float)ITER;
                                      }
    );
    estimated_pi = 4.0f * (float)sum / N;
}

関連情報

リソースのリンク 説明
インテル® oneAPI DPC++ ライブラリー・ガイド (英語) インテル® oneDPL に関する詳細な情報を提供します。
システム要件 (英語) インテル® oneDPL をしンストールする前にシステム要件を確認してください。
インテル® oneAPI DPC++ ライブラリー・リリースノート (英語) 最新リリースでの変更点を確認できます。
インテル® oneDPL サンプル (英語) サンプルを使用して、インテル® oneDPL の使用法を学べます。
Yocto* Project 用のレイヤー (英語) meta-intel レイヤーを使用して Yocto* Project のビルドに oneAPI コンポーネントを追加します。
日本語最新情報 最新情報を日本語で参照できます。