oneAPIを試してみるシーズン２.1【インテル® FPGA PAC Arria® 10 GX 搭載版対応】

# はじめに

こんにちは。

以前こんな記事を書いたんですが。

https://qiita.com/yukitaketake/items/dd37f9f6046dc04fa4e7

これで分かったのが、D5005でoneAPIやってみたい人はあんまりいなくて、インテル® FPGA PAC Arria® 10 GX 搭載版でoneAPI使いたいけど動かなくて困ってる人が多そうということでした。
また、前回書いた記事も、私が使っていた環境が若干特殊だったせいで不正確なところがありました。大変申し訳無いです…

ということで、改めてインテル® FPGA PAC Arria® 10 GX 搭載版を前提とした、oneAPI環境構築の記事をあげてみたいと思います！
基本は、上記の記事のコピペをベースに、インテル® FPGA PAC Arria® 10 GX 搭載版を前提とした場合に変更すべき点を更新した感じの記事になります。

---

さて、FPGA用のoneAPI環境は、ざっくり言って以下の３つから構成されます。

1. インテル® oneAPI ベース・ツールキット
2. FPGA開発ツール(インテル® Quartus® Prime 開発ソフトウェア)
3. 使用するFPGAボードのBoard Support Package（以下、BSP。最近はShimとも呼ばれます）

今までは、上記2と3（BSPについてはインテル® PACカードのもの）がまとめられて、FPGA Add-onとして提供されていました。でも、これだと、じゃあインテル®製以外のFPGAボードどうなるんじゃいと思いませんでした？
今回の変更では、このあたりがあるべき姿になった感があります。
基本的には、FPGA Add-onというものはなくなり、インテル® oneAPI ベース・ツールキットは今まで同様インストールし、それ以外にインテル® Quartus® Prime 開発ソフトウェアとボードベンダー提供のBSPを別途インストール、という流れになります。

なお、残念ながら現時点でFPGAボード対応しているOSはLinux系だけになりますので、今回の記事もLinuxベースになります。

# OSについて（超重要!!）

後述のBSPのインストーラーの中身を見ると、対応OSは以下の２つであることが分かります。

・RHEL7/CentOS7
・Ubuntu18.04

いかんせん古いカードなので、対応OSも古いです。
で、筆者は両方のOS（正確にはCentOS7とUbuntu18.04です）を試してみたのですが、その経験上、ここではUbuntu18.04を使うことを強く強く強く・・・（略）推奨します。
（というか、筆者はCentOS7でのインストールは途中で挫折しました…多分新しめなgccを入れてやらないと行けないっぽいんですが）
ちなみにCentOS7は、既に公式からのダウンロードは出来ないですよね。
ダウンロードはこちらから。

https://releases.ubuntu.com/bionic/

筆者はubuntu-18.04.6-desktop-amd64.isoをダウンロードして使いました。

ところがここでも大問題が。2023年4月現在、上記のisoファイルをダウンロードしてインストールするとKernelのバージョンが5.4系になります。
ところが、インテル® FPGA PAC Arria® 10 GX 搭載版のBSPインストーラーの中身を見ると分かるのですが、Kernelバージョンは4.15以下でないとインストール出来ないようになっています。
（筆者はインストーラーを色々修正してkernel5.4系でなんとかならないかと抵抗しましたが、途中で諦めました…）
ということで、4.15系のカーネルをインストールしてやらないといけません。筆者は以下のようにやりました。（4.15で一番新しそうなのが4.15.0-208だったので、それを使ってます。それはヤバい等あったら教えてください…）

```
$ sudo apt install linux-image-4.15.0-208-generic linux-headers-4.15.0-208 linux-modules-extra-4.15.0-208-generic
$ sudo apt install linux-headers-generic
```

上記をインストール後、Shiftキーを押しながらリブートすると、ブート先が選択できるようになります。Grubの画面からAdvanced Optionsを選択するとKernelが選べます。
起動後、一応Kernelを確認してください。

```
$ uname -r
4.15.0-208-generic
```


# 必要なものをダウンロード

まずはこちらから。

https://www.intel.com/content/www/us/en/developer/tools/oneapi/base-toolkit-download.html

若干ページのデザインが変わってますが、まあほぼ前と同じです。
好きなインストール方法を選択いただいて大丈夫ですが、私はいつもofflineを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95821/391c051a-839d-0f28-acde-d53be041cc41.png)
もっと言えば、ブラウザによるダウンロードではなくこっちのwgetを使う方法が好みです（ファイル名は適宜変更されます）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95821/79a45a5f-ceb9-e1d6-1fea-ff1d69905fc7.png)
この下に以前からあったFPGA Add-onの項目がありますが、既にここからダウンロードは出来ないようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95821/23375dac-e062-e691-e660-3c5c799b6312.png)

