Vengineerの妄想

人生を妄想しています。

SDAccelでVivado HLSのCコード


TwitterXilinxのSDAccelに関して流れてきたので、ちょっと復習。

XilinxのSDAccelでは、OpenCLをサポートしています。
FPGAで処理する部分をOpenCLカーネルと記述します。
一般的なGPGPUでのOpenCLでは、GPU内のコアで並列処理するようにカーネルコードを書きます。

SDAccelでは、
OpenCLカーネルコードをGPGPUのようにコアで並列処理するのではなく、タスク処理するように書きます。

githubにて公開されているサンプルコードSmithwaterman Genetic Sequencing Demoを見てみましょう。

処理の内容ではなく、ホスト側でFPGA側をどのように読んでいるかを見てみましょう。
src/smithwaterman.cppの358行目

引用
        //call once to guarentee that all buffers are migrated to device memory
        err = clEnqueueTask(m_world.command_queue, kernel, 0, NULL, &events[evtKernelExec]);
        if (err != CL_SUCCESS) {
            LogError("[EX1] Failed to execute kernel %d", err);
            LogError("Test failed");
            return false;
        }
        clFinish(m_world.command_queue);

clEnqueueTask関数にて、FPGA部を呼び出しています。

GPGPUでは、clEnqueueTask関数ではなく、clEnqueueNDRangeKernel関数を呼び出します。

FPGA部の関数opencl_sw_maxscoreです。
ホスト側のコードはOpenCL APIを使っていますが、
FPGA側ではOpenCLカーネルコード記述ではなく、Vivado HLS Cコードになっています。

この点が、XilinxのSDAccelのポイントです。

XilinxのSDSoCもFPGA部にしたいコードは、Vivado HLS Cコードで書くので、
結果として、FPGA部はすべて Vivado HLS C コードで書けばいいのです。