新千葉 ガーベージ・コレクション

FPGA マガジンやインターフェースで書けなかったこと等をちょぼちょぼ書いてます。@ryos36

Polyphony のパイプライン

高位合成コンパイラ から データ・フロー・コンパイラ

Polyphony では pipeline というキーワード(もっと正確な単語を考えないと)、で処理をパイプライン化することが出来るようになった。これはいつ入ったか忘れたけど、v0.3.6 からか?v0.3.5 が 2019/5/9 で v0.3.6 が 2019/5/30 でそもそも現バージョンはパンデミック前の 4年前。そろそろちゃんと v0.3.7 出さないとね。

pipeline

Polyphony は単なる高位合成ではなく、データ・フローをかなりしっかりおっている。なので、データ・フロー・コンパイラと呼びたい(勝手に呼んでいるだけ)。どれくらいしっかりおっているかというと、pipeline 化する時に for 文の展開をかなり真面目にやっている。

例えば、for 文による多重ループ。これがあると単純には pipeline 化出来ない。そこで多重ループを1重ループに展開している。

if 文は以前から mux 化(ハードウェア化)している。 なので if 文による分岐という概念はない。データ・フロー的にも for 文の中に if があっても大丈夫なように設計されている。

コンパイルはフェーズの最初では if などは then と else のブロックに別れているが、多重ルールの展開など、様々なパスを経るうちにブロックというよりデータ中心のデータ・フローが出来上がる。

中間的にはデータフローを考慮した IR ぽい形になって、抽象的な HDL となり、最終的に Verilog-HDL に出力される。

MyHDL 的なものとの整合性

pipeline 化すると、外部のインタフェースとうまく適合して、効率よくデータの受け渡しが出来るようになりたい。そうすると、どうしても Python の関数インタフェースでは表現できない。結果として、MyHDL がそうであったように、signal 的あるいは wire 的なオブジェクトを生成し、それを I/F とする、、、という手法に向かう。

でも、それってダサくない?

結局、Verilog-HDL を Python や C で書き下すような感じなる。つまり Verilog-HDL でこういう I/F になるはずだよねという事を想像しながら、その HDL コンパイラ独自のデータ変換方法に合わせて記述をしていく。プログラムが持つ本質の I/F で表現されることなく、表面上の記述変換をするはめになる。

現時点で良いアイデアはないのだが、とりあえず github にある Polyphony の開発途中のバージョンのブランチでは、よりうまくその手の I/F を記述可能になりつつある。出来たら v0.4 になるのかな?

ミュシャは二流の画家、その絵はオタクのいう萌え絵程度の絵で、芸術ではありません。

ミュシャは二流の画家、その絵はオタクのいう萌え絵程度の絵で、芸術ではありません。

どこの誰だか知らないが、twitter のつぶやき。なんだかね。

ムハって書いたほうがいいの?まぁミュシャでいいや。

「彼の出世作は1895年、舞台女優サラ・ベルナールの芝居のために作成した『ジスモンダ』 (en:Gismonda) のポスターである。(wikipedia)」1895 年だから印刷技術が上がってきてカラーで大量生産できるようになった頃。この技術のおかげでミュシャは芸術家というよりいまでいうなら商業的なイラストレータとして成功した人だという印象は確かにある。 スラブ叙事詩はその後。wikipedia によるとスタートは 1910 とある。50歳で始めて70歳で完成。

作風は「女性と様式化された装飾の組み合わせが特徴的(wikipedia)」とあるように一種のブロマイドだったわけだ。そういういみではある種類の商業的な香りは否定できない。いずれにせよ、イラストレータとして一流(売れっ子という意味で)であったことは間違いなさそう。

描く女性像には、なにかしらの強さを感じる。サラ・ベルナールのポスターを幾つも手がけているところを見ると、なんかしらの共感があったのでしょう。装飾もデザインも素晴らしいし後のスラブジョジョ詩じゃなかった、スラブ叙事詩、とも合わせて大きな功績を残したと言えるのじゃないかな?どっかの誰かに二流と評される言われはない気がする(まぁ個人の感想なのだからそういうのなら仕方ない)。

