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

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

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

準備

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

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

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

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

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

使用例

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

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

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

この例は、デフォルトの DPC++ デバイスで計算を実行します。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));
        });
}

インテル® oneDPL RNG Pi ベンチマークの使用例

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

この例では、RNG エンジン・オブジェクト (擬似乱数のソース) と分布オブジェクト (確率分布の指定) を作成して乱数を生成し、正方形 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 に関する詳細な情報を提供します。

システム要件 (英語)

インテル® oneDPL をしンストールする前にシステム要件を確認してください。

インテル® oneAPI DPC++ ライブラリー (インテル® oneDPL) リリースノート (英語)

最新リリースでの変更点を確認できます。

インテル® oneDPL サンプル (英語)

サンプルを使用して、インテル® oneDPL の使用法を学べます。

Yocto* Project 用のレイヤー (英語)

meta-intel レイヤーを使用して Yocto* Project のビルドに oneAPI コンポーネントを追加します。

日本語最新情報

最新情報を日本語で参照できます。