PoCL をもう少し探検してみる。
PoCL 4.0
PoCL 3.0 の lib/CL/devices にあった accel がなくなってしまった。その代わり almaif というものが用意されるようになった。
CL_DEVICE_TYPE
その前に CL_DEVICE_TYPE について。だれかがちらっと書いている。タイプは次の4つ。
- CL_DEVICE_TYPE_CPU
- CL_DEVICE_TYPE_GPU
- CL_DEVICE_TYPE_ACCELERATOR
- CL_DEVICE_TYPE_CUSTOM
OpenCL での対象は主に GPU になるはずなのだが、OpenCL を書いて、高位合成して、FPGA にそのビットストリームをわたしてアクセラレーションする!というのが CL_DEVICE_TYPE_ACCELERATOR。OpenCL + HLS じゃなくてもいいのかもしれないけど、PoCL なんだからまぁこういう使い方を想定していると思っていいでしょう。
FPGA ってかならずしもそんなに柔軟じゃないので、あらかじめ合成して(RTL でもいいよね) FPGA 上にアクセラレータが固定的にいてそこに向かって OpenCL の仕組みをつかってお願いするのがCL_DEVICE_TYPE_CUSTOM。
CL_DEVICE_TYPE_CUSTOM については、むかし(3.0)は accel ドライバがあってFixed-Function Acceleratorsとして説明があった。
TCE と TTA
TCE とは TTA-based Co-design Environment。User Manualの絵を見ると、OpenCL から RTL(VHDL) を作るみたいなイメージ。ttecc なるものがあるみたいね。じゃ TTA はなにかというと Transport Triggered Architecture。なるほど有益そうだ。(図はpdfからの引用)
OpenASIP をインストール
ということで、OpenASIP をインストールしてみた。まだインストールしただけ。libwxgtk3.0-gtk3-dev をいれておくと GUI のツールであるProDe, OSEd, Proximがインストールされるみたい。これらが何かは不明。
最初間違えて llvmtce をインストールするのかと思ったら、openasipを clone してそこからシェルプロを起動するのが正式な手順のようだった。
$ ./tools/scripts/install_llvm_15.sh $HOME/Project/HPC/Work/TCE/llvm15-root
install_llvm_16.sh というのもあるのだが、PoCL が 16 に対応していなかったので15 を選択する必要がある。1番目の引数はインストールするディレクトリ。シェルプロを実行すると cmake して make して、指定したディレクトリにllvm 一式が make install される。
$ ./configure --prefix=$HOME/Project/HPC/Work/TCE/llvm15-root
$ make
$ make install
あとは configure して make install すれば tcecc などがインストールされる。
試しにやってみると動かない
試しに PoCL のプログラムをちょっとやってみた。
list_device.c
int
main(int argc, char **argv)
{
//----------------------------------------------------------------
cl_tutorial::console
.msg("\033[32m:+\033[m OpenCL initialisation ...")
.push("\033[32m |\033[m ");
std::vector<cl::Platform> platform_list;
cl::Platform::get(&platform_list);
cl_tutorial::checkErr(platform_list.size() != 0 ? CL_SUCCESS : -1,
" cl::Platform::get failed to retrieve a platform;\n"
" is OpenCL correctly installed?"
"\n(fail)\n");
for(auto p : platform_list) {
cl_tutorial::console.msg(
"Using platform: ",
p.getInfo<CL_PLATFORM_NAME>());
std::vector<cl::Device> device_list;
p.getDevices(CL_DEVICE_TYPE_ALL, &device_list);
for(auto dev : device_list) {
cl_tutorial::checkErr(device_list.size() != 0 ? CL_SUCCESS : -1,
" cl::Platform::getDevices failed to find a GPU device;\n"
" do you have the correct device loader installed?"
"\n(fail)\n");
cl_tutorial::console.msg(
"Using device: ",
dev.getInfo<CL_DEVICE_NAME>());
}
}
cl_tutorial::console
.pop("\033[32m -\033[m (ok)");
}
試しに動かしてみると、、、あれ? CPU の対応しか出ない。う〜ん。何か間違っているようです。
:+ OpenCL initialisation ...
| :+ Using platform: Portable Computing Language
| | Using device: cpu-skylake-Intel(R) Core(TM) i9-10900KF CPU @ 3.70GHz
|
- (ok)
あ〜でも FPGA とからんでいるのか。根本的になんか間違っているみたい。TCE Tourの tcp_tutorials をやる必要がありそう。今後(の自分)に期待しましょう。
AlmaIF
新し加わった AlmaIF。(図はpdfからの引用)
この pdf を読むとだいたいわかる。
2つ用意していて、一つが Fixed-Function、もう一つが Soft Processor。それぞれ CL_DEVICE_TYPE_CUSTOM と CL_DEVICE_TYPE_ACCELERATOR に対応しているみたい。
Intel の OPAE、Xilinx の XRT を Related Work にあげているのでその辺りを Unified OpenCL Integration したいのでしょう。その pdf には Vitis HLS との連携例も出ている。
一応これも PoCL で環境だけはコンパイルできる。ENABLE_ALMAIF_DEVICE を ON にするだけ。FPGA の環境がないと結局出来ない気がする。これも今後の課題かな。
リンク集
Fixed-Function Accelerators についての記述。 accel ドライバなくなっちゃったんで昔の情報だと思う
OpenASIP。RISC-V に対応しているらしいね。
Zynq に何故か対応している。TCE とか TTA とかいうキーワードが。
TTA-based Co-design Environment。User Manual v1.22。
PoCL に hwloc がオプションになっている。 「ポータブル ハードウェア ローカリティ (hwloc) ソフトウェア パッケージは、NUMA メモリ ノード、ソケット、共有キャッシュ、コア、同時マルチスレッドを含む、最新のアーキテクチャの階層トポロジのポータブルな抽象化(OS、バージョン、アーキテクチャなどにまたがる) を提供します。また、キャッシュやメモリ情報などのさまざまなシステム属性や、ネットワーク インターフェイス、InfiniBand HCA、GPU などの I/O デバイスのローカリティも収集します。」 使いみちがわからない。
Torque。 クラスタ用の job manager
HPX?当面はいらんだろう remote procedure callを提供する並列・並行・分散アプリケーションの実行環境&ライブラリ
2023-8-26 21:46 JST