インテル® C for Media コンパイラー (CMC) は、C for Media (以下、CM) プログラミング言語を実装するオープンソースのコンパイラーです。CM は、インテル® HD グラフィックス向けの新しい GPU カーネルのプログラミング言語です。CMC は、Linux および Windows システムでご利用いただけます。この記事では、Linux システムを使用して説明します。
Windows ユーザーにとって、インストールはとても簡単です。
- インテル® C for Media パッケージを入手します
- 任意のディレクトリーにパッケージを抽出します:
- 環境変数を設定します: INSTALLDIR = <install_dir>
Linux では、ライブラリー間にいくつかの差異があるため、少し工夫が必要です。早速、GPU カーネルプログラムを実行してみましょう。
ステップ 1: 環境の設定
以下を参考に、開発環境を設定します。
ハードウェア
インテル® グラフィックス第 9 世代以降を搭載した CPU が必要です。
この記事では、Kabylake を使用します。
ソフトウェア
任意のソフトウェアをご使用いただけます。
この記事では、以下のソフトウェアを使用します。
|
|
ステップ 2: CMC ツールチェーンのビルドおよびインストレーション
以下のパッケージを利用して、CMC を使用した GPU カーネルの開発を行います。
- インテル® C for Media コンパイラー – GPU カーネルを作成するための、Clang ベースのオープンソースのコンパイラー
- Libva – ビデオ処理向けにグラフィックス・ハードウェアのアクセラレーション機能へのアクセスを提供するオープンソースの Video Acceleration API (VA-API) 向けの実装
- VA-API 向けのインテル® Media ドライバー – ユーザーモードのドライバー
- OpenCL™ 向けのインテル® グラフィックス・コンパイラー – OpenCL™ 向けの LLVM ベースのコンパイラー
すべてのステップを処理しましょう。
libva のビルドおよびインストレーション
cmake ビルドシステムを使用して、このコンポーネントを簡単にビルドできます。
git clone https://github.com/intel/libva.git libva cd libva ./autogen.sh --with-drivers-path=/opt/intel/mediasdk/lib64/ --prefix=/usr --libdir=/usr/lib64 make -j8 sudo make install cd ..
VA-API 向けインテル® Media ドライバーのビルドおよびインストレーション
インテル® Media ドライバーも、cmake を使用して簡単にビルドできます。
git clone https://github.com/intel/media-driver.git media-driver git clone https://github.com/intel/gmmlib.git mkdir build && cd build cmake ../media-driver cmake --build . -j `nproc`
これらのステップを実行したら、ドライバーと CM ランタイムがシステムにインストールされます。
- ユーザーモードのドライバー:
/opt/intel/mediasdk/lib64
- ランタイム・ライブラリー:
/usr/local/lib64
- ランタイムヘッダー:
/usr/local/include/igfxcmrt
インテル® C for Media コンパイラーのビルドおよびインストレーション
-i
パラメーターが指定する出力ディレクトリーに、コンパイラーをビルドします。ここでは、<cmc_install_dir>
とします。これは後で使用します。
git clone https://github.com/intel/cm-compiler.git cm-compiler cd cm-compiler support/scripts/build.bash -d -c -p /usr/local/bin -i `pwd`/../bin
サンプルを含む test
ディレクトリーを <cmc_install_dir>
にコピーします。
cp test ../bin -r cd ../bin
サンプル makefile の編集:
- 最初の行から
INCL
まで CMC ランタイムヘッダーへのパスを追加します。 - コンパイルコマンド内のランタイム・ライブラリー (
igfxcmrt.so
)へのパスを更新します。 HW_CMCFLAGS
におけるコンパイラーのヘッダーへのパスを<cmc_install_dir>/include
に変更します。- CMC コンパイラーのバイナリーへのパスを追加します。
これらには、以下のコマンドを使用することができます。
sed -i 's/-I$(CM_ROOT)\/runtime\/include/-I\/usr\/local\/include\/igfxcmrt\ -I\/usr\/include\/libdrm/' test/open_examples/Makefile.linux sed -i "s@^CMC :=@CMC := `pwd`\/bin\/cmc\ #@" test/open_examples/Makefile.linux sed -i "s@\$(CM_ROOT)/runtime/lib/x64/igfxcmrt64.so@/usr/local/lib64/libigfxcmrt.so@" test/open_examples/Makefile.linux
OpenCL™ 向けインテル® グラフィックス・コンパイラーのビルド
コンパイラーをクローンして、手順に沿ってビルドします。
git clone https://github.com/intel/intel-graphics-compiler.git igc git clone -b release_80 https://github.com/llvm-mirror/llvm llvm_source git clone -b release_80 https://github.com/llvm-mirror/clang llvm_source/tools/clang git clone -b ocl-open-80 https://github.com/intel/opencl-clang llvm_source/projects/opencl-clang git clone -b llvm_release_80 https://github.com/KhronosGroup/SPIRV-LLVM-Translator llvm_source/projects/llvm-spirv git clone https://github.com/intel/llvm-patches llvm_patches mkdir build_igc cd build_igc cmake ../igc/IGC cmake --build . -j `nproc`
このパッケージでは、Genx_IR
ツールのみを使用するので、<cmc_install_dir>/bin
へコピーします。
cp Release/Tools/GenX_IR ../bin/bin/
インストレーション
GPU カーネルプログラムには、2 通りの読み込みおよび実行方法が存在します。JIT コンパイルありの場合と、JIT コンパイルのなし場合に分かれます。
- JIT コンパイルありの場合、OpenCL™ 向けインテル® グラフィックス・コンパイラーのビルドは必要ありませんが、github にて CM ランタイムとともに提供される Jitter ライブラリーが必要です。
※ ライブラリーは、gcc-4.8.2 でビルドされたバイナリーファイルとして提供されます。これを使用する場合、gcc-4.8.2 を使用して、すべての環境とコードをビルドする必要があります。 - JIT コンパイルなしの場合、Jitter ライブラリーは必要ありませんが、ターゲットとなるアーキテクチャーを指定し、サンプルコードの
LoadProgram
呼び出しに対する最後の引数として、nojitter
を追加する必要があります。
この記事では、JIT コンパイルなしのケースを想定して紹介します。
ステップ 3: サンプルの実行
“nojitter” モード向けのサンプルの変更
インテル® C for Media コンパイラーのビルドおよびインストレーションで紹介した makefile のサンプルを編集します。
GEN_MODE
変数を作成し、ターゲット・プラットフォーム向けに設定します。ここでは、Kabylake ベースのグラフィックスを使用するので、KBL
を設定します。
HW_CMCFLAGS
に以下のフラグを追加し、ターゲット・プラットフォームを指定します。- -Qxcm_jit_target=$(GEN_MODE)
- -Qxcm_vme_arch=$(GEN_MODE)
- その他の便利なフラグを追加します。
- -Qxcm (必須ではありませんが、追加することを推奨します。)
- -Qxcm_opt_report (エラーのレポート)
- -Qxcm_print_asm_count (アセンブリのインストラクションのカウントを出力します。)
- CMC およびランタイム・ライブラリーへのパスを更新します。
以下は、これらのステップを行うためのサンプルになります。sed -i "s@-march=\$(GEN_MODE)@-isystem `pwd`/include -Qxcm_jit_target=\$(GEN_MODE) -Qxcm_opt_report -Qxcm_print_asm_count -Qxcm_vme_arch=\$(GEN_MODE) -Qxcm #@" test/open_examples/Makefile.linux
サンプルのビルドおよび実行
早速サンプルを実行してみましょう。例えば、histogram_64
を実行できます。
cd ../bin/test/open_examples/histogram_64 sed -i "s@program));@ssprogram,\"nojitter\"));@" histogram.cpp make -f ../Makefile.linux ./hw_x64.histogram_64
出来ました! これで、インテル® グラフィックス上で実行可能なオリジナルの GPU カーネルを作成する準備が完了しました。次の記事では、GPU カーネルの作成方法について紹介します。
メディア製品の構築において、ビデオコーデック向けの解析機能を提供する ViCue Soft 社の VQ Analyzer 製品は、こちらの製品ページにて詳細をご確認ください。
ビデオコーデックによるビデオ解析を加速するたくさんの新機能を提供する最新版 v.4.0.0 は、無償評価版にてお試しください。
この記事は、ViCue Soft 社の Technology Blog に公開されている「How to setup Intel C-for-media development environment. GPGPU programming on Intel GEN graphics」の日本語参考訳です。