一方、こんなページが準備されています。

https://www.intel.com/content/www/us/en/developer/tools/oneapi/fpga.html

下のほうにこんな表があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95821/9e3d13c2-f88d-7cc0-87cd-876160a3828b.png)
将来どうなるかわかりませんが、少なくとも当分の間、oneAPIに対応したFPGAボードはここにリストされ、必要なリンクが張られることになりそうです。
見ると分かる通り、典型的にはBSPへのリンク及び必要なバージョンのインテル® Quartus® Prime 開発ソフトウェア・ダウンロードサイトへのリンクがありますので、そこからBSP及びインテル® Quartus® Prime 開発ソフトウェアをダウンロードすることになります。
現時点では、Bittware社とHitek Systems社のボードに関しては、製品ページのリンクしか張られていないようですね。例えばBittware社の場合、専用の開発者向けサイトを持っていますので、そちらからBSPを入手することになると思います。詳しくは各ベンダー発行のインストールマニュアルを参照ください。
ただ、現在残念ながらインテル® FPGA PAC Arria® 10 GX 搭載版がここには掲載されていないですね。

さて、ではインテル® FPGA PAC Arria® 10 GX 搭載版用のBSPをインストールします。
どのインテル® Quartus® Prime 開発ソフトウェアのバージョンに対応するかはFPGAボードベンダー次第です。インテル® FPGA PAC Arria® 10 GX 搭載版に関しては、既に販売終了になっていることもあり、若干古いVersion 19.2での対応になっています。
なお、使用するインテル® FPGA PAC Arria® 10 GX 搭載版には、最新版（v1.2.1）のFPGAインターフェース・マネージャー（FIM）及びボード・マネジメント・コントローラー（BMC）が焼いてある必要があります。

https://www.intel.com/content/www/us/en/software-kit/665840/intel-pac-with-intel-arria-10-gx-fpga-acceleration-stack-version-1-2-1.html?wapkw=acceleration%20stack%201.2.1

最新版が焼いてあるかの簡単な確認方法は以下です。
```
$ fpgainfo fme
Board Management Controller, microcontroller FW version 26895
Last Power Down Cause: POK_CORE
Last Reset Cause: None
//****** FME ******//
Object Id                     : 0xEC00000
PCIe s:b:d:f                  : 0000:18:00:0
Device Id                     : 0x09C4
Socket Id                     : 0x00
Ports Num                     : 01
Bitstream Id                  : 0x124000200000367
Bitstream Version             : 1.2.4
Pr Interface Id               : 38d782e3-b612-5343-b934-2433e348ac4c
Boot Page                     : user
```

BMC FWのversionが**26895**、Pr Interface Idが**38d782e3-b612-5343-b934-2433e348ac4c**になっているはずです。
上記のようになっていない場合は、以下等を参照ください。

https://www.intel.com/content/www/us/en/docs/programmable/683633/1-2-1/identifying-the-flash-image-and-bmc-firmware.html

https://www.intel.com/content/www/us/en/docs/programmable/683633/1-2-1/updating-the-fim-and-bmc-firmware.html

インテル® FPGA PAC Arria® 10 GX 搭載版用のBSPに関しては、インテル® Quartus® Prime 開発ソフトウェア Version 19.2のダウンロードページから入手できます。

https://www.intel.com/content/www/us/en/software-kit/661712/intel-quartus-prime-pro-edition-design-software-version-19-2-for-linux.html

このページには、通常のインテル® Quartus® Prime 開発ソフトウェア・ダウンロードページには無い、oneAPIというタブがあることに注意してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95821/04cd3fd7-5bb2-2ff7-9280-a6e331ad4ab7.png)

oneAPIタブをクリックすると、BSP及びパッチのリンクが表示されます。ここでは、intel_a10gx_pac.tar.gzとQuartusProSetup-19.2.0-Patch-0.05dcp-linux.tar.gzをダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95821/e258a0f9-c38f-534b-269b-5d9e683355ff.png)

インテル® Quartus® Prime 開発ソフトウェアについては、以下の全部入りパッケージをダウンロードいただいてもよいのですが、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95821/7d1d44f2-8770-acb6-7f79-e992d4bc7c90.png)

恐ろしいファイルサイズなので、筆者は通常Individual Filesタブから必要なものだけダウンロードします。インストールの手間は全部入りと同じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95821/a90078e6-881e-4097-17a6-472e5383f02f.png)

今回は最低限、Intel® Quartus® PrimeとIntel® Arria® 10 Device Supportの２つをダウンロードすればOKです。

# インテル® oneAPI ベース・ツールキットのインストール

ではダウンロードしたものをインストールしていきます。まずはインテル® oneAPI ベース・ツールキットからです。2023年4月現在、oneAPI Base Toolkitの最新版は2023.1です。

