Vengineerの妄想(準備期間)

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

OpenACCは生きていて、CUDAで書くより速くなる場合もあるって?

@Vengineerの戯言 : Twitter
SystemVerilogの世界へようこそすべては、SystemC v0.9公開から始まった

昨日のInte SYCL Compilerのドキュメントで、ちょこっとOpenACCのことを書きましたが、最近のOpenACCのことを調べてみたら、なんか出てきました。

これ、

qiita.com

え、CUDAよりOpenACCの方が速くなってって?

このブログの過去ログみたら、結構OpenACCのこと書いていました。

vengineer.hatenablog.com

昔、CAPSという会社のOpenACCを使った時があって、いかにCUDAで書いたコードと同じ処理速度が出せるかを試したことがあります。その時はほぼ同じぐらいになりました。ちなみに、CAPSはその後破綻し、ソースコードは売りに出ていました。

 

Intelは oneAPI でOpenCLではなく、SYCL、

NVIDIAはCUDAではなく、OpenACCに。

 

コアなエンジニアじゃなければ、ベタでOpenCLやCUDAを書くより、コンパイラ技術を利用して、もっと使いやすい? SYCL や OpenACC を使えと。。。

どちらが良いかは、人やアプリケーションによるんだろうけど、技術は常に進化するので、常に追っかけないと、浦島太郎状態になっちょうね。

 

Intel SYCL Compiler のドキュメント

@Vengineerの戯言 : Twitter
SystemVerilogの世界へようこそすべては、SystemC v0.9公開から始まった

昨日の、Intel oneAPI のブログの最初にも書きましたが、Intel SYCL Compiler。

github 内のドキュメント関連を見たら、色々と載っていました。

github.com

SYCLCompilerUserManual.md を覗いてみたら、

SYCL specific command line optionsということで、

  • -fsycl
  • -fsycl-targets=<value>

というのがありますね。targets には、何が設定できるのだろうか?

下の方には、

  • -fintelfpga

のように、Intel FPGA 用のオプションもあります。

コンパイルは、

$ clang++ -fsycl-device-only sycl-app.cpp -o sycl-app.bc

のようにして、出力ファイルは、LLVMバイトコード

また、SPIR-V formatにも出力できるようですね。

$ clang++ -fsycl-device-only -fno-sycl-use-bitcode sycl-app.cpp -o sycl-app.spv

 

このファイルがどうやら、-fintelfpga のテストコードみたい。

そして、このディレクトリ には、テストコードいっぱい。

RISC-Vのテストコードもありますね。PS4も(あ、PS4って、x86-64でしたね)

PPCも。あ。。。これ、SYCLのテストじゃなくて、LLVMのテストですね。(笑)

 

llvm/SYCLCompilerAndRuntimeDesign.md 

には、SYCL Compiler architecture の図も載っています。

OpenACCのように、ホスト側のコードとデバイス側のコードを分けて、それぞれのコンパイラコンパイルして、最終的に両方のオブジェクトをまとめて、Fat Library にするって感じですね。NVIDIAのCUDAのプログラムと同じ感じですかね。

(そう言えば、OpenACCって、OpenMPと一緒になったんですかね?)

OpenACC - Wikipedia には、

  • Version 2.5 of the specification was released on October 2015
  • Version 2.6 was released on November 2017
  • The latest version of specification, version 2.7, was released on November 2018
  • GCC 9.1 offers nearly complete OpenACC 2.5 support

とあるので、とりあえず、GCCを使えばいいんですね。

 

チョット脱線しちゃいましたが、Intelの拡張として、

llvm/SubGroupNDRange.md

というのがあるみたいですね。

 

 

Intel oneAPI の詳細を発表、および、Beta版をリリース

@Vengineerの戯言 : Twitter
SystemVerilogの世界へようこそすべては、SystemC v0.9公開から始まった

先週は、SC19でいろいろと発表がありましたね。

今日は、その中でも、IntelのoneAPI 。

