インテルPAC用の実行環境を Docker / コンテナ化してみた話

# 概要
はじめまして。投稿初心者です。
今回は、INTEL PAC WITH INTEL ARRIA® 10 GX FPGA というアクセラレーション用カードを活用して、その実行環境を Docker / コンテナ化するフローについて説明をしたいと思います。
実際にサーバーに INTEL PAC WITH INTEL ARRIA® 10 GX FPGA カードを挿入して、ホスト側からのカードの見え方など確かめてみたいと思います。

#もくじ
[1.検証環境](#1-検証環境)
[2.FPGA を活用したアクセラレーション](#2-FPGA を活用したアクセラレーション)
[3.INTEL PAC WITH INTEL ARRIA® 10 GX FPGA のインターフェース](#3-INTEL PAC WITH INTEL ARRIA® 10 GX FPGA アーキテクチャ)
[4.INTEL PAC WITH INTEL ARRIA® 10 GX FPGA 開発環境について](#4-INTEL PAC WITH INTEL ARRIA® 10 GX FPGA 開発環境について)
[5.Docker/コンテナ化の手順](#5-Docker/コンテナ化の手順)
[6.実行結果] (#6-実行結果)
[7.まとめ](#7-まとめ)




#1.検証環境
・使用した FPGA アクセラレーションカード
&emsp;-インテル社製 INTEL PAC WITH INTEL ARRIA® 10 GX FPGA を使用
&emsp;-Acceleration Stack ver1.2.1
&emsp;(Intel® Arria® 10 GX FPGA搭載)
&emsp;Download Link : https://www.intel.com/content/www/us/en/programmable/products/boards_and_kits/dev-kits/altera/acceleration-card-arria-10-gx/getting-started.html
&emsp;![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/721607/ac7c8688-8312-2e2e-f1ca-f07b5eb594b3.png)

・使用したサーバー
&emsp;SuperMicro社製 SYS-7049GP-TRT

・使用した OS 環境
&emsp;— CentOS Linux version 7.6 kernel 3.10

・Dockerのインストール手順は、以下のサイトを参考にしました
&emsp;https://qiita.com/bezeklik/items/a6a7335acaec12edda45

#2.FPGA を活用したアクセラレーション
※ 引用 Intel.com 
&emsp;![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/721607/96d53a02-70e3-399f-2004-925f05f94839.png)


図のように、アクセラレーションの方式としては、2つの方式がある。
一つは In-line と呼ばれる、外部ネットワークインターフェースを持ち CPUの前後処理をアクセラレートする方法です。
もう一つは Lookasideと呼ばれる、外部ネットワークインターフェースを持たず PCIe 経由で CPU の処理を
アクセラレートする方法です。
INTEL PAC WITH INTEL ARRIA® 10 GX FPGA カードはその両方が実現できるカードです。


#3..INTEL PAC WITH INTEL ARRIA® 10 GX FPGA のインターフェース
※ 引用 Intel.com
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/721607/5360089c-03e8-1feb-e76d-06780e031c93.png)

左図 Figure1 は、INTEL PAC WITH INTEL ARRIA® 10 GX FPGA カードの内部構造を示しています。
図の下側は FPGA ブロックを示します。FIMは FPGA Interface Manager の略で別名で Blue Bit stream と呼ばれ、
Intel 社から出荷時にプログラムされている領域です。上位の Xeon プロセッサとは、この FIM を介して通信を行います。
ユーザがプログラムできる領域は、現時点では黄色で示された AFU (Accelerator Function Unit)と呼ばれるブロックです。

図の右側には、SW レイヤと FPGA IO の関係を図示しました。
今回の記事の主要ポイントは、Docker/コンテナ化する際に、FPGA開発環境の IO と コンテナを結びつける作業になります。

## Host 側からの FPGA IO の 見え方
Docker/コンテナ化の話に移る前に、FPGA の IF がどのように見えるのか、確認したいと思います。

以下のコマンドを使用して確認することができます。
```$ ll /dev | grep fpga
crw-------   1 root root      234,   0 11月 26 17:26 ifpga_sec0
crw-rw-rw-   1 root root      236,   0 11月 26 17:26 intel-fpga-fme.0
crw-rw-rw-   1 root root      235,   0 11月 26 17:26 intel-fpga-port.0
```

Docker/コンテナ化する際に、上記の intel-fpga-fme.0, intel-fpga-port.0 とコンテナ環境を紐づける必要があります


#4.INTEL PAC WITH INTEL ARRIA® 10 GX FPGA 開発環境について
INTEL PAC WITH INTEL ARRIA® 10 GX FPGA の開発環境をインストールした後のフォルダ構成を以下に示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/721607/8b9fcc81-293e-4ec8-a6b6-aca1184a157a.png)
/home/***/inteldevstack/a10_gx_pac_ias_1_2_1_pv 配下に実行環境がインストールされます。今回は、
a10_gx_pac_ias_1_2_1_pv 配下の、 /sample/hello_afu/sw を使用してみたいと思います。

※上記のPathは、Acceleration stack for development の場合の Path です。
Acceleration stack for runtime の場合は、intelrtestack/がデフォルトの Path になります。
                                                           

#5.Docker/コンテナ化の手順
手順としては、
&emsp;1.Acceleration stack をインストール (今回は Runtime をインストール)
&emsp;※ Acceleration stackには2種類存在し、FPGA内部の開発をしない場合は、Runtime。 
&emsp;FPGA 内部の開発が必要な場合はDevelopmentを選択する

&emsp;2.Docker Image のダウンロード
&emsp;3.Docker Image の作成

の順で実施します。

##前準備
//まずは前もって Acceleration Stack の 1.2.1 の Runtime をインストール
//前準備
```
$ cd /home/***/inteldevstack/a10_gx_pac_ias_1_2_1_pv/hw/samples/hello_afu
$ fpgaconf bin/***.gbs
$ cd sw
$ make
```


## Docker 環境のダウンロードと作成
```
$ docker pull centos:centos7
$ docker run --rm -it \
--name intel_pac \
--mount type=bind,source=/home/***/inteldevstack,destination=/inteldevstack \
--mount type=bind,source=/usr/lib64,destination=/usr/lib64 \
--device /dev/intel-fpga-fme.0:/dev/intel-fpga-fme.0 \
--device /dev/intel-fpga-port.0:/dev/intel-fpga-port.0 \
--cap-add=IPC_LOCK \
centos:centos7
```

--mount type=bind にて、inteldevstack および usr/lib64 を Docker 内にマウントします。
Docker 内にアクセラレーションスタックをインストール後にIOのみ割りつける方法もありますが、
今回は Host にアクセラレーションスタック開発環境をインストール後に、Dockerにマウントする方法を試しました。

以下のコマンドで、前述した FPGA IO と Docker 環境の紐づけを行っています。
```
--device /dev/intel-fpga-fme.0:/dev/intel-fpga-fme.0 \
--device /dev/intel-fpga-port.0:/dev/intel-fpga-port.0 \
```

上記にて、INTEL PAC WITH INTEL ARRIA® 10 GX FPGA 開発環境の Docker 化ができましたので、
Softwareを実際に実行した結果を以下に示します。

#6.実行結果

### Docker Image ダウンロード
```
$ docker pull centos:centos7
centos7: Pulling from library/centos
Digest: sha256:0f4ec88e21daf75124b8a9e5ca03c37a5e937e0e108a255d890492430789b60e
Status: Image is up to date for centos:centos7
docker.io/library/centos:centos7
```

### Docker の起動
```
$ docker run --rm -it \
> --name intel_pac \
> --mount type=bind,source=/home/***/inteldevstack,destination=/inteldevstack \
> --mount type=bind,source=/usr/lib64,destination=/usr/lib64 \
> --device /dev/intel-fpga-fme.0:/dev/intel-fpga-fme.0 \
> --device /dev/intel-fpga-port.0:/dev/intel-fpga-port.0 \
> --cap-add=IPC_LOCK \
> centos:centos7
[root@7e83b4eac411 /]#
```
### hello_afu Software フォルダに移動
```
cd /inteldevstack/a10_gx_pac_ias_1_2_1_pv/hw/samples/hello_afu/sw
[root@7e83b4eac411 sw]#
```

### Software の実行
```
 ./hello_afu
Running Test
AFU DFH REG = 1000010000000000
AFU ID LO = 9722d43375b61c66
AFU ID HI = 850adcc26ceb4b22
AFU NEXT = 00000000
AFU RESERVED = 00000000
Reading Scratch Register (Byte Offset=00000080) = 00000000
MMIO Write to Scratch Register (Byte Offset=00000080) = 123456789abcdef
Reading Scratch Register (Byte Offset=00000080) = 123456789abcdef
Setting Scratch Register (Byte Offset=00000080) = 00000000
Reading Scratch Register (Byte Offset=00000080) = 00000000
Done Running Test
```

#7.まとめ
・INTEL PAC WITH INTEL ARRIA® 10 GX FPGA は In-line/ lookaside に対応したカード
・FPGA 開発環境を Docker/コンテナ化するためには、FPGA IO と Docker 環境の紐づけが必要
・Docker 環境から SW を実行し FPGA アクセラレーションブロックに簡単にアクセスできた

※Docker 内にアクセラレーションスタックをインストール後にIOのみ割りつける方法もありますが、今回は Host にアクセラレーションスタック開発環境をインストール後に、Dockerにマウントする方法を試しました。
参考になりましたら幸いです。