PoCL をさぐる
HPCLLVM
2023-8-25 17:13 JST

PoCL をもう少し探検してみる。

PoCL 4.0

PoCL 3.0 の lib/CL/devices にあった accel がなくなってしまった。その代わり almaif というものが用意されるようになった。

CL_DEVICE_TYPE

その前に CL_DEVICE_TYPE について。だれかがちらっと書いている。タイプは次の4つ。

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 の環境がないと結局出来ない気がする。これも今後の課題かな。

リンク集