oneAPIを試してみるシーズン２

# 追記

最近複数方向から、A10 PACでやりたいんだけどうまくいかない的な相談を受けたので、以下の記事を書きました。本記事の更新版的な役割なので、こちらを見ていただいたほうが良いかもです。

https://qiita.com/yukitaketake/items/1b33de7bdd4f99d2d686


# はじめに

こんにちは。

以前こんな記事を書きました。

https://qiita.com/yukitaketake/items/68dd7c93439164d615e4

ここでFPGA向けoneAPI環境のインストール方法などを紹介したんですが、その後インストール方法が結構変わりました（個人的には正常進化と思ってます）。
そんなわけで、前の記事が参考にならなくなったのに放っておくのも何なので、最新の状況を調べておこうというのがこの記事の意図です。

さて、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ベースになります。

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

まずはこちらから。

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/2f397e17-418b-fcea-4bf6-0984c9118acd.png)
将来どうなるかわかりませんが、少なくとも当分の間、oneAPIに対応したFPGAボードはここにリストされ、必要なリンクが張られることになりそうです。
見ると分かる通り、典型的にはBSPへのリンク及び必要なバージョンのインテル® Quartus® Prime 開発ソフトウェア・ダウンロードサイトへのリンクがありますので、そこからBSP及びインテル® Quartus® Prime 開発ソフトウェアをダウンロードすることになります。
現時点では、Bittware社とHitek Systems社のボードに関しては、製品ページのリンクしか張られていないようですね。例えばBittware社の場合、専用の開発者向けサイトを持っていますので、そちらからBSPを入手することになると思います。詳しくは各ベンダー発行のインストールマニュアルを参照ください。

ここでは、筆者が使えるカードの都合上、インテル® FPGA PAC D5005用のBSPをインストールしたいと思います。

https://www.intel.co.jp/content/www/jp/ja/products/details/fpga/platforms/pac/d5005/resource.html

どのインテル® Quartus® Prime 開発ソフトウェアのバージョンに対応するかはFPGAボードベンダー次第です。インテル® FPGA PAC D5005に関しては、既に販売終了になっていることもあり（上の表にも、それを告知するページへのリンクがついてます。PDN2211というドキュメントです）、若干古いVersion 19.2での対応になっています。
（ただし、インテル® FPGA PAC D5005に関しては、OFSと呼ばれるオープンソースで公開される新しいファームウェア・シェルをインストールすることで、より新しい環境が使える可能性があります。興味がある方は、インテルの担当営業までお問い合わせください）
なお、使用するインテル® FPGA PAC D5005には、最新版（v2.0.1）のFPGAインターフェース・マネージャー（FIM）が焼いてある必要があります。

https://www.intel.com/content/www/us/en/software-kit/665814/intel-fpga-pac-d5005-acceleration-stacks-v2-0-1.html

インテル® FPGA PAC D5005に関しては、上の表のBSP&BSP Patchというリンクをクリックすると、以下のページに飛びます。ここで、インテル® Quartus® Prime 開発ソフトウェアとBSP、及びインテル® Quartus® Prime 開発ソフトウェア用パッチをダウンロードします。このページには、通常のインテル® 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_s10sx_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/1f774cce-e57c-2ceb-d246-61e700ca458a.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/4bce19d1-9e6c-2137-e6d0-ad7371e5e617.png)
今回は最低限、Intel(R) Quartus(R) PrimeとIntel(R) Stratix(R) 10 Device Supportの２つをダウンロードすればOKです。

ちなみに、インテル® Quartus® Prime 開発ソフトウェア Version19.2のOSサポート状況は以下のようになっていました。ちょっと古いバージョンなのでこんなもんですかね…

*  Windows 7 SP1(64 bit)
*  Windows 8.1 (64 bit)
*  Windows 10 (64 bit)
*  Windows Server 2008 R2 SP1 (64 bit)
*  Windows Server 2012 R2 (64 bit)
*  Red Hat Enterprise Linux 6.9 (64 bit)
*  Red Hat Enterprise Linux 7.5 (64 bit)
*  SUSE LES 12.1 (SP1)
*  Ubuntu 14.04.5 LTS (64 bit)
*  Ubuntu 16.04.2 LTS (64 bit)



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

ではダウンロードしたものをインストールしていきます。まずはインテル® oneAPI ベース・ツールキットからです。

