今日はアプリケーションレベルで必要なものを探ってみよう。
Vitis開発環境でアプリケーションはOpenCLのHostとKernelに分かれる。
そういえば、IntelのoneAPIはSDSoCのように関数レベルでシームレスにCPU実行部分とアクセラレーションが切り替えられるけど、その下の階層はKHRONOSのSYCLをみるとOpenCLなのかな?
あぁ、脱線しそうだった。
Vitisでアプリケーションをビルドするときに必要なものを図に描きこんでみる。
まぁ、こんな感じだな。
ソースコードはZYNQのPSで実行するapp_host.cppとPLでアクセラレーションするapp_kernel.cppと分けた。
app_host.cppがOpenCLのHost側で、app_kernel.cppがKernel側である。
ここでいうKernelというのはOpenCLのKernelなのでLinux Kernelではない。
それとアプリケーションの開発環境はx86マシンのUbuntu上としておこう。
app_host.cppはZYNQのPSで実行されるのでCortex-A53で実行できるバイナリである必要がある。
今回の開発環境はx86マシンのUbuntu上なのでクロスコンパイラでapp_host.cppをコンパイルする。
実際のところ、このクロスコンパイルはv++の中に隠れていると思ってよいだろう。
成果物はapp.exeとしよう。
app_kernel.cppはZYNQのPLで動作するアクセラレーションになるので、C++から高位合成されて最終的にPLにロードされるBitStreamになる。
v++でコンパイルして、中間言語に変換されてからVivadoで論理合成される
そして、Vitis各種ライブラリ、Vitis Platform環境と合わせて配置配線が行われBitSrteamが完成する。
完成したBitStreamは実機上でXRTを経由して、ZYNQのPLにロードできるフォーマットXCLBINファイルとしてまとめられる。
app_host.cppをコンパイルするクロスコンパイラはPetaLinuxのsystrootをビルドする際に生成することが可能である。
しかし、Vitis開発環境はPetaLinuxとともにバージョンロックであり、基本的にクロスコンパイラの入れ替えは認めていない。
これはコンパイラのバージョンはsysroot内にあるライブラリの構成が変わってしまうとVitisの独自ライブラリに影響がでるためだと思われる。
Vitis Platformとはアプリケーションを実装するFPGAおよびボードの情報が格納されている。
platformはディレクトリ構成で基本的に次のように構成されている。
・hw
・sample.xsa
・ sw
・sample_platform
・boot
・bl31.elf
・build_vitis.bif
・fsbl.elf
・pmufw.elf
・u-boot.elf
・linux_domain
・image(dir)
・qemu(dir)
・sysroot(dir)
・qemu(dir)
・ultra96v2_platform.spfm
・ultra96v2_platform.xpfm
hwディレクトリにはFPGAのハードウェア環境、swディレクトリにはソフトウェア環境が格納されている。
bootディレクトリにはBOOT.BINを構成するためのfsbl.elf、pmufw.elf、bl31.elf、u-boot.elfなどが入っている。
v++でBOOT.BINをビルドするけど、BIFファイル(ここではbuild_bitis.bif)にBOOT.BINの構成情報が入っている。
ここにはLinux KernelとDevice Tree Blobが合体したimage.ubが置かれている。
hwディレクトリに収められているsample.xsaはVivadoで生成する。
ひっそりと隠れている人が多い。
だから、VitisとPetaLinuxは難しい。