インテル® グラフィックスにおける GPGPU プログラミング その 1 – インテル® C for Media 開発環境の設定方法 –

インテル® C for Media コンパイラー (CMC) は、C for Media (以下、CM) プログラミング言語を実装するオープンソースのコンパイラーです。CM は、インテル® HD グラフィックス向けの新しい GPU カーネルのプログラミング言語です。CMC は、Linux および Windows システムでご利用いただけます。この記事では、Linux システムを使用して説明します。

Windows ユーザーにとって、インストールはとても簡単です。

  1. インテル® C for Media パッケージを入手します
  2. 任意のディレクトリーにパッケージを抽出します:
  3. 環境変数を設定します: INSTALLDIR = <install_dir>

Linux では、ライブラリー間にいくつかの差異があるため、少し工夫が必要です。早速、GPU カーネルプログラムを実行してみましょう。

ステップ 1: 環境の設定

以下を参考に、開発環境を設定します。

ハードウェア

インテル® グラフィックス第 9 世代以降を搭載した CPU が必要です。
この記事では、Kabylake を使用します。

ソフトウェア

任意のソフトウェアをご使用いただけます。
この記事では、以下のソフトウェアを使用します。

  • CentOS 7.6
  • CMake 3.12
  • GCC 8.2
  • git 1.8
  • make 3.82
  • Python 3.5

ステップ 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 を設定します。

  1. HW_CMCFLAGS に以下のフラグを追加し、ターゲット・プラットフォームを指定します。
    • -Qxcm_jit_target=$(GEN_MODE)
    • -Qxcm_vme_arch=$(GEN_MODE)
  2. その他の便利なフラグを追加します。
    • -Qxcm (必須ではありませんが、追加することを推奨します。)
    • -Qxcm_opt_report (エラーのレポート)
    • -Qxcm_print_asm_count (アセンブリのインストラクションのカウントを出力します。)
  3. 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」の日本語参考訳です。

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