XeonPhiでOpenCLやってみる（準備編

## はじめに
この記事は、CUDA & OpenCL Advent Calendar 2014 1日目の記事です

XeonPhiでCUDA…というのはある意味面白ネタではあるんですが、残念なことにOpenCLをやります
今回は準備編。SDKとドライバのインストールと、ちゃんと見えるのかについてをやります

## MPSSのインストール
すでにインストールされてる場合は飛ばしてください
手元の環境では、CentOS 6.5(64bit) 2.6.32-431.29.2.el6.x86_64なカーネルバージョンでした
まず、lspciでちゃんと見えてるかを確認します

```
$ lspci
...
03:00.0 Co-processor: Intel Corporation Xeon Phi coprocessor 3120 series (rev 20)
```

みえてるっぽい
では、MPSSをインストールしましょう

https://software.intel.com/en-us/articles/intel-manycore-platform-software-stack-mpss
から、MPSSの3.4を落としてきます。安全策で最新版です

readme.txtによれば、解凍したディレクトリに行って、次のコマンドを実行するそうですが

```
cp ./modules/*`uname -r`*.rpm .
cp: cannot stat `./modules/*2.6.32-431.29.2.el6.x86_64*.rpm': そのようなファイルやディレクトリはありません
```

と怒られます。modules以下に同梱されているカーネルバージョンと合わないようです。
仕方ないので自力でrpmを作ります。この方法もreadme.txtに記載されています
mpss-3.4.1ディレクトリ以下のsrcディレクトリに移動し、以下のコマンドを実行します。

```
$ rpmbuild --rebuild mpss-modules-*.rpm
```

こうすると、~/rpmbuild/RPMS/x86_64以下にmpss-modules*.rpmができているはずなので、それをmpss-3.4.1ディレクトリにコピーしましょう。
それが終わったら次のコマンド。普通にインストールします。

```
$ sudo yum localinstall *.rpm
```

めでたくmpssのインストールが終わりました。
ハマりポイントはこれぐらいなので、あとは普通にmicctrl --initdefaultしてservice mpss startとかすればいいんじゃないかな（てきとう

## OpenCLランタイム＆SDKのインストール
OpenCLのSDKは以下にあります。
個人情報をいろいろ聞かれるものの、OpenCLのためならえんやこら。
https://software.intel.com/en-us/intel-opencl

個人情報を入れると、SDKとランタイムのダウンロード画面に遷移します。
というわけでつらつらとDL。

DLが終わったら、まずランタイムから入れますがその前に。
OpenCLランタイムのためには、次の2つのパッケージが必要なので突っ込みます。

```
$ sudo yum install numactl*
$ sudo yum install redhat-lsb-core
```

OpenCL SDKとランタイムのインストールはハマりポイント特になさそうなので割愛。

## OpenCLの実行
さて、ではいよいよOpenCLを実行してみましょう。
まずは、ICCを使えるようにしようと思います。
デフォルトではICCがインストールされているのは/opt/intel/以下ですので、次のようなコマンドを入力しましょう

```
$ source /opt/intel/composerxe/bin/compilervars.sh intel64
```

これでiccにパスが通りました。XeonPhiの動作確認はこのiccでできるでしょう。ここでは割愛しますが。

さて、OpenCLを書く人々が一度はやるネタとして、オレオレDeviceQueryを作るというのがあります。というわけで、その例にもれず僕も書いてみました。オレオレDeviceQuery。

https://bitbucket.org/telmin/opencl_ext

こちらよりどうぞ。
OpenCLのデバイス名と、そのデバイスのサポートするExtension、それからカーネルの起動時間を表示することができます。

さて、その実行結果がこちら。

```
$ icc ext.cpp -lOpenCL
$ ./a.out
Platform num : 1
Device num : 2
Device name :        Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz
param cl_khr_icd cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_byte_addressable_store cl_khr_spir cl_intel_exec_by_local_thread cl_khr_depth_images cl_khr_3d_image_writes cl_khr_fp64
Kernel execute done
Kernel execute time : 0.046819 [ms]
Device name : Intel(R) Many Integrated Core Acceleration Card
param cl_khr_icd cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_byte_addressable_store cl_khr_spir cl_khr_fp64
Kernel execute done
Kernel execute time : 0.285033 [ms]
```

はい、めでたくOpenCLデバイスとしてXeonPhiが見えました。CPU版と比較して約6倍ほどカーネル起動が遅いですが、それはご愛嬌というものでしょう。たぶん。いや多分じゃすまない。クリティカルな問題だ。

## XeonPhiの開発環境としてのOpenCL

本題。
今まで、XeonPhiの開発にはiccが必要とされていました
\# 厳密には、gcc + MPSSでも開発はできますが、その場合、XeonPhiの持つ512bitベクトル命令が使えないという何とも意味のない事態が発生してしまうのです。アワレ！
ところがどっこい。OpenCLは、実際のところ、OSにOpenCLランタイムが突っ込んであり、OpenCL動作可能デバイスとして認識さえしてくれれば、あとはOpenCLコンパイラが頑張ってくれれば何とかなるという利点があります。
つまり、iccを使うことなく、XeonPhiでの開発を行うことができる、ということです。
はたして本当に、gccでコンパイルしたバイナリで、XeonPhiがOpenCLデバイスとして見えるのでしょうか？

というわけでやってみた

```
$ g++ ext.cpp -lOpenCL
$ ./a.out
Platform num : 1
Device num : 2
Device name :        Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz
param cl_khr_icd cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_byte_addressable_store cl_khr_spir cl_intel_exec_by_local_thread cl_khr_depth_images cl_khr_3d_image_writes cl_khr_fp64
Kernel execute done
Kernel execute time : 0.106243 [ms]
Device name : Intel(R) Many Integrated Core Acceleration Card
param cl_khr_icd cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_byte_addressable_store cl_khr_spir cl_khr_fp64
Kernel execute done
Kernel execute time : 0.303522 [ms]
```

ちゃんと見えますね。よきかなよきかな。
とすると、あとはOpenCLコンパイラが、XeonPhiの512bit命令(IMCIというらしい)を吐いてくれれば問題ない。

はたして本当に吐いてくれるのか？
それについては、次回をお待ちいただければ幸いです。

次は@gos_k先生です！よろしくお願いします！