10月に、IntelがSYCL Compilerをリリースして、いよいよ、oneAPIの準備ができたことをこのブログでも書きました。

vengineer.hatenablog.com

発表資料のスライドは、ここ

Intelのスライドは、青が基調ですが、このスライドは白っぽいグレー。

しかしながら、後編、oneAPI に関する部分は青になっています。

インテルのプレス:

newsroom.intel.com

oneapi.com なるドメインのサイト。ロゴもあって、ロゴの使用についてもいろいろ書いてあります。ステッカーだけでなく、パーカーも。そう、最近はロゴもブランドには大切な要素。

www.oneapi.com

この中では、

DPC++ : oneAPI Data Parallel C++

oneDPL : oneAPI Data Parallel C++ Library

oneDNN : one API Deep Neural Netowrk Library

oneCCL : one API Collectiv Communications Library

LevelZero : oneAPI Level Zero

oneDAL : oneAPI Data Analytics Library

oneTBB : oneAPI Threading Building Blocks

oneVPL : oneAPI Video Processing Library

oneMKL : oneAPI Math Kernel Libary

ほとんどに、oneAPI が付いています。

MKLDNNは、oneAPI Deep Neural Netowrk Libraryに。

TBB、MKLにも、oneAPI が付いています。

なんで、Level Zeroだけ、oneLevelZeroじゃなくて、LevelZero?

Intel内のoneAPIのサイトは、こちら。

software.intel.com

 FPGAにも、oneAPI

 

 このプログラミングガイドを読むと全体が分かります。

 いろいろな資料をざっくり見てみました。

レーニングビデオは何故か?サイトが違う。

 

 ということになりました。

そう、oneAPI は、Intelの新しいブランド名!

RICOH THETAでTensorFlowが動く?

@Vengineerの戯言 : Twitter
SystemVerilogの世界へようこそすべては、SystemC v0.9公開から始まった

medium.com

によると、tensorflow-theta というものがあって、RICOH THETA で物体認識ができるって。

THETAでTensorFlowを動かすには、下記の記事を読んでねと。

medium.com

RICOH THETAって、Androidだったんですね。

 

Qittaにも記事がありました。Android 7.1.1が動いてるんですね。

qiita.com

下記のスライドによると、Androidが搭載されたのは、2017年のTHETA Vからなんですね。

www.slideshare.net

THETA Developers Independent Community というのもありました。

github.com

 

verilator、結構凄いことになっていた

@Vengineerの戯言 : Twitter
SystemVerilogの世界へようこそすべては、SystemC v0.9公開から始まった

こんな状況になってので、verilator について、いろいろ調べてみています。

 verilatorのサイトは、こちら

www.veripool.org

ソースコードは、github に移行していました。

github.com

このプレゼンテーション資料、によると、マルチスレッド対応している模様。

とある回路のベンチマークでは、マルチスレッド対応前のv3.926に対して、v4のシングルスレッドでまず30%アップし、マルチスレッドでは、4スレッドで1スレッドに対して1.9倍になったと。何故かマルチチップ構成のベンチマークになっていて、

  $ numactl –C 0,2,4,6 sim_executable

にてコントロールすると、シングルスレッドに対して、2.5倍になったと。

フリーランチだー。。。

12スレッドでは、5.5倍、チップをまたがると一気に性能がさがっちゃうんの、1チップ内で完結するようにしないとダメということ。。。

おまけとして、Hotchip 31のTeslaの発表では、

01:09PM EDT - Used Verilator, 50x faster than commercial simulators

 にあるように商用シミュレータに対して、50倍速かったと。。なんと。

 

C++/SystemCモデルと接続できるようになっていんですね。

知らなかったですよ。トップ階層でしか接続できないようですが。

SystemCとの接続は、ここ の 「Chapter 5. The SystemC Test Bench」にいろいろ書いてありました。サンプルコードは、ここ

#include <systemc.h>

// Include common routines
#include <verilated.h>

// Include model header, generated from Verilating "top.v"
#include "Vtop.h"