評した人は「二流」の言葉の中に「大衆的なちんぷさ」を表現したかったのかもしれない。都内の渋谷あたりで開かれたミュシャ展は確かにその「ちんぷ」さが漂っていた。輸入して並べてハイみたいなチンプさ。同時期に千葉市美術館で展示していた同じジスモンダでも質が千葉のほうが良かったように思うし、展示もミュシャという視点ではなくオルリクと合わせていて、キュレーターの意図を感じた良い展示だった。

余談だが、千葉のオルリクの作品では、ん?ウォーホル?と感じる部分があって、後でキュレーターの人に聞いたら、キュレーターが意図的に並べたということ。時代的に会わないからおかしいと思ったよ。キュレーターの後知恵なのか、オリジナルの作品の意図なのかを区別するのは難しい。

われわれは、現代に生きているのでウォーホルもオルリクもミュシャも同時にみてしまう。その時代にさかのぼって見ることは出来ない。ミュシャ後の世界でいろいろな「チンプ」なものを見ているので、それを「類型的」で価値なしとはなかなか言えない。その「類型」の創始者かもしれないのだ。ピカソキース・ヘリングを正確には評価できないということだ。人間にはその能力はない。かといって美術評論家や哲学者もどき?の意見をそのまま鵜呑みにしていいのかも難しい。美術鑑賞には誰かが仕掛けた戦略かもしれないという罠はいつもつきまとう。青が特徴的な髪をゆう少女の絵やオークションで切り裂かれた”名作"は誰かが暗躍しているかもしれないのだ。

結局、自分の目を信じるしかない。

で私の感想は「描く女性像には、なにかしらの強さを感じる。」だ。

女性像はマリリン・モンローと前と後ではえらく違うと思う(私見です)。女性を何かの装飾品として扱うことが多かった(多い)ハリウッド的手法が横行する現代に生きる我々は、当時の女性像を正確には感じることが出来ないだろう。1890年ごろ(印刷技術があがってきたころ)から1950年ごろ(ハリウッド的な女性像が蔓延し始めるころ)前までの女性像はそういう意味では貴重だ。印刷技術という意味では日本は浮世絵の技術が飛び抜けていた(だろう)から、日本に限って言うともっと前からとも言えるかも。

浮世絵だったり竹久夢二だったり北野恒富だったり(あ〜全部、千葉市美術館の受け売りだ)はマリリン・モンロー以前の女性像で、過度にセックスとしての女性を強調していない(春画は置いておいて、、、)貴重な時代の女性像だと思う。そして、マリリン・モンロー以後に生きる我々はもう二度とあのような絵を作ることは出来ない。

日本のそれらの絵に比べると、やはり、ミュシャは「強さ」を持っているように感じる。「類型的」どころか、他に類をみないのではないだろうか?クリムトもどっちかというと色っぽいからね。ミュシャはそういう意味で独特。サラ・ベルナールに影響されたのか?単にスポンサーの意向を聞いただけなのか?は不明だが、その後に、スラブ叙事詩を描いたところを見ると、そういう気質の画家だったのだなぁと思う。

つぶやいた人の話に戻る。

多分、美学という学問の中ではなにかしら体系的なものがあって、ある種の統一的な順序付けに伴う、一流、二流の基準があるのでしょう。でも「おたくの言う萌え絵程度」という評や「類型的」という評は、私からすると、ん?後知恵で物言ってない?と思ってしまうよ。野球ファンの「いまのはバントでしょ」みたいな。 だって、「萌え絵」は過度にセックスを強調した特徴がある(たぶん)からね。それはミュシャにはないよ。むしろ、見るものを見返し正対する強い視線を感じませんかね?作品にもよるでしょうが。

何を言いたかったかったのだろう?プロフィールを見ると哲学者らしいよ。

ロールズを引き合いに出して。まぁ、ここは高校の倫理社会と大学の宗教論(落ちそうになったぜ)程度の知識しかないので墓穴を掘りそうだけど、、、あえて書いてみようか。ロールズなみにボコボコにされそうな予感は駿河

