なんで-legacy-emulatorオプションをつけないと動かないんだと思って原因調べてた。ググラビリティのために、エラー例を貼り付けておく。

例1)
Context callback: Malformed program binary: missing .acl.board section
Context callback: kernel argument info is not available
Context callback: Invalid binary
ERROR: CL_INVALID_BINARY 
Location: ../common/src/AOCLUtils/opencl.cpp:392
Failed to create program with binary

例2)
ERROR: CL_DEVICE_NOT_FOUND 
Location: ../common/src/AOCLUtils/opencl.cpp:356
Query for number of devices failed


で、ようやく原因分かったっぽい。

・CentOS7.6だと、Cのライブラリが古すぎるらしい。しょうがないので、ついでに新しいHLS使いたいというのもあり、HLSコンパイラの最新版20.2をインストールし、出来上がったhls/gcc/lib64ディレクトリをLD_LIBRARY_PATHに入れた。これで第一関門突破。Ubuntu使っておけばデフォルトで行けるので、こんなにはまらなかった

・多分最初はVector_addとか使って試すと思うんだけど、これのホストコードの実装が駄目で、Emulator使えるようになっていない。具体的には以下の部分。

  platform = findPlatform("Intel(R) FPGA SDK for OpenCL(TM)");

aocl diagnoseすると分かるが、Platform名は以下のようになっている(PACカードが1枚入ったシステムの場合)。

Number of Platforms = 2 
1. Intel(R) FPGA SDK for OpenCL(TM)                             | Intel(R) Corporation           | OpenCL 1.0 Intel(R) FPGA SDK for OpenCL(TM), Version 19.4
2. Intel(R) FPGA Emulation Platform for OpenCL(TM)              | Intel(R) Corporation           | OpenCL 1.0 Intel(R) FPGA SDK for OpenCL(TM), Version 19.2

元のコードでは、1番のPlatformしか当然引っかからない。以下とかに変更するとEmulatorのPlatformのみが引っかかる。

  platform = findPlatform("Intel(R) FPGA Emulation");

このように書くと、実行時に頭にCL_CONFIG_CPU_EMULATE_DEVICES=1とかCL_CONTEXT_EMULATOR_DEVICE_INTELFPGA=1とか書かなくても良いっぽい。

多分、PACカードが刺さったシステムでエミュレータのテストしてねーなこれ。


<追記>

どうやらAcceleration Stackに入っているサンプルコードが古いのが問題らしい。
hld/examples_aocにあるサンプルを使えば、

$ bin/host --emulator=1

でちゃんと動くとのこと。
intel.com/fpgaに置いてあるサンプルも古いと。困ったもんだ。