```
$ sudo sh ./l_BaseKit_p_2023.1.0.46401_offline.sh
```

環境によって、GUIベースのインストーラーが立ち上がる場合と、CUIベースになってしまう場合があります。ここでは、どちらかというと分かりづらいCUIベースで説明します。
CUIベースのインストーラーの場合、以下のような画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95821/5be425e6-39f1-9f6e-98bc-faa4aa48b1a9.png)
Tabキーを押すと選択部分が切り替わりますので、Nextを選択してリターンキーを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95821/8ea5c0c9-06a0-db98-2f8b-5fca7bc3ac69.png)
これもTabキーでAccept & installを選択してリターン。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95821/67a9d896-c47a-d4c5-ac18-287cd7306242.png)
筆者の環境ではいつもこのOpenCL関係の警告が出ちゃいますが、気にせずに先に勧めます。TabキーでInstallを選択してリターン。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95821/47086d9f-ec33-9d55-9caa-b6ee04a7b3ad.png)
筆者はEclipse不要なので、Skipのところにチェックがついた状態のままTabキーでNextを選択してリターン。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95821/fa898af3-a774-49de-0759-7359794af617.png)
Intel® Improvement Programに同意するしないを聞かれますので、どちらかを選択します。筆者は同意するので、Tabキーで「I consent to the collection of my information」を選択し、スペースキーを押してチェックを付けます。その後、Tabキーで「Begin Installation」を選択してリターン。
これでインストールが開始されます。筆者の環境では１０分ほどかかりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95821/f744625e-dcc6-a4a1-cbe7-85809a9d22ef.png)
インストール先はデフォルトの/opt/intel/oneapiになりました。TabキーでCloseを選択してリターンキーを押し、インストーラーを終了します。

# インテル® Quartus® Prime 開発ソフトウェアのインストール

前述のとおり、以前はここでFPGA Add-onなるものをインストールしたわけですが、oneAPI最新版ではインテル® Quartus® Prime 開発ソフトウェアをインストールすることになります。
先ほどダウンロードした.runファイルをchmod +xして、実行します。ただし、先ほどダウンロードしたものは、すべて同じディレクトリに置いたままにしておく必要があります。
筆者はユーザディレクトリにインストールするつもりなので下のコマンドでOKですが、/opt以下等にインストールする場合はsudo ./QuartusProSetup-19.2.0.57-linux.runとしてください。

```
$ chmod +x QuartusProSetup-19.2.0.57-linux.run 
$ ./QuartusProSetup-19.2.0.57-linux.run 
```

これでインストール用のGUIが起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95821/19eb5ca8-fd55-6b5b-26be-2ba28adc246b.png)
Nextをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95821/5f41b1f1-4a66-58c1-217d-d4593067a8fc.png)
License Agreementを確認し、I accept the agreementをクリックしてNext。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95821/de673ff5-410b-9f89-504c-26e5952c1fbc.png)
インストールディレクトリを指定します。sudoでインストーラを起動しないとダメな場合がありますのでご注意を。筆者はこのままユーザディレクトリにインストールしてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95821/fcb4db5d-6138-dbde-f077-7a21ed8e7603.png)
今回は最小限のものしかダウンロードしてこなかったので、インストールされるコンポーネントはこれしかなく、何だか寂しいですが、oneAPIを使う上では問題ありません。上記のスクリーンショットではStratix 10となっていますが、ここではArria 10が選択されているのが正しいです。Nextをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95821/346c8919-f18f-dfda-1ec6-a5d660efadff.png)
disk spaceの数字は上記とは異なっているかもしれません。Nextをクリックしてインストール開始。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95821/19e38050-b316-2240-965e-bc8f11b9b5f2.png)
インストールが始まりました。しばらく待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95821/bed5d396-ac91-8f6b-0496-78c8527c18f8.png)
インストールが終了しました。
今回はoneAPI用にインストールしたこともあり、チェックは全部外してFinishを押します。
筆者の環境ではインストール完了まで５分程度でした。

通常はここでライセンスファイルのインストールをしたりするのですが、oneAPIの範囲内で使う限りインテル® Quartus® Prime 開発ソフトウェアのライセンスは必要ありません！ここ重要です。

次に、パッチをインストールします。

```
$ tar zxvf QuartusProSetup-19.2.0-Patch-0.05dcp-linux.tar.gz 
$ cd QuartusProSetup-19.2.0-Patch-0.05dcp-linux/
$ chmod +x QuartusProSetup-19.2.0-Patch-0.05dcp-linux.run 
$ ./QuartusProSetup-19.2.0-Patch-0.05dcp-linux.run 
```