ロールズの主張は時代背景的なキーワードとしてモハメド・アリだったり、ウッドストックだったりというのがあった頃だと思うんだよね。でも、「あいつらギター燃やして音楽の何たるかをわかっていない。そんなことせずに、ちゃんと勉強すれば、戦場にはいかないのだ!!」とは主張しなかった。合理的な考えを要求はしていたから微妙ではあるけど、基本的には弱者の立場にたって世の中のルールを作っていこうよと主張した人だと思う。そういうコンセプト提示が哲学者の役目だよね。

何を言いたかったかったのだろう?

芸術はちゃんと勉強したものにしかわからないよ!!という主張なら哲学者としてちょっと悲しい。もうちょいよく解釈してみるか。チンプな大衆迎合をするなかれ。全体主義こそ我々の敵だとか言いたかったのかもしれないね。そうあるといいな。

真意は謎だが、周辺化された弱者を考えるならもう少し表現を考えたほうが良かったかもしれない。 私は、わざわざ人の家に土足で上がってきて、 「なんだインスタン麺なんか食べているのか!こんなものは三星レストランに比べたら料理じゃない!」とか 「こんな音楽を聞いているのか!」「こんな絵を飾っているのか!」 と言っているのにかなり近い気がしているんだよね。

twitter ってのはこういう出会い頭の衝突みたいなのがある世界だから、土足で上がってきてというのはちょっと違うかもしれないね。もっと、みんなで、なま暖かく見守るのがいいのかもしれない。

でも、哲学者なんだよね。なんか社会にコンセプト提示する立場だよね。まさか炎上して言葉遊びをするゲームを楽しんでいるということはないよね。ゲームという言葉をチラ見したのでちょっと気になるよ。 そのゲームはそちらの土俵だからこちらはその土俵にあがるのも辛いし、自分のお気に入りを twitter という井戸端会議の場とはいえディスられたら気持ちがいいものではないよね。私はあまりミュシャの件にはひとそれぞれという気持ちがあるからまぁいいかなとも思うし、当てていると思う部分もあるから気にはなるけど、まぁ twitter だよね、見知らぬ誰かに「おまえ」呼ばわりされる世界だよね。という気持ちもあるからまぁどうでもいいやと見過ごせるけど、、、

哲学者と名乗る人が、「人の気持ちをざわつかせる表現をしておいて、ゲームに参加してね、いつでも OK。」みたいな、今の時代にわざわざ、分断の種みたいなものをまくのはどうも釈然としない。なんかしらのコンセプト出して(真意が謎すぎる)世の中を議論させるならもうちょい建設的な議論に向かわせる何かをしてくれよ。

まぁ、でも他のつぶやきをみていると、どうも本人自身も年齢的なものであったり健康的な部分で周辺化されているようにも見えるから、人間、弱くなるとなんか気を紛らわさないといけないのかなという感想もある。そういう意味で、twitter の民としてはみんな適当につきあってあげるというのが落とし所なんだろうね。

やれやれだぜ。

あさがおプロジェクト

あさがおプロジェクト やってます。

asagao.48ers.jp

Hugo で管理していますが、う〜〜ん。って感じなので、common lisp に戻す予定。 Bulma 使えばいいじゃんって感じ。結局、WordPress でも golang でもなく css と js ができればいいという結論。 clack つかって久々にアプリも作った。 BING MAPS と連携

このでかい千葉市!!っていう文字なんとかならないのか? あと近所の駅をけんさくの API。この間まで漢字で情報が取れたのに、、、 一部、ローマ字になっている。変えたつもり無いんだけどな、、、、

PlatformIO 再び

数カ月前に PlatformIO 結構使ってたのだけど、久々にトライしたら、すっかり忘れてしまっていた。

ターゲットは NUCLEO L552ZE https://docs.platformio.org/en/latest/boards/ststm32/nucleo_l552ze_q.html