int sc_main(int argc, char* argv[]) {
// See a similar example walkthrough in the verilator manpage.

// This is intended to be a minimal example. Before copying this to start a
// real project, it is better to start with a more complete example,
// e.g. examples/c_tracing.

// Prevent unused variable warnings
    if (0 && argc && argv) {}

// Construct the Verilated model, from Vtop.h generated from Verilating "top.v"
    Vtop* top = new Vtop("top");

// Initialize SC model
#if (SYSTEMC_VERSION>=20070314)
    sc_start(1,SC_NS);
#else
    sc_start(1);
#endif

    // Simulate until $finish
    while (!Verilated::gotFinish()) {
#if (SYSTEMC_VERSION>=20070314)
        sc_start(1,SC_NS);
#else
        sc_start(1);
#endif
    }

    // Final model cleanup
    top->final();

    // Fin
    return 0;
}

 sc_main関数の中でインスタンスを設定するだけでOKなんだね。

こちらの例題では、信号線ありのコード。

 

とりあえず、WSL に SystemC 2.3.4 と verilator v4.022 をインストールしました。

 verilatorのビルド後、

  $ make test

を実行したら、ここに書いてあるエラーが発生したので、SystemCをビルドするときに、-DCMAKE_CXX_STANDARD=14 を指定しました。

  $ cmake .. -DCMAKE_CXX_STANDARD=14 -DCMAKE_INSTALL_PREFIX=/usr/local/systemc 

 このオプションでSystemCをビルドしたら、エラーが無くなり、最後までテストが通りました。

テストでは、test_regress ディレクトリと examples ディレクトリをすべて実行しているようです。

テストが通ったので、インストール

  $ sudo make install

 

SystemCの例題、その1:

make_hello_sc ディレクトリにて、make コマンドを実行したら、

以下のようなコマンドが実行されました。最初の verilator コマンドにて、-sc オプションにて SystemC を利用できるようにして、make コマンドにて実行プログラム obj_dir/Vtop を生成し、その obj_dir/Vtop を実行しています。 

$ make

-- Verilator hello-world simple example
-- VERILATE ----------------
verilator -sc --exe top.v sc_main.cpp
-- COMPILE -----------------
make -j 4 -C obj_dir -f Vtop.mk
make[1]: Entering directory '/mnt/c/Users/haray/home/src/verilator/examples/make_hello_sc/obj_dir'
make[1]: Nothing to be done for 'default'.
make[1]: Leaving directory '/mnt/c/Users/haray/home/src/verilator/examples/make_hello_sc/obj_dir'
-- RUN ---------------------
obj_dir/Vtop

 そうすると、SystemCシミュレータが起動し、"Hello World!"を表示し、Verilog HDLの$finish システムタスクが実行され、終了しています。

SystemC 2.3.4_pub_rev_20190904-Accellera --- Nov 23 2019 14:49:38
Copyright (c) 1996-2019 by all Contributors,
ALL RIGHTS RESERVED
Hello World!
- top.v:10: Verilog $finish
-- DONE --------------------
Note: Once this example is understood, see examples/make_tracing_sc.
Note: Also see the EXAMPLE section in the verilator manpage/document.

Verilog HDLコードの以下の $display と $finish システムタスクが実行されたことになります。

module top;
    initial begin
        $display("Hello World!");
        $finish;
    end
endmodule

 

SystemCの例題、その2:

make_tracing_sc ディレクトリにて、make コマンドを実行したら、

以下のようなコマンドが実行されました。最初の verilator コマンドにて、-sc オプションにて SystemC を利用できるようにして、make コマンドにて実行プログラム obj_dir/Vtop を生成し、その obj_dir/Vtop を +trace オプションを指定して実行しています。 


-- Verilator tracing example

-- VERILATE ----------------
verilator -sc --exe -O2 -x-assign 0 -Wall --trace --assert --coverage -f input.vc top.v sc_main.cpp

