行列乗算のサンプル

インテル® DPC++/C++ コンパイラー

この記事は、oneapi-src/oneAPI-samples (英語) で公開されている Matrix Multiply Sample を iSUS で翻訳した日本語参考訳です。原文は更新される可能性があります。原文と翻訳文の内容が異なる場合は原文を優先してください。

行列乗算は、2 つの大きな行列を乗算して結果を検証する簡単なプログラムです。このプログラムは、同じ操作を 2 つの方法で実行します。SYCL と OpenMP (OMP)。

プロパティー 説明
ガイドの内容 SYCL と OpenMP を使用して 2D 配列の計算を GPU にオフロードする方法。
所要時間 15 分

: 原文では、「この行列乗算サンプルは、Windows 上の OpenMP 機能ではサポートされません。」と記載されていますが、最新のインテル® DPC++/C++ コンパイラーとインテル® GPU ドライバーではサポートされています。

目的

行列乗算サンプルプログラムには、SYCL 準拠および OpenMP C++ 実装が含まれています。それぞれの実装は、適切な名前のファイル (matrix_mul_sycl.cpp および matrix_mul_omp.cpp) に含まれています。ファイルを 2 つに分割することで、比較的単純なサンプルで OpenMP などの既存のオフロード手法と SYCL を比較できます。

コードは利用可能な GPU 上で実行を試み、互換性のある GPU が検出されない場合、システムの CPU にフォールバックします。コンパイルに使用されたデバイスが出力に表示されます。

要件

最適化 説明
OS Ubuntu 18.04
Windows 10 以降
ハードウェア Gen9 内蔵 GPU を搭載する Skylake 以降
ソフトウェア インテル® oneAPI DPC++/C++ コンパイラー
インテル® oneAPI C++ コンパイラー・クラシック
インテル® C++ コンパイラー

主な実装の詳細

このサンプルは 2 つの大きな行列を乗算するため、ベクトル加算のサンプルよりも少し複雑な計算になります。このサンプルでは、バッファーを使用してメモリーを管理します (メモリー管理オプションの詳細については、ベクトル加算のサンプルを参照してください)。

サンプルのデフォルトでは、SYCL 準拠のアプリケーションがビルドされますが、OpenMP ビルド手順が以下に含まれています。

コードは、GPU と CPU の両方で計算を実行し、結果を検証します。より重いワークロードに合わせて計算のサイズを調整できます。成功した場合、オフロードデバイスの名前と成功メッセージが表示されます。

行列乗算のサンプルをビルド

環境変数の設定