```
$ sudo sh ./l_BaseKit_p_2022.3.1.17310_offline.sh
```

筆者の環境だとインストール用のGUIが立ち上がってくれませんでした…
まあでも、気にせずに進めることにします。
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を使う上では問題ありません。Nextをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95821/346c8919-f18f-dfda-1ec6-a5d660efadff.png)
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_s10sx_pac.tar.gzを展開します。これがそのままBSPになりますので（インストーラーを走らせるとかはありません）、それっぽいところに展開しましょう。
筆者は、work/oneapiというディレクトリを掘ってそこに展開しました。

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

ちょっと嫌なのがjsonschemaです。以下を実行してみてください。インストール場所は適当に読み替えてください。
（まだoneapiのsetvars.shはsourceしないほうが良いです！。インテル®のpythonとかにPATHが通ったりするので、変なことが起こるかもしれないし。）

```
$ cd ~/work/oneapi/intel_s10sx_pac/hardware/pac_s10/build
$ python2.7 ./tools/packager.pyz

Intel OPAE FPGA Packager

packager <cmd> [options]
（略）
```

これでエラーが出ると、恐らくjsonschemaがまだインストールされていません。上記は正常時の例ですので、こんな感じでエラーが出なければ、次に進んでください。エラーが出たらjsonschemaをインストールします。
筆者はこんな感じでインストールしました。もっとマシな方法ないんだろうか…

```
$ curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py
$ python2.7 get-pip.py 
$ pip2 install jsonschema
```

そもそもpython2.7がインストールされてないという場合は、これも入れないとダメです。
筆者はRedhat系のOSを使っているので、こんな感じでインストールしました。

```
$ sudo yum -y install python2
```

後は、諸々環境変数を設定する必要があります。重要なのは上で展開したBSPの位置の指定と、インテル® Quartus® Prime 開発ソフトウェアの実行ファイルのPATH、それからライブラリのPATHです。
以下、oneAPIにとっては余計なものも入っていますが、筆者の設定を紹介しておきます。

```
export QSYS_ROOTDIR=/home/demo/intelFPGA_pro/19.2/qsys/bin
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
export AOCL_BOARD_PACKAGE_ROOT=/home/demo/work/oneapi/intel_s10sx_pac
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$AOCL_BOARD_PACKAGE_ROOT/linux64/lib
```

# 環境のテスト

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

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

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

以前の私の記事ではoneapi-cliというサンプル生成用コマンドを使いましたが、同じことをしてもつまらないので、今回はgithub上にあるコンパイルを持ってくることにします。
（中身はoneapi-cliコマンドで取得できるものとほぼ同じですが、微妙にバージョンが異なるようです）
まずはこんな感じで、サンプル取得＆コンパイルしてみましょう。

```
$ git clone https://github.com/oneapi-src/oneAPI-samples
$ cd oneAPI-samples/DirectProgramming/DPC++FPGA/Tutorials/GettingStarted/fpga_compile/
$ mkdir build
$ cd build
$ cmake -DFPGA_DEVICE=/home/demo/work/oneapi/intel_s10sx_pac:pac_s10 ..
$ make
```

……あれ、エラーが出ませんでした？？
なぜこんなことになっているか私は調べ切れていませんが、何だかgithub上のサンプルと今回インストールしたoneAPIのヘッダファイルの位置があってないようですね。
ここでの例で言うと、以下の２つのファイルについて修正が必要でした。

* oneAPI-samples/DirectProgramming/DPC++FPGA/Tutorials/GettingStarted/fpga_compile/src/fpga_compile.cpp
* oneAPI-samples/DirectProgramming/DPC++FPGA/include/exception_handler.hpp 

これを

``` fpga_compile.cpp
#include <sycl/sycl.hpp>
```

こう修正します。

``` fpga_compile.cpp
#include <sycl/CL/sycl.hpp>
```

exception_handler.hppのほうも同様に修正します。
これで先ほどのmakeが通るようになったのではないでしょうか。

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

```
$ make fpga
```

うまく行きました？

# 実機で試す

では実機で動かしてみます。
実機で動かす場合、まずボードのInitializationが必要です。

```
$ aocl initialize acl0 /home/demo/work/oneapi/intel_s10sx_pac:pac_s10 
```

これで準備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.