インテル® Quartus® Prime 開発ソフトウェアのインストーラーと同じようなGUIが起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95821/03c34fd0-a759-1024-8a41-ee35c8504762.png)
Nextをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95821/b0a399fa-023c-0e1f-0d52-b1d8ebb8c1ff.png)
これも、License Agreementを読んで、I acceptをクリックしてNext。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95821/e60e0496-002b-6a92-ca7a-28aedbf9f3df.png)
先ほどインテル® Quartus® Prime 開発ソフトウェアをインストールしたディレクトリを指定してNextをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95821/51f1ad23-ea16-e9e3-a4dd-1b1f1811baff.png)
パッチのインストールはあっという間に終了します。Finishをクリック。
これで、インテル® Quartus® Prime 開発ソフトウェアについては準備完了です。


# BSPのインストール

先ほどダウンロードしてきたintel_a10gx_pac.tar.gzを展開します。これがそのままBSPになりますので（インストーラーを走らせるとかはありません）、それっぽいところに展開しましょう。
筆者は、work/oneapiというディレクトリを掘ってそこに展開しました。

```
$ cd ~/work/oneapi
$ tar zxvf intel_a10gx_pac.tar.gz
```

後は、諸々環境変数を設定する必要があります。
以下、oneAPIにとっては余計なものも入っていますが、筆者の設定を紹介しておきます。

```
export QUARTUS_HOME=/home/demo/intelFPGA_pro/19.2/quartus
export QUARTUS_ROOTDIR=$QUARTUS_HOME
export QUARTUS_INSTALL_DIR=$QUARTUS_ROOTDIR
export QUARTUS_ROOTDIR_OVERRIDE=$QUARTUS_ROOTDIR
export IMPORT_IP_ROOTDIR=$QUARTUS_ROOTDIR/../ip
export IP_ROOTDIR=$QUARTUS_ROOTDIR/../ip
export QSYS_ROOTDIR=$QUARTUS_ROOTDIR/../qsys/bin
export PATH=$QUARTUS_HOME/bin:$QUARTUS_HOME/qsys/bin:$QUARTUS_HOME/sopc_builder/bin/:$PATH
```

# 環境のテスト

これで、FPGA実機及びFPGAエミュレーション向けのコンパイルが出来るようになっているはずです。早速テストしてみます。

まずは環境の設定。以下を実行しておきます。

```
$ source /opt/intel/oneapi/setvars.sh 
```

以前の私の記事ではoneapi-cliというサンプル生成用コマンドを使いましたが、同じことをしてもつまらないので、今回はgithub上にあるコンパイルを持ってくることにします。
（中身はoneapi-cliコマンドで取得できるものとほぼ同じですが、微妙にバージョンが異なるようです）
Ubuntuは標準ではgitとcmakeが入っていないので、入れておきます。jsonschemaも必要なので、これもインストール。

```
$ sudo apt install git cmake python-jsonschema
```

では、まずはこんな感じで、サンプル取得＆コンパイル&エミュレータ実行してみましょう。（最後のvector_add.fpga_emu実行以外のログは省略してあります）

```
$ git clone https://github.com/oneapi-src/oneAPI-samples
$ cd oneAPI-samples
$ git checkout tags/2023.1.0
$ cd DirectProgramming/C++SYCL_FPGA/Tutorials/GettingStarted/fpga_compile/part4_dpcpp_lambda_buffers/
$ mkdir build
$ cd build
$ cmake .. -DFPGA_DEVICE=/home/demo/work/oneapi/intel_a10gx_pac:pac_a10 
$ make
$ ./vector_add.fpga_emu 
Running on device: Intel(R) FPGA Emulation Device
add two vectors of size 256
PASSED
```

では、いよいよFPGAのコンパイルを試してみます。先ほどmakeでコンパイルしたのはFPGAエミュレーション用のものなので、それほどコンパイルに時間はかからなかったはずです。今回はFPGAビットストリーム用のコンパイルになりますので、かなり時間がかかります。

```
$ make fpga
```

うまく行きました？

# 実機で試す

では実機で動かしてみます。
実機で動かす場合、まずBSPのインストールが必要です。

```
$ aocl install /home/demo/work/oneapi/intel_a10gx_pac
```

これで準備OKです。では、先ほど作ったバイナリを実行してみましょう。

```
$ ./fpga_compile.fpga
```

うまく行きました？（２回目）


# 最後に

またネタに困ってインストールの仕方記事を書いてしまうのか…と思いましたが、意外とハマりどころが多かったので、役に立つ記事になったかもしれません。
皆さんの環境でもうまく行くことを祈ってます！



# Notices & Disclaimers

Intel technologies may require enabled hardware, software or service activation.

No product or component can be absolutely secure. 

Your costs and results may vary. 

© Intel Corporation.  Intel, the Intel logo, and other Intel marks are trademarks of Intel Corporation or its subsidiaries.  Other names and brands may be claimed as the property of others.