コマンドライン・インターフェイス (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'

Microsoft Visual Studio:

  • コマンド・プロンプト・ウィンドウを開き、setx SETVARS_CONFIG " " を実行します。これは一度設定するだけで、Visual Studio が起動されるたびに setvars スクリプトが自動的に実行されます。

環境変数の設定の詳細については、Linux* で setvars および oneapi-vars スクリプトを使用または Windows* で setvars および oneapi-vars スクリプトを使用を参照してください。

または、modulefiles スクリプトを使用して開発環境を設定します。モジュールファイル・スクリプトは、すべての Linux シェルで機能します。

コンポーネントのリストとコンポーネントのバージョンを調整するには、setvars 設定ファイルを使用して開発環境を設定します。

Visual Studio Code を使用する (オプション)

Visual Studio Code (VS Code) 拡張機能を使用して、環境の設定、起動構成の作成、サンプルの参照とダウンロードを行うことができます。

VS Code を使用してサンプルをビルドおよび実行する基本的な手順を次に示します:

  • インテル® oneAPI ツールキットの拡張機能であるサンプル・コード・ブラウザーを使用して、サンプルをダウンロードします
  • インテル® oneAPI ツールキットの拡張機能である環境設定ツールを使用して、oneAPI 環境を構成します
  • VS Code でターミナルを開きます ([ターミナル] > [新しいターミナル])。
  • 以下の手順に従って、VS Code ターミナルでサンプルを実行します。

拡張機能と oneAPI 環境の構成方法の詳細については、Visual Studio Code でインテル® oneAPI ツールキットを使用するユーザーガイド (英語) を参照してください。

Linux

SYCL 向けにビルド

  1. プログラムをビルドします。

    make all

OpenMP 向けにビルド

  1. Make を使用してプログラムをビルド

    make build_omp

Windows

SYCL 向けにビルド

: 原文では Windows 環境では OpenMP オフロードターゲットがサポートされない、と明記されていますが、最新のインテル® oneAPI DPC++/C++ コンパイラーとインテル® GPU ドライバーでは Windows 環境でもオフロードを利用できます。サンプルで提供される Makefile.win を、

SYCL_CXX = icx-cl
SYCL_CXXFLAGS = -fsycl /O2 /Zi /EHsc
OMP_CXXFLAGS = /Qiopenmp /Qopenmp-targets=spir64 /O2 /Zi /EHsc
SYCL_LDFLAGS =
OMP_LDFLAGS =
SYCL_EXE_NAME = matrix_mul_sycl.exe 
OMP_EXE_NAME = matrix_mul_omp.exe
SYCL_SOURCES = matrix_mul_sycl.cpp
OMP_SOURCES = matrix_mul_omp.cpp

all: build_sycl build_omp

build_sycl: 
	$(SYCL_CXX) $(SYCL_CXXFLAGS) -o $(SYCL_EXE_NAME) $(SYCL_SOURCES) $(SYCL_LDFLAGS)
build_omp: 
	$(SYCL_CXX) $(OMP_CXXFLAGS) -o $(OMP_EXE_NAME) $(OMP_SOURCES) $(OMP_LDFLAGS)

run:
	$(SYCL_EXE_NAME)
	$(OMP_EXE_NAME)

run_sycl:
	$(SYCL_EXE_NAME)
run_omp:
	$(OMP_EXE_NAME)

clean:
	del -rf $(SYCL_EXE_NAME) $(OMP_EXE_NAME) *.pdb

のように変更して build_omp で OpenMP プログラムをビルドできます。

Windows 環境で OpenMP プログラムを実行すると、次のようなエラーが発生する場合があります。

これは、インテル® oneAPI DPC++/C++ コンパイラーで提供される libiomp5md.dll へのパスが不明であることが原因です。LIB や LD_LIBRARY_PATH にパス (C:\Program Files (x86)\Intel\oneAPI\compiler\latest\bin など) が設定されていることを確認してください。

  1. nmake を使用してビルドします。

    nmake -f Makefile.win build_sycl
     (nmake -f Makefile.win build_omp)

Windows でインテル® oneAPI コマンドプロンプトを使用

  • [スタート] > [すべて] > [Intel oneAPI <バージョン>] > [Intel oneAPI command prompt for Intel 64 for Visual Studio <バージョン>] を開きます。

Windows で Visual Studio を使用

  • VS2019 以降を使用してプログラムをビルドします。
    • ソリューション・ファイルを右クリックして IDE を開きます。
    • [ソリューション エクスプローラー] でプロジェクトを右クリックして、[リビルド] を選択します。
    • 上部のメニューから [デバッグ] > [デバッグなしで開始] を選択します。
  • MSBuild を使用してプログラムをビルドします。
    • [x64 Native Tools Command Prompt for VS2019] または [x64 Native Tools Command Prompt for VS2022] など、Visual Studio のバージョンに応じて適切なコマンドを開きます。
    • 次のコマンドを実行します。MSBuild matrix_mul.sln /t:Rebuild /p:Configuration="release"

トラブルシューティング

エラーメッセージが表示された場合、インテル® oneAPI ツールキットの診断ユーティリティーを使用して問題を解決してください。診断ユーティリティーは、解決されていない依存関係、権限エラー、その他の問題を見つけるのに役立つ構成およびシステムチェックを提供します。ユーティリティーの使用方法の詳細については、インテル® oneAPI ツールキットの診断ユーティリティーのユーザーガイド (英語) を参照してください。

行列乗算のサンプルを実行

Linux

  1. 両方のバージョンを実行

    make run
    make run_omp

Windows

  1. SYCL バージョンを実行

    nmake -f Makefile.win run_sycl
     (nmake -f Makefile.win run_omp)
  2. または、ディレクトリーを出力フォルダーに変更して .exe ファイルを実行します (選択したビルド方法によっては、.exe 名が表示されるものと異なる場合があります)。

    matrix_mul_sycl.exe
    (matrix_mul_omp.exe)

アプリケーションのパラメーター

計算サイズを変更するには、matrix_mul_sycl.cpp ファイルと matrix_mul_omp.cpp ファイルのサイズ・パラメーターを調整します。両方のファイルで次のパラメーターを設定できます:

size = m_size = 150*8; // Must be a multiple of 8.
M = m_size / 8;
N = m_size / 4;
P = m_size / 2;

: サイズの値は 8 の倍数である必要があります。

出力例

./matrix_mul_dpc

Device: Intel(R) Iris(R) Xe Graphics

Problem size: c(150,600) = a(150,300) * b(300,600)

Result of matrix multiplication using SYCL: Success - The results are correct!

ライセンス

サンプルコードは、MIT ライセンスに基づいてライセンスされます。詳細は、License.txt (英語) を参照してください。サードパーティー・プログラムのライセンスは、third-party-programs.txt (英語) にあります。

タイトルとURLをコピーしました