> pio init nucleo_l552ze_q
編集
> cat platform.ini
[env:nucleo_l552ze_q]
platform = ststm32
board = nucleo_l552ze_q
framework = arduino

arduino でいいや src に test.ino 追加

void
setup()
{
    Serial.begin(115200);
}

void loop()
{
    Serial.println("Hello");
    delay(1000);
}
> pio run
********************************************************************************
Obsolete PIO Core v5.0.4 is used (previous was 5.1.1)
Please remove multiple PIO Cores from a system:
https://docs.platformio.org/page/faq.html#multiple-platformio-cores-in-a-system
********************************************************************************
Processing nucleo_l552ze_q (platform: ststm32; board: nucleo_l552ze_q; framework: arduino)
--------------------------------------------------------------------------------
Error: Unknown board ID 'nucleo_l552ze_q'

あれ?うまくいかない。

** まじか最初から

> python3 -m venv work2021_autumn
[work2021_autumn]> pip install wheel
[work2021_autumn]> pip install ../platformio
[work2021_autumn]> pip install scons

scons いるのかどうか不明。

[work2021_autumn]>pio init --board=nucleo_l552ze_q

あれ?そういう問題じゃないのか

 pio run
********************************************************************************
Obsolete PIO Core v5.0.5b5 is used (previous was 5.1.1)
Please remove multiple PIO Cores from a system:
https://docs.platformio.org/page/faq.html#multiple-platformio-cores-in-a-system
********************************************************************************
Processing nucleo_l552ze_q (platform: ststm32; board: nucleo_l552ze_q; framework: arduino)
--------------------------------------------------------------------------------
Error: Unknown board ID 'nucleo_l552ze_q'

なんでやねん。pip unistall platformio でもっかいpip install platformio したら大丈夫になった。 ../platfromio がだめだったか?

よくわからんが実績のあるボードで確認 あれ?ダウンロードされない。前のプログラムが走る、、、なんで?

platformio run -t upload

使い方の問題 upload を付け忘れ。あ~全部忘れているのか。

Xilinx の XRT とかざっくり調べた

Xilinx の最近の環境を調べたよ。U50 とか KV260 とかね。

U50 つかってみる |

Vitis AI とかなんかコンパイラ持っているみたいね。(これは調べていない)

VVAS (Vitis™ Video Analytics SDK)

GitHub - Xilinx/VVAS このアクセラレータ+ gstreamer で ROI の切り出しとかやるみたい。ZCU104 の platform があるけど、おそらく、KV260 でも使える。というかKV260 の smartcamera の中心ライブラリ、というよりgstreamer のプラグインか。

video-sdk

https://xilinx.github.io/video-sdk/v1.0/index.html U30 ようになっているけど、これが今後中心になるのか?

VCU

H.264/H.265 Video Codec Unit kv260 で VCU つかえる。つまり H.264 と H.265 が使えるみたい。IP として Vivado に張り付けられる。が、これって普通に SoC についているものだよね。内部がわかって面白いけど。ライブラリとして使うなら別に IP になってなくてもいい気がするぞ。で結局最後は OpenMAX 使うみたいだし。

gstreamer

GitHub - Xilinx/gstreamer わざわざ fork しているが、ここにはアクセラレータはない。なんかパッチ当たっているんだろうね。gst-omx とか gst-plugin-base とか gst-plugin-good あるいは bad とかあるけど全部アクセラレータは入っていない。ただの gstreamer (+ パッチでしょう)。Xilinx 的なプラグインは上の VVAS です。

QDMA と Open NIC Driver

GitHub - Xilinx/dma_ip_drivers: Xilinx QDMA IP Drivers GitHub - Xilinx/open-nic-driver https://github.com/Xilinx/open-nic-shell QDMA は仮想化に対応した DMA みたい。U50 で提供されているのは XDMA なのでこの辺は使えないなぁ。shell =プラットフォーム。やっぱり u200 とか u250 とかだね。shell に QDMA があるみたい。

PCIe debug?

なんじゃこりゃ https://xilinx.github.io/pcie-debug-kmap/

