この記事は、oneapi-src/oneAPI-samples (英語) で公開されている Base: Vector Add Sample を iSUS で翻訳した日本語参考訳です。原文は更新される可能性があります。原文と翻訳文の内容が異なる場合は原文を優先してください。
ベース: ベクトル加算は、データ並列プログラムの Hello, World! サンプルに相当します。ここでは、SYCL の主要機能を示しています。さらに、このサンプルをビルドして実行すると、開発環境がインテル® oneAPI ツールキット (英語) 向けに正しく構成されていることが確認できます。
| 内容 | 説明 |
|---|---|
| ガイドの内容 | SYCL を使用して計算を CPU とアクセラレーターにオフロードする方法 |
| 所要時間 | ~ 15 分 |
| カテゴリー | 導入ガイド |
目的
ベース: ベクトル加算は、2 つの大きな整数ベクトルを加算し、その結果を検証する比較的単純なプログラムです。このプログラムは、インテル® CPU およびアクセラレーター用の C++ および SYCL の機能を使用します。このサンプルのコードを確認することで、C++ コードを使用して計算を GPU にオフロードする方法を学習できます。これには、統合共有メモリー (USM) とバッファーの使用が含まれます。
- USM では、カーネル上の非同期計算が完了するまで明示的に待機する必要があります。
- スコープ外になると、バッファーはメインメモリーとデバイスメモリーを暗黙的に同期します。イベントを明示的に待機する必要はありません。
このサンプルでは、統合共有メモリー (USM) とバッファーの両方の実装例を比較します。
注: インテル® oneAPI ツールキットを使用して CPU、GPU、FPGA デバイス用の SYCL 準拠アプリケーションを開発する方法を詳しく学習する別の入門サンプルを調べるには、単純な加算のサンプルを参照してください。
要件
| 最適化 | 説明 |
|---|---|
| OS | Ubuntu 18.04 Windows 10 |
| ハードウェア | GEN9 以降 インテル® Agilex® 7、Arria® 10、および Stratix® 10 FPGA |
| ソフトウェア | インテル® oneAPI DPC++/C++ コンパイラー |
注: インテル® oneAPI DPC++/C++ コンパイラーは、CPU、GPU、FPGA エミュレーションのコンパイル、FPGA レポートの生成、FPGA の RTL の生成には十分ですが、FPGA シミュレーション・フローと FPGA コンパイルには追加のソフトウェアが必要です。
シミュレーター・フローを使用するには、インテル® Quartus® Prime Pro エディションと次のいずれかのシミュレーターがインストールされ、PATH によりアクセスできる必要があります:
- Questa – インテル® FPGA エディション
- Questa – インテル® FPGA スターター・エディション
- ModelSim® SE
ハードウェア・コンパイル・フローを使用には、インテル® Quartus® Prime Pro エディションがインストールされ、PATH 経由でアクセスできる必要があります。警告 ターゲットとする FPGA に関連付けられたデバイスファイルを、インテル® Quartus® Prime インストールに必ず追加してください。
主な実装の詳細
コードで説明されている基本 SYCL 実装には、デバイスセレクター、USM、バッファー、アクセサー、カーネル、およびコマンドグループが含まれます。
コードは利用可能な GPU 上で実行を試み、互換性のある GPU が検出されない場合、システムの CPU にフォールバックします。成功した場合、オフロードデバイスの名前と成功メッセージが表示され、開発環境が正しく設定されていることが示されます。
さらに、以下の手順で FPGA デバイスをターゲットにすることもできます。FPGA ハードウェアが存在しない場合、サンプルはエミュレーション・モードで実行され、設計分析用の静的最適化レポートが含まれます。
注: oneAPI プログラミングに関する包括的な情報は、インテル® oneAPI プログラミング・ガイドを参照してください。(関連情報を素早く見つけるには、検索または目次を使用してください。)
環境変数の設定
コマンドライン・インターフェイス (CLI) を使用する場合、環境変数を使用して oneAPI ツールキットを構成する必要があります。新しいターミナルウィンドウを開くたびに setvars スクリプトを実行して、CLI 環境を設定します。この方法により、コンパイラー、ライブラリー、およびツールの開発準備が整っていることが保証されます。
ベース: ベクトル加算サンプルのビルド
注: 環境を設定していない場合、oneAPI インストールのルートにある setvars スクリプトを source して CLI 環境をセットアップします。
Linux:
- システム全体へのインストールの場合:
. /opt/intel/oneapi/setvars.sh - プライベート・インストールの場合:
. ~/intel/oneapi/setvars.sh - csh など非 POSIX シェルの場合、次のコマンドを使用します:
bash -c 'source <install-dir>/setvars.sh ; exec csh'
Windows:
C:\"Program Files (x86)"\Intel\oneAPI\setvars.bat- Windows PowerShell では、次のコマンドを使用します:
cmd.exe "/K" '"C:\Program Files (x86)\Intel\oneAPI\setvars.bat" && powershell'
環境変数の設定の詳細については、Linux* で setvars および oneapi-vars スクリプトを使用または Windows* で setvars および oneapi-vars スクリプトを使用を参照してください。
Visual Studio Code (VS Code) を使用する (オプション)
Visual Studio Code (VS Code) 拡張機能を使用して、環境の設定、起動構成の作成、サンプルの参照とダウンロードを行うことができます。
VS Code を使用してサンプルをビルドおよび実行する基本的な手順を次に示します:
- インテル® oneAPI ツールキットの拡張機能である環境設定ツールを使用して、oneAPI 環境を構成します。
- インテル® oneAPI ツールキットの拡張機能であるサンプル・コード・ブラウザーを使用して、サンプルをダウンロードします。
- VS Code でターミナルを開きます ([ターミナル] > [新しいターミナル])。
- 以下の手順に従って、VS Code ターミナルでサンプルを実行します。
拡張機能と oneAPI 環境の構成方法の詳細については、Visual Studio Code でインテル® oneAPI ツールキットを使用するユーザーガイド (英語) を参照してください。
Linux
ビルドシステムを設定
サンプル・ディレクトリーに移動します。
バッファーベースの実装を使用するようにプロジェクトを構成します。
mkdir build cd build cmake ..または
統合共有メモリー (USM) ベースの実装を使用するようにプロジェクトを構成します。
mkdir build cd build cmake .. -DUSM=1注: FPGA 用にビルドする場合は、デフォルトの FPGA ファミリー (インテル® Agilex® 7) が使用されます。次のコマンドでデフォルトのターゲットを変更できます:
cmake .. -DFPGA_DEVICE=<FPGA device family or FPGA part number>あるいは、次のコマンドで明示的な FPGA ボードバリアントと BSP をターゲットにすることもできます:
cmake .. -DFPGA_DEVICE=<board-support-package>:<board-variant>以下に、FPGA ボードバリアントと BSP の例をいくつか示します (このリストはすべてを網羅しているわけではありません):
インテル® PAC とインテル® Arria® 10 GX FPGA では、USM はサポートされていませんが、以下の BSP を使用できます:
intel_a10gx_pac:pac_a10インテル® FPGA PAC D5005 の場合、USM サポートに基づいて次のいずれかの BSP を使用します:
intel_s10sx_pac:pac_s10 intel_s10sx_pac:pac_s10_usmBSP を指定した場合のみ、FPGA 上で実行可能ファイルを実行できます。
CPU と GPU 向けにビルド
プログラムをビルドします。
make cpu-gpuプログラムをクリーンします。(オプション)
make clean
FPGA 向けにビルド
FPGA エミュレーション用にコンパイルします。
make fpga_emuシミュレーション用にコンパイルします (コンパイル時間が短く、シミュレーター FPGA デバイスをターゲットにします):
make fpga_simHTML パフォーマンス・レポートを生成します。
make reportレポートは
simple-add_report.prj/reports/report.htmlに保存されます。FPGA ハードウェア用にプログラムをコンパイルします。(ハードウェア用のコンパイルには時間がかかる場合があります。)
make fpgaプログラムをクリーンします。(オプション)
make clean
Windows
ビルドシステムを設定
サンプル・ディレクトリーに移動します。
バッファーベースの実装を使用するようにプロジェクトを構成します。
mkdir build cd build cmake -G "NMake Makefiles" ..または
統合共有メモリー (USM) ベースの実装を使用するようにプロジェクトを構成します。
mkdir build cd build cmake -G "NMake Makefiles" .. -DUSM=1注: FPGA 用にビルドする場合は、デフォルトの FPGA ファミリー (インテル® Agilex® 7) が使用されます。次のコマンドでデフォルトのターゲットを変更できます:
cmake -G "NMake Makefiles" .. -DFPGA_DEVICE=<FPGA device family or FPGA part number>あるいは、次のコマンドで明示的な FPGA ボードバリアントと BSP をターゲットにすることもできます:
cmake -G "NMake Makefiles" .. -DFPGA_DEVICE=<board-support-package>:<board-variant>以下に、FPGA ボードバリアントと BSP の例をいくつか示します (このリストはすべてを網羅しているわけではありません):
インテル® PAC とインテル® Arria® 10 GX FPGA では、USM はサポートされていませんが、以下の BSP を使用できます:
intel_a10gx_pac:pac_a10インテル® FPGA PAC D5005 の場合、USM サポートに基づいて次のいずれかの BSP を使用します:
intel_s10sx_pac:pac_s10 intel_s10sx_pac:pac_s10_usmBSP を指定した場合のみ、FPGA 上で実行可能ファイルを実行できます。
CPU と GPU 向けにビルド
プログラムをビルドします。
nmake cpu-gpuプログラムをクリーンします。(オプション)
nmake clean
FPGA 向けにビルド
注: Windows 上で FPGA ハードウェア向けにコンパイルするには、Windows をサポートするサードパーティー製、またはカスタムのボード・サポート・パッケージ (BSP) が必要です。
FPGA エミュレーション用にコンパイルします。
nmake fpga_emuシミュレーション用にコンパイルします (コンパイル時間が短く、シミュレーター FPGA デバイスをターゲットにします):
nmake fpga_simHTML パフォーマンス・レポートを生成します。
nmake reportレポートは
simple-add_report.prj/reports/report.htmlに保存されます。FPGA ハードウェア用にプログラムをコンパイルします。(ハードウェア用のコンパイルには時間がかかる場合があります。)
nmake fpgaプログラムをクリーンします。(オプション)
nmake clean
トラブルシューティング
エラーが発生した場合、VERBOSE=1 引数を指定して make を実行すると詳細を取得できます。
make VERBOSE=1
エラーメッセージが表示された場合、インテル® oneAPI ツールキットの診断ユーティリティーを使用して問題を解決してください。診断ユーティリティーは、解決されていない依存関係、権限エラー、その他の問題を見つけるのに役立つ構成およびシステムチェックを提供します。ユーティリティーの使用方法の詳細については、インテル® oneAPI ツールキットの診断ユーティリティーのユーザーガイド (英語) を参照してください。
ベース: ベクトル加算プログラムの実行
設定可能なパラメーター
ソースファイル (vector-add-buffers.cpp および vector-add-usm.cpp) では、デフォルトのベクトルサイズとして 10000 が指定されています。必要に応じて、ファイルのベクトルサイズを変更できます。
Linux
CPU と GPU で実行
出力ディレクトリーに移動します。
統合共有メモリー (USM) とバッファー向けのプログラムを実行します。
./vector-add-buffers ./vector-add-usm
FPGA で実行
出力ディレクトリーに移動します。
FPGA エミュレーションを実行します。
./vector-add-buffers.fpga_emu ./vector-add-usm.fpga_emuFPGA シミュレーションを実行します。
CL_CONTEXT_MPSIM_DEVICE_INTELFPGA=1 ./vector-add-buffers.fpga_sim CL_CONTEXT_MPSIM_DEVICE_INTELFPGA=1 ./vector-add-usm.fpga_simFPGA ハードウェアで実行します (
-DFPGA_DEVICE=<board-support-package>:<board-variant>を指定してcmakeを実行した場合のみ)。./vector-add-buffers.fpga ./vector-add-usm.fpga
Windows
CPU と GPU で実行
出力ディレクトリーに移動します。
統合共有メモリー (USM) とバッファー向けのプログラムを実行します。
vector-add-usm.exe vector-add-buffers.exe
FPGA で実行
出力ディレクトリーに移動します。
FPGA エミュレーションを実行します。
vector-add-buffers.fpga_emu.exe vector-add-usm.fpga_emu.exeFPGA シミュレーションを実行します。
set CL_CONTEXT_MPSIM_DEVICE_INTELFPGA=1 vector-add-buffers.fpga_sim.exe vector-add-usm.fpga_sim.exe set CL_CONTEXT_MPSIM_DEVICE_INTELFPGA=FPGA ハードウェアで実行します (
-DFPGA_DEVICE=<board-support-package>:<board-variant>を指定してcmakeを実行した場合のみ)。vector-add-buffers.fpga.exe vector-add-usm.fpga.exe
インテル® DevCloud で ベース: ベクトル加算サンプルをビルドして実行 (オプション)
インテル® DevCloud でサンプルを実行する場合、計算ノード (CPU、GPU、FPGA) と、バッチモードと対話型モードのどちらで実行するか指定する必要があります。
注: インテル® DevCloud for oneAPI では適切な開発環境がすでに構成されているため、環境変数を設定する必要はありません。
Linux の指示に従ってプログラムをビルドして実行します。
1 行のスクリプトを使用して GPU ノードを指定できます。
qsub -I -l nodes=1:gpu:ppn=2 -d .
-I(大文字のI) は、対話型セッションを要求します。-l nodes=1:gpu:ppn=2(小文字のL) は、1 つの完全な GPU ノードを割り当てます。-d .は、現在のフォルダーをタスクの作業ディレクトリーとして設定します。利用可能なノード コマンドオプション GPU qsub -l nodes=1:gpu:ppn=2 -d .CPU qsub -l nodes=1:xeon:ppn=2 -d .FPGA コンパイル時間 qsub -l nodes=1:fpga_compile:ppn=2 -d .FPGA ランタイム (Arria 10) qsub -l nodes=1:fpga_runtime:arria10:ppn=2 -d .
注: 計算ノードを指定する方法の詳細については、インテル® DevCloud for oneAPI ドキュメントのジョブの起動と管理 (英語) をお読みください。
fpga_compile ノードのみが FPGA へのコンパイルをサポートします。FPGA ハードウェア用にコンパイルする場合、ジョブのタイムアウトを
24 時間に増やします。
FPGA ハードウェア上でのプログラムの実行は、fpga_runtime:arria10 など適切なタイプの fpga_runtime ノードでのみサポートされます。
ログインノードでは、FPGA ハードウェアでのプログラムのコンパイルも実行もサポートされていません。詳細については、インテル® DevCloud for oneAPI のインテル® oneAPI ベース・ツールキットの導入ガイド (英語) ページを参照してください。
出力例
Running on device: Intel(R) Gen(R) HD Graphics NEO
Vector size: 10000
[0]: 0 + 0 = 0
[1]: 1 + 1 = 2
[2]: 2 + 2 = 4
...
[9999]: 9999 + 9999 = 19998
Vector add successfully completed on device.
ライセンス
サンプルコードは、MIT ライセンスに基づいてライセンスされます。詳細は、License.txt (英語) を参照してください。
サードパーティー・プログラムのライセンスは、third-party-programs.txt (英語) で確認できます。

