Vengineerの妄想(準備期間)

人生は短いけど、長いです。人生を楽しみましょう!

Xeon + FPGAの開発環境OPAEがリリース



スライドは、ここ

この発表でシミュレーション環境があるのを説明しましたが、その環境がリリースされました。


アナウンスによると、0.9.0 のようです。リリースノート
引用
  System Compatibility

    ・Hardware: tightly coupled FPGA products 
                and programmable FPGA acceleration cards for Intel(R) Xeon(R) processors (to be released)
    ・Operating System: tested on RedHat 7.3, Linux kernels 3.10 through 4.7
    ・FIM (FPGA Interface Manager): 6.3.0

Intel FPGA Driverは、ここからダウンロードできます。
AlteraのFPGA Managerのようです。ドキュメント

sysfs files ; ドキュメント

ソースコードは、gituhub にあります。
ドキュメントは、ここ


ホワイトペーパーも公開されています。
ホワイトペーハーを読んだんだけど、最後のサンプルコード、アクセラレータを制御するのは、
CSR_CTLレジスタにコマンドを書き込むだけなんだよね。その前におまじないが多過ぎるよ。

引用します
#include <opae/fpga.h>
int main(int argc, char *argv[])
{
 fpga_properties filter;
 fpga_token afu_token;
 fpga_handle afu_handle;
 fpga_guid guid;
 uint32_t num_matches = 1;
 volatile uint64_t *mmio_ptr;
 volatile void *buf_ptr;
 uint64_t buf_handle;
 /* Enumerate */
 fpgaCreateProperties(&filter);
 fpgaPropertiesSetObjectType(filter, FPGA_AFU);
 /* (GUID 'guid' defined elsewhere) */
 fpgaPropertiesSetGUID(filter, guid);
 fpgaEnumerate(&filter, 1, &afu_token, &num_matches);
 fpgaDestroyProperties(&filter);
 /* Open and access */
 fpgaOpen(afu_token, &afu_handle, 0);
 fpgaMapMMIO(afu_handle, 0, &mmio_ptr);
 fpgaPrepareBuffer(afu_handle, BUF_SIZE, &buf_ptr,
 &buf_handle, 0);
 fpgaReset(afu_handle);
 fpgaWriteMMIO64(afu_handle, 0, CSR_BUF_ADDR, buf_ptr);
 fpgaWriteMMIO32(afu_handle, 0, CSR_CTL, 1); /* start */
 /* other accelerator logic */
 fpgaWriteMMIO32(afu_handle, 0, CSR_CTL, 7); /* stop */
 fpgaReleaseBuffer(afu_handle, buf_handle);
 fpgaClose(afu_handle);
 return 0;
}

調べてみたら、これは、FPGA APIというもので、libopae-c.so をリンクすればいい。
OPAE C API Programming Guide
OPAE C API リファレンス

このFPGA APIを呼び出すアクセラレータというクラスを使うともっと楽になるらしい。
そのアクセラレータクラスのコードは、ここ
このアクセラレータクラスは、libopae-c++.so をリンクすればいいと。


シミュレーション環境では、アクセレータ部のAFUはシミュレータ(VCS or ModelSim)で動作し、
DPI-C経由で別プロセスのプログラムと通信します。