XilinxVirtualCable

GitHub - Xilinx/XilinxVirtualCable バーチャルケーブルのソース公開されてるんだっけ。そういえば。

OpenAMP と triSYCL

まぁ Intel も oneAPI だしていることだし。この辺はカバーするんでしょう。 https://github.com/Xilinx/open-amp https://github.com/Xilinx/triSYCL

XRT の次のバージョン?

GitHub - Xilinx/xoclv2: XRT Second Generation Linux Kernel Driver (XRTV2) そういえば Linux は5.11 から変わったので今の XRT は使えないのよ。5.10 までは凍結して、次のバージョンを作っているのかな?

ROAST?

なんだろう。Python で構築したML に関するテスト環境? https://xilinx.github.io/roast/

XMA (Xilinx Media Accelerator)

ドキュメントを読む限りではなかなかよさそうな気もするけど、2021.1 + U50 では使えないよ。最新の XRT に XMA が追いついていないみたい。XRT もバージョンアップされるみたいだからそれと一緒にアップデートさえれるのか?それともなくなる?(XMA ベースのは結構あるけど) GitHub - Xilinx/xma-samples https://xilinx.github.io/XRT/2021.1/html/xma_user_guide.html

DPU(Deep Learning Processor Unit)

KV260 の overlay(といいつつ一つのbitstream になるけど) の smartcamera とかに使われているエンジン。どうやら 以前 PE とかいってたものがまとまって DPU になったぽい。PE が順番に処理していくんだよね。GPU 的な感じ?今後はそういう路線みたいね。 DPU for Convolutional Neural Network GitHub - Xilinx/smartcam

kv260 でなんだか知らんが Debian Linux が動いたよ

まずはちょっと前にも書いたけど platform をつくる。ここでいう platform は、Vivado でつくったARM CPU + ハードの環境から xsa を作る事ね(不正確なにおいがする)。 昔は Vivado で ARM CPU + ハードを作ったら、SDK 立ち上げて、それでもって FSBL とかアプリとか作ってた。いまは xsa をつくって、Vitis (SDK の代わり) からその xsa を読み込んでソフトウェアのアプリを作るよ。 よくわかってないけど、xsa には昔の SDSoC とか言っていた機能"も"上の仕組みとは別に作る事が出来るみたい。昔の SDSoC で同じ呼称の platform といっていた中途半端な IP のつくりかけ vivado みたなのを用意してたけど、同じようなことができるみたい。っていうかどちらかというと SDAccel なのかな。OpenCL を使う方法と Vitis HLS を直に使う方法の2つがあるみたいね。いまはそこまで(私は)到達してないよ(っていうかもっと正確に誰か書いてくれ)

正確な情報はここにある

これみればいいきがするぞ。 xilinx-wiki.atlassian.net

以下、人柱的報告

Platform をつくる

ということで github.com を clone。 そして、Vivado 2020.2.2 の環境設定をして

 make platform PFM=kv260_ispMipiRx_vcu_DP JOBS=3

JOBS は適当にしないとメモリを食いすぎて途中で死にます。そして、最後にどういうわけか X Windows に依存したプログラムが走るらしく、Desktop 環境から make しないとうまくいかない。最初、ssh で入ってやったら最後に Xvfb が無いと言って怒られます。も~

で、xsa ができます。

./platforms/xilinx_kv260_ispMipiRx_vcu_DP_202022_1/hw/kv260_ispMipiRx_vcu_DP.xsa

どういうわけか bit は出来なかったので(後回し、、、) xsa だけです。

fsbl と pmu の firmware をつくる

これは本家の作り方ではなくて、、、

GitHub - ikwzm/ZynqMP-U-Boot-Ultra96-V2: Boot Loader(U-Boot, FSBL, PMUFW,ATF) for Ultra96-V2

を参考に script を利用させてもらった。tcl がほぼそのまま使える。

#set hwspec_file       "design_1_wrapper.hwdef"
set hwspec_file       "kv260_ispMipiRx_vcu_DP.xsa"