-- COMPILE ----------------=
make -j 4 -C obj_dir -f ../Makefile_obj
make[1]: Entering directory '/mnt/c/Users/haray/home/src/verilator/examples/make_tracing_sc/obj_dir'
make[1]: Nothing to be done for 'default'.
make[1]: Leaving directory '/mnt/c/Users/haray/home/src/verilator/examples/make_tracing_sc/obj_dir'

-- RUN ---------------------
obj_dir/Vtop +trace

SystemC 2.3.4_pub_rev_20190904-Accellera --- Nov 23 2019 14:49:38
Copyright (c) 1996-2019 by all Contributors,
ALL RIGHTS RESERVED

top.vにて、

[0] Model running...

を表示し、sub.v にて、

Enabling waves into logs/vlt_dump.vcd...
[43] fastclk is 5 times faster than clk

*-* All Finished *-*
- sub.v:45: Verilog $finish

が表示されます。verilator コマンドのオプションとして、--coverage を指定したのでコードカバレッジを実施しています。logs/coverage.dat がカバレッジデータ。

-- COVERAGE ----------------
verilator_coverage --annotate logs/annotated logs/coverage.dat
Total coverage (6/20) 30.00%
See lines with '%00' in logs/annotated

-- DONE --------------------

verilator コマンドのオプションとして、-trace を指定したので、波形のダンプを行い、下記のように波形ビューアーにて、logs/vlt_dump.vcd を見てねと。
To see waveforms, open vlt_dump.vcd in a waveform viewer

 

examples では、obj_dir に verilator によって生成されたC++/SystemCコードとC++コンパイラコンパイルされたオブジェクトファイルやライブラリ、実行プログラム(Vtop__ALL.a)だけでなく、Makefile (Vtop.mk) もあります。波形ダンプをするためのオプション (-trace) を指定すると、verilated_vcd_c.x が、コードカバレッジを実施するためのオプション (-coverage) を指定すると、verilated_cov.x が生成される。

 

verilator は、Perlスクリプトで、実行プログラムは、verilator_bin/verilator_bin_dbg。verilator_coverageはPerlスクリプトで、中でverilator_coverage_bin_dbgを呼んでいる。

 

C++モデルでも同じようなことはできるけど、信号線の扱い(クロックとかリセット)が面倒なので、SystemCでやればいいんじゃないかな。

 

Robotics RB3 Platformの関連ブログ

@Vengineerの戯言 : Twitter
SystemVerilogの世界へようこそすべては、SystemC v0.9公開から始まった

ちょっと前に書いたの Robotics RB3 Platform に関するブログがいろいろとアップされています。

www.96boards.org

www.96boards.org

www.96boards.org

www.96boards.org

www.96boards.org

www.96boards.org

www.96boards.org

www.96boards.org


NNgenをFPGAXのTL中にオープンソース化する

@Vengineerの戯言 : Twitter
SystemVerilogの世界へようこそすべては、SystemC v0.9公開から始まった

(2018年9月17日 電子情報通信学会リコンフィギャラブルシステム研究会にて発表された「ディープニューラルネットワーク向け拡張可能な高位合成コンパイラの開発」

www.slideshare.net

この時は、大人の事情で、ソースコードの公開はされていませんでした。

しかしながら、先日のfpga-x #12にて、

(今回は東工大だったので、平日&遠いので行きませんでしたが、TwitterのTLにて流れてくる情報にて)

fpgax.connpass.com

後半のTLにて、イケメンのお兄さんが

 にて、NNgen をオープンソース化に、29頁に

「これからNNgenをオープンソース化します!」となって、オープンソース化されました。

github.com

そして、v1.1 になり、

 ソースコード解析のOKもでました。

 コニカミノルタとの共同開発のプレス発表も

 

サクッて見てみたんですが、Veriloggenベースなので、Veriloggenを学ばないと、ダメなことが分かり、

github.com

Veriloggenに関するスライドは、いっぱいありますよ。

www.slideshare.net

www.slideshare.net

www.slideshare.net

www.slideshare.net

www.slideshare.net

www.slideshare.net