Intel MKLをAPTでインストールする

MKLはIntelによって無料で提供されている数値計算ライブラリで、公式ページからインストーラを入手することでインストール出来る。

CUIの対話的なインストーラー・GUIインストーラー以外にも、APTによってインストールする方法が公開されている。[Intelの解説ページ](https://software.intel.com/en-us/articles/installing-intel-free-libs-and-python-apt-repo)がHTMLのソースコードが丸見えになっていて(私だけ？)コピペでサクッと実行できないのでメモついでにまとめる。

ついでに毎度行う環境変数の設定、コンパイル時の環境ごとのリンクラインの確認方法などもメモしておく。

## APTリポジトリの設定
### リポジトリのGPG-keyを設定する。

```
wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
sudo apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
```

### リポジトリを追加する
[Intelの解説ページ](https://software.intel.com/en-us/articles/installing-intel-free-libs-and-python-apt-repo)ではライブラリごとに個別にリポジトリを登録する方法も記載されているが、ここでは全部のリポジトリをまとめて追加してしまう。
#### リポジトリのリストを取得して更新

```
sudo wget https://apt.repos.intel.com/setup/intelproducts.list -O /etc/apt/sources.list.d/intelproducts.list 
sudo apt-get update
```

## インストール・アンインストール
次の変数をインストール対象の指定に用いる。利用可能なリスト一覧は下表や[公式](https://software.intel.com/en-us/articles/installing-intel-free-libs-and-python-apt-repo)を参照
\<COMPONENT\>: インストールするライブラリ名
\<VERSION\>: 2017, ...
\<UPDATE\>: 0, 1, 2, ...
\<BUILD_NUMBER\>: ビルド番号

### インストール方法

インストール時のコンポーネント指定:

```
sudo apt-get install <COMPONENT>-<VERSION>.<UPDATE>-<BUILD_NUMBER>
```

Example:

```
sudo apt-get install intel-mkl-2018.3-051
```

### アンインストール方法

アンインストール時のコンポーネント指定:

```
sudo apt-get autoremove <COMPONENT>-<VERSION>.<UPDATE>-<BUILD_NUMBER>
```
Example:

```
sudo apt-get autoremove intel-mkl-2018.2-046
```
## 環境変数等の設定
基本的には手動でインストールした時のデフォルト設定と同様に/opt/intel/mklにライブラリが入るので、/opt/intel/mklに含まれるmklvars.shを.bashrcに登録しておく。
Examples:

```
source /opt/intel/mkl/bin/mklvars.sh intel64 lp64
```

## コンパイル時のリンク設定の調べ方
[Intel® Math Kernel Library Link Line Advisor](https://software.intel.com/en-us/articles/intel-mkl-link-line-advisor)：各コンパイラや環境に応じたコンパイラに与える設定を教えてくれる。上で設定した環境変数を利用しているので先に設定しておく。

## NumpyのMKLなどと自分で入れたMKLが干渉する場合の設定
「[intelMKLを用いたライブラリとNumpyを併用した際に生じるエラーの解消](https://qiita.com/ymzkd/items/4ae1eef486863344fb19)」これによって副作用が生じないかどうかはわからない。


# 参考資料
上記リポジトリ追加により利用可能なライブラリごとのバージョン情報一覧。最新情報は[公式](https://software.intel.com/en-us/articles/installing-intel-free-libs-and-python-apt-repo)を確認。
#### ライブラリとアーキテクチャに対応するコンポーネント
<table>
  <tr>
    <th><b>COMPONENT</b></th>
    <th><b>VERSION</b></th>
    <th><b>UPDATE</b></th>
    <th><b>BUILD_NUM</b></th>
  </tr>
  <tr>
    <td rowspan="7">Intel® MKL</td>
    <td>2017</td>
    <td>2</td>
    <td>50</td>
  </tr>
  <tr>
    <td>2017</td>
    <td>3</td>
    <td>56</td>
  </tr>
  <tr>
    <td>2017</td>
    <td>4</td>
    <td>61</td>
  </tr>
  <tr>
    <td>2018</td>
    <td>0</td>
    <td>33</td>
  </tr>
  <tr>
    <td>2018</td>
    <td>1</td>
    <td>38</td>
  </tr>
  <tr>
    <td>2018</td>
    <td>2</td>
    <td>46</td>
  </tr>
  <tr>
    <td>2018</td>
    <td>3</td>
    <td>51</td>
  </tr>
  <tr>
    <td rowspan="6">Intel® IPP</td>
    <td>2017</td>
    <td>2</td>
    <td>50</td>
  </tr>
  <tr>
    <td>2017</td>
    <td>3</td>
    <td>56</td>
  </tr>
  <tr>
    <td>2018</td>
    <td>0</td>
    <td>33</td>
  </tr>
  <tr>
    <td>2018</td>
    <td>1</td>
    <td>38</td>
  </tr>
  <tr>
    <td>2018</td>
    <td>2</td>
    <td>46</td>
  </tr>
  <tr>
    <td>2018</td>
    <td>3</td>
    <td>51</td>
  </tr>
  <tr>
    <td rowspan="5">Intel® TBB</td>
    <td>2017</td>
    <td>6</td>
    <td>56</td>
  </tr>
  <tr>
    <td>2017</td>
    <td>8</td>
    <td>61</td>
  </tr>
  <tr>
    <td>2018</td>
    <td>0</td>
    <td>33</td>
  </tr>
  <tr>
    <td>2018</td>
    <td>2</td>
    <td>46</td>
  </tr>
  <tr>
    <td>2018</td>
    <td>4</td>
    <td>51</td>
  </tr>
  <tr>
    <td rowspan="6">Intel® DAAL</td>
    <td>2017</td>
    <td>3</td>
    <td>56</td>
  </tr>
  <tr>
    <td>2017</td>
    <td>4</td>
    <td>61</td>
  </tr>
  <tr>
    <td>2018</td>
    <td>0</td>
    <td>33</td>
  </tr>
  <tr>
    <td>2018</td>
    <td>1</td>
    <td>38</td>
  </tr>
  <tr>
    <td>2018</td>
    <td>2</td>
    <td>46</td>
  </tr>
  <tr>
    <td>2018</td>
    <td>3</td>
    <td>51</td>
  </tr>
  <tr>
    <td rowspan="2">Intel® MPI Library</td>
    <td>2018</td>
    <td>2</td>
    <td>46</td>
  </tr>
  <tr>
    <td>2018</td>
    <td>3</td>
    <td>51</td>
  </tr>
</table>

#### ライブラリとアーキテクチャに対応するコンポーネント
|                  Component                 |    COMPONENT   | Target Architecture |
|:------------------------------------------:|:----------------:|:-------------------:|
|         Intel® Math Kernel Library         |     intel-mkl    |    32bit & 64bit    |
|                                            |  intel-mkl-32bit |        32bit        |
|                                            |  intel-mkl-64bit |        64bit        |
|  Intel® Integrated Performance Primitives  |     intel-ipp    |    32bit & 64bit    |
|                                            |  intel-ipp-32bit |        32bit        |
|                                            |  intel-ipp-64bit |        64bit        |
|      Intel® Threading Building Blocks      |     intel-tbb    |    32bit & 64bit    |
| Intel® Data Analytics Acceleration Library |    intel-daal    |    32bit & 64bit    |
|                                            | intel-daal-32bit |        32bit        |
|                                            | intel-daal-64bit |        64bit        |
|             Intel® MPI Library             |     intel-mpi    |        64bit        |