こんなかんじで hwdef じゃなくて xsa を読ませることができる。(一応、ドキュメント読んで出来ることを確認してます。はい。)

trusted firmware

これはなんとなくつくれた。

arm-trusted-firmware-2020.2.2_k26

u-boot

これも u-boot-xlnx-2020.2.2_k26 の tag を clone して作成。本家のドキュメントによると 2020.1 以降は xilinx_zynqmp_virt_defconfig を使うらしい。 u-boot.elf できた。何のパッチも当てていない。

boot.bin

これは bootgen でつくる。bif は ZynqMP-U-Boot-Ultra96-V2 の boot.bif を拝借。bit ファイルがないのでそこだけ削る。

Linux の Image と FS

Image と FS は

GitHub - ikwzm/ZynqMP-FPGA-Linux: FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager U-Boot&Linux Kernel&Debian10 Images (for Xilinx:Zynq Ultrascale+ MPSoC)

から拝借。コピー。

ramdisk と boot.scr と system.dtb

これは KV260 の SD カードからコピー。っていうか u-boot ごとコピーしてよかった気がするよ。どうせ bit stream ないんだし。一応、dtb は dts にして大丈夫そうなのを確認したよ。

Linux の Image は Image と rename して、、、

たちあげ

どうも、一旦 ramdisk を立ち上げると、その後、パーティションがありそうなところをみつけて起動してくれるみたいよ。

ZynqMP> fatload mmc 1:1 0x00200000 image-5.4.0-xlnx-v2020.2-zynqmp-fpga
16964096 bytes read in 1917 ms (8.4 MiB/s)
ZynqMP> fatload mmc 1:1 0x00100000 system.dtb
42077 bytes read in 20 ms (2 MiB/s)
ZynqMP> fatload mmc 1:1 0x04000000 ramdisk.cpio.gz.u-boot
25150797 bytes read in 2841 ms (8.4 MiB/s)
ZynqMP>  booti 0x00200000 0x04000000 0x00100000

で、boot.scr をそのままつかったらもう上みたいなことを自動でやってくれるのね。 ということでキメラな Linux がたちあがりました。DHCPping が動くことまで確認。

やっていることは理論的はあっている気がするので、このままいくよ。

USB うごかんかった。

[    9.802600] systemd[1]: Detected architecture arm64.

Welcome to Debian GNU/Linux 10 (buster)!

[    9.823544] systemd[1]: Set hostname to <debian-fpga>.
[   10.013948] systemd[1]: File /lib/systemd/system/systemd-journald.service:12 configures an IP firewall (IPAddressDeny=any), but the local system does not support BPF/cgroup based firewalling.
[   10.030998] systemd[1]: Proceeding WITHOUT firewalling in effect! (This warning is only shown for the first loaded unit using IP firewalling.)
[   10.174430] systemd[1]: /lib/systemd/system/smbd.service:9: PIDFile= references path below legacy directory /var/run/, updating /var/run/samba/smbd.pid → /run/samba/smbd.pid; please update the unit file accordingly.

k260 の platform の make

 make platform PFM=kv260_ispMipiRx_vcu_DP

でエラー

/tools/Xilinx/Vivado/2020.2/bin/rdiArgs.sh: line 309: 728341 Killed 
                 "$RDI_PROG" "$@"
make[1]: *** [Makefile:29: project/kv260_ispMipiRx_vcu_DP.xsa] Error 137

メモリが足りないみたい。

https://japan.xilinx.com/support/answers/64434.html

ここには java のスタックを少なく白みたいなことが書いてあるが、、、 あとどっかには swap を増やせ見たいなことが、、、

kv260 の場合は解決方法は JOBS をすくなくするが一番簡単。

 make platform PFM=kv260_ispMipiRx_vcu_DP JOBS=1

だいたい JOBS=1 にすると 4G 位のメモリを消費するみたいだった。 うちのチープな環境なら JOBS=3 くらいか?デフォルトがたしか 8 なので、途中で全然メモリが足りなくなる。