O slideshow foi denunciado.
Seu SlideShare está sendo baixado. ×

PBL1-v1-100j.pptx

Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Próximos SlideShares
PBL1-v1-200j.pptx
PBL1-v1-200j.pptx
Carregando em…3
×

Confira estes a seguir

1 de 74 Anúncio

PBL1-v1-100j.pptx

Baixar para ler offline

IMAX3: Amazing Dataflow-Centric CGRA and its Applications
I present this slide to all hungry engineers who are tired of CPU, GPU, FPGA, tensor core, AI core, who want some challenging one with no black box inside, and who want to improve by themselves.

IMAX3: Amazing Dataflow-Centric CGRA and its Applications
I present this slide to all hungry engineers who are tired of CPU, GPU, FPGA, tensor core, AI core, who want some challenging one with no black box inside, and who want to improve by themselves.

Anúncio
Anúncio

Mais Conteúdo rRelacionado

Mais recentes (20)

Anúncio

PBL1-v1-100j.pptx

  1. 1. CPU GPU Ultimate CGRA w/ high-speed compiler CGRA for Energy-efficient Cryptography Beyond-Neuromorphic Systems Non-Deterministic Computing 1 ナレータ VOICEVOX:もち子(cv 明日葉よもぎ) はらぺこエンジニアに贈るCGRAの世界2022 (時間がない人版) スパコンからIoTまで 省エネ社会に AI+BCだけじゃない超効率計算手法 20210401
  2. 2. 20210401 2 20180716 2 電力需要の60%が情報機器 実効為替レートが低下し CPU/GPUが買えない未来 AIもクラウドもスパコンも 増やせない未来 CO2が減らないSociety 5.0 電力需要の10%が情報機器 非ノイマン型を 自給・輸出する未来 身の丈に合ったAIとスパコン と電力消費 低炭素社会 202X年 ノイマン型の段階的削減!?
  3. 3. Insn.1 Insn.2 Insn.3 Insn.4 Insn.5 Insn.6 Insn.7 Insn.8 80-loops ALUALU I-Cache ALU ALU D-Cache Registers I-Cache ALU ALU D-Cache Regs. Regs. D-Cache Insn.1 Insn.2 Insn.3 Insn.4 Insn.5 Insn.6 Insn.7 Insn.8 All instructions are executed. I-Cache ALU ALU D-Cache Registers 3 Vect.Insn.1 Vect.Insn.2 Vect.Insn.3 Vect.Insn.4 Vect.Insn.5 Vect.Insn.6 Vect.Insn.7 Vect.Insn.8 Vector Registers Register File 20210401 3 ノイマン型(ぬるま湯)を捨て、非ノイマン型土俵で頭を使えということ "GoogleのTPUにも使われたシストリックアレイアー キテクチャとDeep Learningについて", 富士通研究 所技術講演会, Jul. (2017) "プログラマビリティを維持できる限界に向けて”, SONY本社研究紹介, Mar. (2020) "Deep Learningに向けたApproximate Computingと シストリックアレイアーキテクチャ", 革新的コン ピューティングの研究開発戦略検討会, CRDS/JST, Jul. (2017) "Approximate Computingとシストリックアレイ", ジス クソフト技術講演会, Dec. (2017) "99%メモリなアクセラレータIMAX(In Memory Accelerator eXtension)", CAE計算環境研究会@関 西シスラボ 第8回シンポジウム, Mar. (2017) "Systolic Arrays as The Last Frontiers", Invited talk in IPB Seminar and UI seminar @ Indonesia, Jan. (2019) “IMAX2: A CGRA with FPU+Multithreading+Chiplet", Panel: CGRA and their Opportunities as Application Accelerators, ASAP2021, invited panel, Jul. (2021) “コンピュータ(データセンタ)の消費電力低減策 意見交換会”, LCS/JST, Jul. (2021) "非ノイマン型の世界 -CGRAを含む最近の研究紹 介-", JEITAデバイス技術分科会招待講演, Nov. (2021) "CGRAのJITコンパイル化と高機能化の魔法教え ます", 回路とシステムワークショップ招待講演, Aug. (2022)
  4. 4. Insn.1 Insn.2 Insn.3 Insn.4 Insn.5 Insn.6 Insn.7 Insn.8 Insn.1 Insn.2 Insn.3 Insn.4 Insn.5 Insn.6 Insn.7 Insn.8 Insn.1 Insn.2 Insn.3 Insn.4 Insn.5 Insn.6 Insn.7 Insn.8 Insn.1 Insn.2 Insn.3 Insn.4 Insn.5 Insn.6 Insn.7 Insn.8 Insn.1 Insn.2 Insn.3 Insn.4 Insn.5 Insn.6 Insn.7 Insn.8 Insn.1 Insn.2 Insn.3 Insn.4 Insn.5 Insn.6 Insn.7 Insn.8 for { iter=0 iter=1 iter=2 iter=3 iter=4 iter=5 iter=6 iter=7 } Insn.1 Insn.2 Insn.3 Insn.4 Insn.5 Insn.6 Insn.7 Insn.8 Insn.1 Insn.2 Insn.3 Insn.4 Insn.5 Insn.6 Insn.7 Insn.8 Super Scalar, VLIW I-Cache ALU ALU D-Cache Registers EAG EAG 20210401 4
  5. 5. for { iter=0 iter=1 iter=2 iter=3 iter=4 iter=5 iter=6 iter=7 } Insn.3 Insn.4 Insn.5 Insn.6 Insn.7 Insn.8 Insn.3 Insn.4 Insn.5 Insn.6 Insn.7 Insn.8 Insn.3 Insn.4 Insn.5 Insn.6 Insn.7 Insn.8 Insn.3 Insn.4 Insn.5 Insn.6 Insn.7 Insn.8 Insn.3 Insn.4 Insn.5 Insn.6 Insn.7 Insn.8 Insn.3 Insn.4 Insn.5 Insn.6 Insn.7 Insn.8 Insn.3 Insn.4 Insn.5 Insn.6 Insn.7 Insn.8 Insn.3 Insn.4 Insn.5 Insn.6 Insn.7 Insn.8 VECTOR Insn.1 Insn.1 Insn.1 Insn.1 Insn.1 Insn.1 Insn.1 Insn.1 I-Cache ALU ALU D-Cache / Main Memory Registers EAG V-insn.1 ALU ALU ALU ALU ALU ALU V-insn.2 Insn.2 Insn.2 Insn.2 Insn.2 Insn.2 Insn.2 Insn.2 Insn.2 20210401 5
  6. 6. for { iter=0 iter=1 iter=2 iter=3 iter=4 iter=5 iter=6 iter=7 } CGRA Insn.1 Insn.2 Insn.3 Insn.4 Insn.5 Insn.6 Insn.7 Insn.8 Insn.1 Insn.2 Insn.3 Insn.4 Insn.5 Insn.6 Insn.7 Insn.8 Insn.1 Insn.2 Insn.3 Insn.4 Insn.5 Insn.6 Insn.7 Insn.8 Insn.1 Insn.2 Insn.3 Insn.4 Insn.5 Insn.6 Insn.7 Insn.8 Insn.1 Insn.2 Insn.3 Insn.4 Insn.5 Insn.6 Insn.7 Insn.8 Insn.1 Insn.2 Insn.3 Insn.4 Insn.5 Insn.6 Insn.7 Insn.8 Insn.1 Insn.2 Insn.3 Insn.4 Insn.5 Insn.6 Insn.7 Insn.8 Insn.1 Insn.2 Insn.3 Insn.4 Insn.5 Insn.6 Insn.7 Insn.8 Local Memory Registers EAG ALU ALU Local Memory Registers EAG ALU ALU Local Memory Registers EAG ALU ALU Local Memory Registers EAG ALU ALU Insn.1 Insn.2 Insn.3 Insn.4 Insn.1 Insn.2 Insn.1 Insn.2 Insn.5 Insn.6 Insn.3 Insn.4 Insn.1 Insn.2 Insn.3 Insn.4 Insn.1 Insn.2 Insn.1 Insn.2 Insn.7 Insn.8 Insn.5 Insn.6 Insn.3 Insn.4 Insn.1 Insn.2 Insn.5 Insn.6 Insn.3 Insn.4 Insn.1 Insn.2 Insn.3 Insn.4 Insn.1 Insn.2 Insn.1 Insn.2 20210401 6
  7. 7. 7 Scalar, SIMD and CGRA 20210401 time Scalar (VL=32) I1 L2 VST L2 VLD VLD VFMA I1 L2 VST L2 VLD VLD VFMA I1 L2 VST L2 VLD VLD VFMA I1 L2 VST L2 VLD VLD VFMA MM Vector1 (VL=256) Vector2 (VL=2048) CGRA (VL=16K) LD LM MM LD LM FMA LM ST LD LM LD LM FMA LM ST LD LM MM LD LM FMA LM ST LD LM LD LM FMA LM ST LD LM MM LD LM FMA LM ST LD LM LD LM FMA LM ST LD LM MM LD LM FMA LM ST LD LM LD LM FMA LM ST LD LD FMA ST D1 D1 D1 I1 I1 I1 L2 L2 LD LD FMA ST D1 D1 D1 I1 I1 I1 L2 L2 LD LD FMA ST D1 D1 D1 I1 I1 I1 L2 L2 LD LD FMA ST D1 D1 D1 I1 I1 I1 L2 L2 LD LD FMA ST D1 D1 D1 I1 I1 I1 L2 L2 LD LD FMA ST D1 D1 D1 I1 I1 I1 L2 L2 LD LD FMA ST D1 D1 D1 I1 I1 I1 L2 L2 LD LD FMA ST D1 D1 D1 I1 I1 I1 L2 L2 MM I1 I1 I1 I1 VST VST VST VST VFMA VFMA VFMA VFMA VLD VLD VLD VLD VLD VLD VLD VLD MM
  8. 8. 1988 VPP 4way VLIW+8elem. Vector My CGRAs began from VLIW+Vector processor F D W C D M M M M M M M M D D M M M M Load pipe Store pipe FPU pipe F D F D Cache lines are shared among heterogeneous multithreads. M M M M M M M M D W M M M M M M M M M M M M M M M M E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E C E E E E M M M M B B B B B B B B B B Vector Length ≤ 2048 dwords ($miss) F D D 2008 LAPP 8way VLIW+32stage Array C2 E E E LD M M M M C1 E E E LD C0 E E E E B B B B B C3 E E E E HW Mapper (8stages) HW Mapper (binary compatible) Vector Length ≤ 1024 words E E E E E E E ST E E E LD E E E LD E E E E E E E ST 2006 OROCHI 9way VLIW+5way SS 20210401 8 Data from all cache ways are passed through array. Location free LD/ST can keep binary compatibility.
  9. 9. ただし、ノイマン型に学ばない非ノイマン型には、汎用性も未来もない 20210401 9 例えば、FPGAを真似ただけのCGRAは、コンパイルに1時間 これをコンピュータと呼ぶのは無理がある プログラムやデータの変換に長時間がかかる 新原理非ノイマン型に存在価値はない
  10. 10. Start of IMAX 20210401 10 CPUのレジスタファイルに該当 (32bit x 2waySIMD = 64bit幅) CPUの条件判定器、 浮動小数点パイプライン演算器、 (32bit x 2wayFMA = 64bit幅) SAD等メディア演算、 32要素確率的積和演算、 SHA256用ハッシュ計算、 アドレス生成器に該当 CPUのローカルメモリに該当 (64KB) CPUのレジスタファイルに該当 ノイマン型に学ばない非ノ イマン型には、汎用性も未 来もない。 CPUから始めることで、類 似の汎用性を自然に獲得。
  11. 11. 4列⇒1列に重畳 20210401 11 4列分のダブルバッファ・ レジスタファイル 4列分をマルチスレッド実行 メモリ空間を最大4分割 (64KB, 32KB, 16KB, 混在) 4列分のダブルバッファ・ レジスタファイル 大部分のCGRAは、浮動小 数点演算器を搭載しない。 浮動小数点累算が、CGRA のパイプライン動作を止め てしまうから。 そこで、マルチスレッディン グの知恵を借りた。 あとで、汎用性向上に役立 つことになる。
  12. 12. Slave型外部IF 20210401 12 演算しながら、次データを 4列分の空間へ自律的受信 256bit/cycle 演算しながら、 HOSTの読み出しDMAに対し、 自律的に読み出し合流 256bit/cycle 次のUNITへ 豪華な外部メモリIFは、大 電力消費の主犯。 貧弱なメモリIFでも高性能 を出せるように頭を使う。 Slave型かつ自律アドレス フィルタにより、ブロード キャストやギャザを自然に 実現。 データ入れ替えはコンパイ ラが判断し最適化。
  13. 13. 20210401 13 Folding機能 CPUの通常データパスに該当
  14. 14. 20210401 14 Dual port導入 8ワードロードx4、2ワードロードx8、 2ワードロードx4⇒演算x4⇒ストアx4 を収容 メモリ空間は最大4分割 ダブルバッファとしても利用
  15. 15. 20210401 15 伝搬レジスタ 物理4本、論理16本の UNIT間バイパスによる データ伝搬
  16. 16. 20210401 16 アドレス同調機構 疎行列の圧縮、 圧縮済疎行列どうしの行列積、 マージソートに対応
  17. 17. ノイマン型に学んだ論理UNITを並べていく 20210401 17 F F A A F F A A F F M M C C M M R R R R R
  18. 18. 論理UNITを4つ並べる、最後には、これが1基の物理UNITになる 20210401 18 R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R
  19. 19. さらに縦に並べて全体のデータ流は上から下へ 20210401 19 F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R
  20. 20. さらにマルチチップ拡張として、横に増やす 20210401 20 F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R
  21. 21. ここで、論理4UNITを物理1UNITに重畳 20210401 21 F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R
  22. 22. 演算位置とローカルメモリ位置の同調制御のため、リング構造化 20210401 22 F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R F F A A F F A A F F M M C C M M R R R R
  23. 23. A B C D E A B C D E A B C D E 物理64UNITx4を基本構造としてプログラム(最大2560オペレーション) 64bit ARM AXIIF 2560op x 4 64KB x 64 x 4 20210401 23
  24. 24. HOST 20210401 24 演算ネットワークとメモリネットワーク 演算器はリング構造 メモリネットワークは8並列
  25. 25. 20210401 25 外部メモリとも協調させ、途切れないデータフローを作る C O N F R E G s A D D R Overlapping post-drain, burst-exec, pre-fetch L M M L M M L M M Burst exec. R E G s A D D R L M M L M M L M M Burst exec. C O N F A D D R R E G s Sequential execution L M M L M M L M M Burst exec. A D D R R E G s L M M time L M M L M M Burst exec. PIO/DMA External Memory PIO/DMA External Memory R E G s A D D R L M M L M M L M M Burst exec.
  26. 26. 26 ・中島康彦, 木村睦, 張任遠: "制御装置(スパイクメモリ構成方法)", 特願2021- 27859 (2021. 2. 24) ・トランティホン, 中島康彦: "処理要素、その制御方法および制御プログラム、並びに処理装置(BC)", 特願2021-009164 (2021. 1. 22) ・中島康彦, 高前田伸也: "データ処理装置(メモリ内蔵アクセラレータの構成方法)", 中国ZL201680019602 (2020. 12. 11) ・中島康彦: "データ処理装置(高効率アクセラレータ構成方法)", PCT/JP2020/025123 (2020. 6. 26) ・中島康彦, 木村睦, 張任遠: "データ処理装置(メムキャパシタ構成方法)", 特願2020-91392 (2020. 5. 26) ・中島康彦: "データ処理装置(高効率アクセラレータ構成方法)", 特願2019-517698 (2019. 9. 19) ・Yasuhiko Nakashima, Shinya Takamaeda: "Data processing Device", United States Patent 10,275,392 (2019.4.30) ・中島康彦: "データ処理装置(NCHIP制御方法)", 特願2019-121853 (2019. 6. 28) ・Yasuhiko Nakashima, Takashi Nakada: "Data processing Device for Performing a Plurality of Calculation Processes in Parallel", European Patent Application No.09820420.9 (H31. 1. 18) ・中島康彦: "データ処理装置(高効率アクセラレータ構成方法)", PCT/JP2018/018169 (H30. 5. 10) ・中島康彦: "データ処理装置(高効率アクセラレータ構成方法)", 特願2017-96061 (H29. 5. 12) ・Jun Yao, Yasuhiko Nakashima, Tao Wang, Wei Zhang, Zuqi Liu, Shuzhan Bi: "METHOD FOR ACCESSING MEMORY OF MULTI-CORE SYSTEM, RELATED APPARATUS, SYSTEM, AND STORAGE MEDIUM", PCT/CN2017/083523 (2017. 5. 8) ・中島康彦, 高前田伸也: "データ処理装置(メモリ内蔵アクセラレータの構成方法)", PCT/JP2016/061302 (H28. 4. 6) ・中島康彦, 高前田伸也: "データ処理装置(メモリ内蔵アクセラレータの構成方法)", 特願2015-079552 (H27. 4. 8) ・中島康彦: "エミュレーション方式", 特願2013-055660 (H25. 3. 18) ・中島康彦, 姚駿: "データ供給装置及びデータ処理装置", PCT/JP2013/057503 (H25. 3. 15) ・中島康彦, 姚駿: "データ供給装置及びデータ処理装置", 特願2012-061110 (H24. 3. 16) 20210401 26 28nmLSI : 200x performance/area compared with GPGPU 現有最大規模のプロトタイプは10240オペレーション
  27. 27. 20210401 27 各種GPUとの比較 Kernel CPU ARMv8 1.2GHz GPU 256core JetsonTX2 1.3GHz DDR4 480Gbps 16nm 43.6mm² CGRA 64core*4 IMAX2 140MHz DDR4 40Gbps [28nm想定 14.6mm² *4] 8nm想定 1.2mm² *4 GPU 3584core GTX1080Ti 1.5GHz GDDR5 3872Gbps 16nm 471mm² GPU 10496core RTX3090 1.4GHz GDDR6X 7490Gbps 8nm 628mm² DDR bandwidth 12 1 97 187 Power 7.5W ARM 0.6W + [31W] 2.7W 250W 350W MM 3160msec 170 16 [3msec] [EDP=284] EDP=30 12 EDP=36K 1.2 EDP=504 CNN 2080msec 280 EDP=588K 23 [4msec] [EDP=505] EDP=53 18 EDP=81K 2.9 EDP=2943 Lightfield 14500msec 1190 EDP=10.6M 754 [126msec] [EDP=501K] EDP=52K 43 EDP=462K 35 EDP=428K Sparse MM 32002 - - 333+469 [134ms] [EDP=567K] EDP=59K Cusparse使用 2044 EDP=1045M Cusparse使用 280 EDP=27.4M Sparse MM 40002 - - 2378+734 [519ms] [EDP=8.51M] EDP=889K Cusparse使用 3492 EDP=3049M Cusparse使用 350 EDP=43.1M
  28. 28. Top-down approach 20210401 28 HBM2 HOST HOST I/O I/O FFT CONV MM SORT SpMM
  29. 29. Multilevel pipelining 20210401 29 HBM2
  30. 30. 20210401 30 レイアウトはこんな感じ CGRA 64core*4 IMAX2 140MHz DDR4 40Gbps 8nm想定 1.2mm² *4 GPU 10496core RTX3090 1.4GHz GDDR6X 7490Gbps 8nm 628mm² 75%がDP-SRAM https://thinkcomputers.org/renowned-ir-photographer-fritzchens-fritz- shares-die-shots-of-nvidia-3000-series-ga-102-silicon/ DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAMLogic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic DP SRAM Logic External interface DP SRAM
  31. 31. IMAX (64units) x 120 modules = 307200 operations / 4 cycles 20210401 31 HBM2 HOST HOST IMAX (1.2mm2/8nm) x 120 modules ≃ 144mm2 ?
  32. 32. /* SCREEN=WD*HT */ for (row=0; row<HT; row++) { for (col=0; col<WD; col++) { pix = in[row*WD+col]; r = t[ pix>>24 ]; g = t[256+((pix>>16)&255)]; b = t[512+((pix>> 8)&255)]; out[row*WD+col]=r<<24 | g<<16 | b<<8; } } 20210401 32 簡単な tone_curveをC言語で書く Load → Store ← Color map tables
  33. 33. int loop=WD/2; //EMAX5A begin tone_curve mapdist=0 while (loop--) { mop(OP_LDR, &BR[0][1][1], in++, 0LL, MSK_D0, in, WD, 0, 0, NULL, 0); mop(OP_LDBR, &BR[1][1][1], t1, BR[0][1][1], MSK_B3, t, 256*3/4, 0, 0, NULL, 0); mop(OP_LDBR, &BR[1][1][0], t1, BR[0][1][1], MSK_B7, t, 256*3/4, 0, 0, NULL, 0); mop(OP_LDBR, &BR[1][2][1], t2, BR[0][1][1], MSK_B2, t, 256*3/4, 0, 0, NULL, 0); mop(OP_LDBR, &BR[1][2][0], t2, BR[0][1][1], MSK_B6, t, 256*3/4, 0, 0, NULL, 0); mop(OP_LDBR, &BR[1][3][1], t3, BR[0][1][1], MSK_B1, t, 256*3/4, 0, 0, NULL, 0); mop(OP_LDBR, &BR[1][3][0], t3, BR[0][1][1], MSK_B5, t, 256*3/4, 0, 0, NULL, 0); exe(OP_CCAT, &r1, BR[1][1][0], EXP_H3210, BR[1][1][1], EXP_H3210, 0, EXP_H3210,OP_NOP,0,OP_NOP,0); exe(OP_CCAT, &r2, BR[1][2][0], EXP_H3210, BR[1][2][1], EXP_H3210, 0, EXP_H3210,OP_NOP,0,OP_NOP,0); exe(OP_CCAT, &r3, BR[1][3][0], EXP_H3210, BR[1][3][1], EXP_H3210, 0, EXP_H3210,OP_NOP,0,OP_NOP,0); exe(OP_MMRG, &r0, r1, EXP_H3210, r2, EXP_H3210, r3, EXP_H3210,OP_NOP,0,OP_NOP,0); mop(OP_STR, &r0, out++, 0LL, MSK_D0, out, WD, 0, 0, NULL, 0); } //EMAX5A end 20210401 33 2way SIMD版 SIMD Load → SIMD Store ← Color map tables
  34. 34. 20210401 34 2way SIMD版 CCATが増えた ロード数が3から6に増えた
  35. 35. Input pixels Load Sort Select center Output 4bytes 4bytes 20210401 35 メディアンフィルタを超高速実行する
  36. 36. 20210401 36 コンパイル結果 ① ⑮ ④ ② ③ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑯ LM LM LM LM PREFETCH LM LM DRAIN
  37. 37. 20210401 37 メディアンフィルタよりも簡単なアンシャープマスク for (row=0; row<HT; row++) { //EMAX5A begin unsharp mapdist=1 for (CHIP=0; CHIP<NCHIP; CHIP++) { /* output channels are parallelized by multi-chip (OC/#chip) */ for (INIT0=1,LOOP0=WD,col=0-4LL; LOOP0--; INIT0=0) { exe(OP_ADD, &col, col, EXP_H3210, 4LL, EXP_H3210, 0, EXP_H3210, OP_AND, 0x00000ffffffffLL, OP_NOP,0); exe(OP_ADD, &in_center, row_center, EXP_H3210, col, EXP_H3210, 0, EXP_H3210, OP_NOP, 0, OP_NOP, 0); mop(OP_LDWR, &r1, in_center, -1276, MSK_D0, row_prev, WD, NULL, 0); mop(OP_LDWR, &r2, in_center, -1284, MSK_D0, row_prev, WD, NULL, 0); mop(OP_LDWR, &r5, in_center, -1280, MSK_D0, row_prev, WD, NULL, 0); exe(OP_MAUH, &r11, r1, EXP_B5410, r2, EXP_B5410, 0, EXP_H3210, OP_NOP, 0, OP_NOP, 0); exe(OP_MAUH, &r12, r1, EXP_B7632, r2, EXP_B7632, 0, EXP_H3210, OP_NOP, 0, OP_NOP, 0); mop(OP_LDWR, &r6, in_center, 4, MSK_D0, row_center, WD, NULL, 0); mop(OP_LDWR, &r7, in_center, -4, MSK_D0, row_center, WD, NULL, 0); mop(OP_LDWR, &r0, in_center, 0, MSK_D0, row_center, WD, NULL, 0); exe(OP_MLUH, &r20, r0, EXP_B5410, 239, EXP_H3210, 0, EXP_H3210, OP_NOP, 0, OP_NOP, 0); exe(OP_MLUH, &r21, r0, EXP_B7632, 239, EXP_H3210, 0, EXP_H3210, OP_NOP, 0, OP_NOP, 0); mop(OP_LDWR, &r3, in_center, 1284, MSK_D0, row_next, WD, row_next_next, WD); mop(OP_LDWR, &r4, in_center, 1276, MSK_D0, row_next, WD, row_next_next, WD); mop(OP_LDWR, &r8, in_center, 1280 , MSK_D0, row_next, WD, row_next_next, WD); exe(OP_MAUH, &r15, r5, EXP_B5410, r6, EXP_B5410, 0, EXP_H3210, OP_NOP, 0, OP_NOP, 0); exe(OP_MAUH, &r16, r5, EXP_B7632, r6, EXP_B7632, 0, EXP_H3210, OP_NOP, 0, OP_NOP, 0); exe(OP_MAUH3, &r11, r3, EXP_B5410, r4, EXP_B5410, r11, EXP_H3210, OP_NOP, 0, OP_NOP, 0); exe(OP_MAUH3, &r12, r3, EXP_B7632, r4, EXP_B7632, r12, EXP_H3210, OP_NOP, 0, OP_NOP, 0); exe(OP_MLUH, &r13, r11, EXP_H3210, 13, EXP_H3210, 0, EXP_H3210, OP_NOP, 0, OP_NOP, 0); exe(OP_MLUH, &r14, r12, EXP_H3210, 13, EXP_H3210, 0, EXP_H3210, OP_NOP, 0, OP_NOP, 0); exe(OP_MAUH3, &r15, r7, EXP_B5410, r8, EXP_B5410, r15, EXP_H3210, OP_NOP, 0, OP_NOP, 0); exe(OP_MAUH3, &r16, r7, EXP_B7632, r8, EXP_B7632, r16, EXP_H3210, OP_NOP, 0, OP_NOP, 0); exe(OP_NOP, &r7, r15, EXP_H3210, 0LL, EXP_H3210, 0, EXP_H3210, OP_OR, 0, OP_SRLM, 2); exe(OP_MLUH, &r17, r15, EXP_H3210, 15, EXP_H3210, 0, EXP_H3210, OP_NOP, 0, OP_NOP, 0); exe(OP_NOP, &r8, r16, EXP_H3210, 0LL, EXP_H3210, 0, EXP_H3210, OP_OR, 0, OP_SRLM, 2); exe(OP_MLUH, &r18, r16, EXP_H3210, 15, EXP_H3210, 0, EXP_H3210, OP_NOP, 0, OP_NOP, 0); exe(OP_MSUH3, &r10, r20, EXP_H3210, r7, EXP_H3210, r17, EXP_H3210, OP_NOP, 0, OP_NOP, 0); exe(OP_MSUH3, &r11, r21, EXP_H3210, r8, EXP_H3210, r18, EXP_H3210, OP_NOP, 0, OP_NOP, 0); exe(OP_MSUH, &r20, r10, EXP_H3210, r13, EXP_H3210, 0, EXP_H3210, OP_OR, 0, OP_SRLM, 7); exe(OP_MSUH, &r21, r11, EXP_H3210, r14, EXP_H3210, 0, EXP_H3210, OP_OR, 0, OP_SRLM, 7); exe(OP_MH2BW, &r31, r21, EXP_H3210, r20, EXP_H3210, 0, EXP_H3210, OP_NOP, 0, OP_NOP, 0); mop(OP_STWR, &r31, out_center, col, MSK_D0, out_center, WD, row_prev, WD); } } //EMAX5A end } r1 r5 r2 r7 r0 r6 r4 r8 r3
  38. 38. 20210401 38 フレーム補間
  39. 39. 20210401 39 超解像 for (Y=0; Y<768; Y++) { k = Y*240/768; kfraq = (((Y*240)<<4)/768)&15; for (X=0; X<1024; X++) { l = X*320/1024; lfraq = (((X*320)<<4)/1024)&15;/ out[Y][X] = ((in[k ][l ]>>24&0xff)*r1 + (in[k ][l-1]>>24&0xff)*r2 + (in[k ][l+1]>>24&0xff)*r3 + (in[k-1][l ]>>24&0xff)*r4 + (in[k+1][l ]>>24&0xff)*r5 + (in[k-1][l-1]>>24&0xff)*r6 + (in[k-1][l+1]>>24&0xff)*r7 + (in[k+1][l-1]>>24&0xff)*r8 + (in[k+1][l+1]>>24&0xff)*r9)/256<<24 | ((in[k ][l ]>>16&0xff)*r1 + (in[k ][l-1]>>16&0xff)*r2 + (in[k ][l+1]>>16&0xff)*r3 + (in[k-1][l ]>>16&0xff)*r4 + (in[k+1][l ]>>16&0xff)*r5 + (in[k-1][l-1]>>16&0xff)*r6 + (in[k-1][l+1]>>16&0xff)*r7 + (in[k+1][l-1]>>16&0xff)*r8 + (in[k+1][l+1]>>16&0xff)*r9)/256<<16 | ((in[k ][l ]>> 8&0xff)*r1 + (in[k ][l-1]>> 8&0xff)*r2 + (in[k ][l+1]>> 8&0xff)*r3 + (in[k-1][l ]>> 8&0xff)*r4 + (in[k+1][l ]>> 8&0xff)*r5 + (in[k-1][l-1]>> 8&0xff)*r6 + (in[k-1][l+1]>> 8&0xff)*r7 + (in[k+1][l-1]>> 8&0xff)*r8 + (in[k+1][l+1]>> 8&0xff)*r9)/256<<8; } } K-1 K = Y*240/768 L-1 L = X*320/1024 (X,Y) 1024x768の1画素 (L,K) 320x240画像 kfraq = (((Y*240)<<4)/ 768)&15;/* 4bit */ lfraq = (((X*320)<<4)/1024)&15;/* 4bit */ Y=1 kfraq= 5/16 Y=2 kfraq=10/16 Y=3 kfraq=15/16 Y=4 kfraq= 4/16 Y=5 kfraq= 9/16 X=1 lfraq= 5/16 X=2 lfraq=10/16 X=3 lfraq=15/16 X=4 lfraq= 4/16 X=5 lfraq= 9/16
  40. 40. 20210401 40 ステレオマッチング for (row=8; row<240-8; row++) { for (Y=-8; Y<8; Y++) { for (col=8; col<320-8; col++) { for (X=-8; X<8; X++) SAD2[row][col] += sad(L[row+Y][col+X+視差], R[row+Y][col+X]); } } }
  41. 41. for (row=-8; row<240-8; row++) { //EMAX5A begin wdifline mapdist=0 for (CHIP=0; CHIP<NCHIP; CHIP++) { for (INIT0=1,LOOP0=320,col=0-4LL; LOOP0--; INIT0=0) { exe(OP_ADD, &col, col, EXP_H3210, 4LL, EXP_H3210, 0, EXP_H3210, OP_AND, 0x00000000ffffffffLL, OP_NOP, 0); exe(OP_ADD, &rofs1, L, EXP_H3210, col, EXP_H3210, 0, EXP_H3210, OP_NOP, 0, OP_NOP, 0); exe(OP_ADD, &rofs2, R, EXP_H3210, col, EXP_H3210, 0, EXP_H3210, OP_NOP, 0, OP_NOP, 0); mop(OP_LDWR, &r2, rofs1, 0, MSK_D0, L, 320, 0, 0, NULL, 320); mop(OP_LDWR, &r3, rofs1, 4, MSK_D0, L, 320, 0, 0, NULL, 320); mop(OP_LDWR, &r4, rofs1, 8, MSK_D0, L, 320, 0, 0, NULL, 320); mop(OP_LDWR, &r5, rofs1, 12, MSK_D0, L, 320, 0, 0, NULL, 320); mop(OP_LDWR, &r6, rofs2, 0, MSK_D0, R, 320, 0, 0, NULL, 320); mop(OP_LDWR, &r7, rofs2, 4, MSK_D0, R, 320, 0, 0, NULL, 320); mop(OP_LDWR, &r8, rofs2, 8, MSK_D0, R, 320, 0, 0, NULL, 320); mop(OP_LDWR, &r9, rofs2, 12, MSK_D0, R, 320, 0, 0, NULL, 320); exe(OP_MSAD, &r22, r2, EXP_H3210, r6, EXP_H3210, 0, EXP_H3210, OP_NOP, 0, OP_NOP, 0); mop(OP_LDWR, &r12, rofs1, 16, MSK_D0, L, 320, 0, 0, NULL, 320); mop(OP_LDWR, &r13, rofs1, 20, MSK_D0, L, 320, 0, 0, NULL, 320); exe(OP_MSAD, &r23, r3, EXP_H3210, r7, EXP_H3210, 0, EXP_H3210, OP_NOP, 0, OP_NOP, 0); mop(OP_LDWR, &r14, rofs1, 24, MSK_D0, L, 320, 0, 0, NULL, 320); mop(OP_LDWR, &r15, rofs1, 28, MSK_D0, L, 320, 0, 0, NULL, 320); exe(OP_MSAD, &r24, r4, EXP_H3210, r8, EXP_H3210, 0, EXP_H3210, OP_NOP, 0, OP_NOP, 0); mop(OP_LDWR, &r16, rofs2, 16, MSK_D0, R, 320, 0, 0, NULL, 320); mop(OP_LDWR, &r17, rofs2, 20, MSK_D0, R, 320, 0, 0, NULL, 320); exe(OP_MSAD, &r25, r5, EXP_H3210, r9, EXP_H3210, 0, EXP_H3210, OP_NOP, 0, OP_NOP, 0); mop(OP_LDWR, &r18, rofs2, 24, MSK_D0, R, 320, 0, 0, NULL, 320); mop(OP_LDWR, &r19, rofs2, 28, MSK_D0, R, 320, 0, 0, NULL, 320); exe(OP_MSSAD, &r12, r22, EXP_H3210, r12, EXP_H3210, r16, EXP_H3210, OP_NOP, 0, OP_NOP, 0); mop(OP_LDWR, &r2, rofs1, 32, MSK_D0, L, 320, 0, 0, NULL, 320); mop(OP_LDWR, &r3, rofs1, 36, MSK_D0, L, 320, 0, 0, NULL, 320); exe(OP_MSSAD, &r13, r23, EXP_H3210, r13, EXP_H3210, r17, EXP_H3210, OP_NOP, 0, OP_NOP, 0); mop(OP_LDWR, &r4, rofs1, 40, MSK_D0, L, 320, 0, 0, NULL, 320); mop(OP_LDWR, &r5, rofs1, 44, MSK_D0, L, 320, 0, 0, NULL, 320); exe(OP_MSSAD, &r14, r24, EXP_H3210, r14, EXP_H3210, r18, EXP_H3210, OP_NOP, 0, OP_NOP, 0); mop(OP_LDWR, &r6, rofs2, 32, MSK_D0, R, 320, 0, 0, NULL, 320); mop(OP_LDWR, &r7, rofs2, 36, MSK_D0, R, 320, 0, 0, NULL, 320); exe(OP_MSSAD, &r15, r25, EXP_H3210, r15, EXP_H3210, r19, EXP_H3210, OP_NOP, 0, OP_NOP, 0); mop(OP_LDWR, &r8, rofs2, 40, MSK_D0, R, 320, 0, 0, NULL, 320); mop(OP_LDWR, &r9, rofs2, 44, MSK_D0, R, 320, 0, 0, NULL, 320); exe(OP_MSSAD, &r22, r12, EXP_H3210, r2, EXP_H3210, r6, EXP_H3210, OP_NOP, 0, OP_NOP, 0); exe(OP_MSSAD, &r23, r13, EXP_H3210, r3, EXP_H3210, r7, EXP_H3210, OP_NOP, 0, OP_NOP, 0); exe(OP_MSSAD, &r24, r14, EXP_H3210, r4, EXP_H3210, r8, EXP_H3210, OP_NOP, 0, OP_NOP, 0); exe(OP_MSSAD, &r25, r15, EXP_H3210, r5, EXP_H3210, r9, EXP_H3210, OP_NOP, 0, OP_NOP, 0); exe(OP_MAUH3, &r31, r22, EXP_H3210, r23, EXP_H3210, r24, EXP_H3210, OP_NOP, 0, OP_NOP, 0); exe(OP_MAUH3, &r1, r31, EXP_H3210, r25, EXP_H3210, 0, EXP_H3210, OP_SUMHL,0, OP_NOP, 0); mop(OP_LDWR, &BR[8][0][1], sad2, col, MSK_D0, sad2, 320, 0, 1, NULL, 320); exe(OP_ADD, &AR[8][0], BR[8][0][1], EXP_H3210, r1, EXP_H3210, 0, EXP_H3210, OP_NOP, 0, OP_NOP, 0); mop(OP_STWR, &AR[8][0], col, sad2, MSK_D0, sad2, 320, 0, 1, NULL, 320); :のこり15か所のSADにも加算 } } //EMAX5A end } //EMAX5A drain_dirty_lmm 20210401 41 ステレオマッチング
  42. 42. 20210401 42 機械学習=トレーニング+インファレンス
  43. 43. 0.0 0.1 0.2 1.0 1.1 1.2 2.0 2.1 2.2 0.3 … 0.27 1.3 … 1.27 2.3 … 2.27 : : : : : : 27.0 27.1 27.2 : … : : : 27.3 … 27:27 … … … … : … : : : : 4.5 4.27 4.4 0.2 1.0 1.1 1.2 2.0 2.1 2.2 0.3 … 0.27 1.3 … 1.27 2.3 … 2.27 : : : : … … … … … 0.0 0.1 0.2 1.0 1.1 1.2 2.0 2.1 2.2 0.3 … 0.27 1.3 … 1.27 2.3 … 2.27 : : : : … … … … … 0.0 0.1 0.2 1.0 1.1 1.2 2.0 2.1 2.2 0.3 … 0.27 1.3 … 1.27 2.3 … 2.27 : : : : … … … … … -1 -1 1 -1 1 1 1 -1 -1 … 1 -1 … 1 1 … 1 : : : : … … … … … 1 -1 1 -1 1 1 1 -1 -1 … 1 -1 … 1 1 … 1 : : : : … … … … … 1 -1 -1 1 -1 1 1 1 -1 -1 … -1 … 1 1 … 1 : : : : … … … … … 0.0 0.1 -1 1 OCH#0 OCH#1 OCH#2 OCH#0 OCH#1 OCH#2 OCH#0 OCH#1 OCH#2 0.0 0.1 0.2 1.0 1.1 1.2 0.25 1.25 : : : … … … 0.0 0.1 0.2 1.0 1.1 1.2 0.25 1.25 : : : … … … 0.0 0.1 0.2 1.0 1.1 1.2 0.25 1.25 : : : … … … 0.0 0.1 0.2 1.0 1.1 1.2 0.25 1.25 : : : … … … 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1 -1 -1 -1 1 0.0 0.1 0.2 1.0 1.1 1.2 2.0 2.1 2.2 0.3 … 0.27 1.3 … 1.27 2.3 … 2.27 : : : : : : 27.0 27.1 27.2 : … : : : 27.3 … 27:27 … … … … : … : : : : 4.5 4.27 4.4 0.0 0.1 0.2 1.0 1.1 1.2 2.0 2.1 2.2 0.3 … 0.27 1.3 … 1.27 2.3 … 2.27 : : : : : : 27.0 27.1 27.2 : … : : : 27.3 … 27:27 … … … … : … : : : : 4.5 4.27 4.4 0.0 0.1 0.2 1.0 1.1 1.2 2.0 2.1 2.2 0.3 … 0.27 1.3 … 1.27 2.3 … 2.27 : : : : : : 27.0 27.1 27.2 : … : : : 27.3 … 27:27 … … … … : … : : : : 4.5 4.27 4.4 ICH#0 ICH#0 ICH#1 ICH#2 ICH#3 ICH#0 ICH#1 ICH#2 ICH#3 OCH#0 OCH#1 1 1 FMUL FMA ICH#1 ICH#5 54 units Kernel bcast ICH#0 bcast ICH#1 bcast Drain 4 columns 20210401 43 IMAXの畳み込み演算
  44. 44. #define sgemm00_core1(r, rm1, rp1) mop(OP_LDR, 3, &BR[r][0][1], b0[rm1], cofs, MSK_W1, b[rm1], M2/2, 0, 0, NULL, M2/2); mop(OP_LDR, 3, &BR[r][0][0], b1[rm1], cofs, MSK_W1, b[rm1], M2/2, 0, 0, NULL, M2/2); mop(OP_LDR, 3, &BR[r][1][1], b2[rm1], cofs, MSK_W1, b[rm1], M2/2, 0, 0, NULL, M2/2); mop(OP_LDR, 3, &BR[r][1][0], b3[rm1], cofs, MSK_W1, b[rm1], M2/2, 0, 0, NULL, M2/2); mop(OP_LDUWR,1, &BR[r][2][1], a[rm1][CHIP], rofs, MSK_W1, a0[CHIP], L*RMGRP/2, 0, 0, NULL, L*RMGRP/2); exe (OP_FMA, &AR[rp1][0], AR[r][0], EXP_H3210, BR[r][2][1], EXP_H3210, BR[r][0][1], EXP_H3210, OP_NOP, 0LL, OP_NOP, 0LL); exe (OP_FMA, &AR[rp1][1], AR[r][1], EXP_H3210, BR[r][2][1], EXP_H3210, BR[r][0][0], EXP_H3210, OP_NOP, 0LL, OP_NOP, 0LL); exe (OP_FMA, &AR[rp1][2], AR[r][2], EXP_H3210, BR[r][2][1], EXP_H3210, BR[r][1][1], EXP_H3210, OP_NOP, 0LL, OP_NOP, 0LL); exe (OP_FMA, &AR[rp1][3], AR[r][3], EXP_H3210, BR[r][2][1], EXP_H3210, BR[r][1][0], EXP_H3210, OP_NOP, 0LL, OP_NOP, 0LL) #define sgemm00_final(r, rp1) exe(OP_CMP_LT, &cc1, cofs, EXP_H3210, cofslimit1, EXP_H3210, 0LL, EXP_H3210, OP_NOP, 0LL, OP_NOP, 0LL); exe(OP_CMP_LT, &cc2, cofs, EXP_H3210, cofslimit2, EXP_H3210, 0LL, EXP_H3210, OP_NOP, 0LL, OP_NOP, 0LL); exe(OP_CMP_LT, &cc3, cofs, EXP_H3210, cofslimit3, EXP_H3210, 0LL, EXP_H3210, OP_NOP, 0LL, OP_NOP, 0LL); mop(OP_LDUWR, 1, &BR[rp1][0][1], c00[CHIP], oofs, MSK_W0, c0[CHIP], Clen, 0, 1, NULL, Clen); mop(OP_LDUWR, 1, &BR[rp1][1][1], c01[CHIP], oofs, MSK_W0, c0[CHIP], Clen, 0, 1, NULL, Clen); mop(OP_LDUWR, 1, &BR[rp1][2][1], c02[CHIP], oofs, MSK_W0, c0[CHIP], Clen, 0, 1, NULL, Clen); mop(OP_LDUWR, 1, &BR[rp1][3][1], c03[CHIP], oofs, MSK_W0, c0[CHIP], Clen, 0, 1, NULL, Clen); exe (OP_FAD, &AR[rp1][0], AR[r][0], EXP_H3210, BR[rp1][0][1], EXP_H3210, 0LL, EXP_H3210, OP_NOP, 0LL, OP_NOP, 0LL); exe (OP_FAD, &AR[rp1][1], AR[r][1], EXP_H3210, BR[rp1][1][1], EXP_H3210, 0LL, EXP_H3210, OP_NOP, 0LL, OP_NOP, 0LL); exe (OP_FAD, &AR[rp1][2], AR[r][2], EXP_H3210, BR[rp1][2][1], EXP_H3210, 0LL, EXP_H3210, OP_NOP, 0LL, OP_NOP, 0LL); exe (OP_FAD, &AR[rp1][3], AR[r][3], EXP_H3210, BR[rp1][3][1], EXP_H3210, 0LL, EXP_H3210, OP_NOP, 0LL, OP_NOP, 0LL); mop(OP_STWR, 1, &AR[rp1][0], oofs, c00[CHIP], MSK_D0, c0[CHIP], Clen, 0, 1, NULL, Clen); cex (OP_CEXE, &ex1, 0, 0, 0, cc1, 0xaaaa); mop(OP_STWR, ex1, &AR[rp1][1], oofs, c01[CHIP], MSK_D0, c0[CHIP], Clen, 0, 1, NULL, Clen); cex (OP_CEXE, &ex2, 0, 0, 0, cc2, 0xaaaa); mop(OP_STWR, ex2, &AR[rp1][2], oofs, c02[CHIP], MSK_D0, c0[CHIP], Clen, 0, 1, NULL, Clen); cex (OP_CEXE, &ex3, 0, 0, 0, cc3, 0xaaaa); mop(OP_STWR, ex3, &AR[rp1][3], oofs, c03[CHIP], MSK_D0, c0[CHIP], Clen, 0, 1, NULL, Clen) One physical (four logical) unit One physical (four logical) unit マクロの中身 Prefetching Length of area Top of area LD/ST offset LD/ST base addr. 20210401 44
  45. 45. #define sgemm00_core1 mop(OP_LDUWR, 1, &BR[r][0][1] mop(OP_LDUWR, 1, &BR[r][0][0] mop(OP_LDUWR, 1, &BR[r][1][1] mop(OP_LDUWR, 1, &BR[r][1][0] mop(OP_LDUWR, 1, &BR[r][2][1] exe(OP_FMA, &AR[rp1][0] exe(OP_FMA, &AR[rp1][1] exe(OP_FMA, &AR[rp1][2] exe(OP_FMA, &AR[rp1][3] #define sgemm00_final exe(OP_CMP_LT, &cc1 exe(OP_CMP_LT, &cc2 exe(OP_CMP_LT, &cc3 mop(OP_LDUWR, 1, &BR[rp1][0][1] mop(OP_LDUWR, 1, &BR[rp1][1][1] mop(OP_LDUWR, 1, &BR[rp1][2][1] mop(OP_LDUWR, 1, &BR[rp1][3][1] exe(OP_FAD, &AR[rp1][0], AR[r][0] exe(OP_FAD, &AR[rp1][1], AR[r][1] exe(OP_FAD, &AR[rp1][2], AR[r][2] exe(OP_FAD, &AR[rp1][3], AR[r][3] mop(OP_STWR, 1, &AR[rp1][0] cex(OP_CEXE, &ex1, cc1 mop(OP_STWR, ex1, &AR[rp1][1] cex(OP_CEXE, &ex2, cc2 mop(OP_STWR, ex2, &AR[rp1][2] cex(OP_CEXE, &ex3, cc3 mop(OP_STWR, ex3, &AR[rp1][3] 20210401 45 行列積のコンパイル結果
  46. 46. unpack_patch2col(tmp_col:25x[100x24x24] <-- ninput:■100x28x28, ksize, kstride) reshape nhidden:100x[8x24x24] --> tmp_dst:8x[100x24x24] (C1)multiply_float2D(▲g_Ki2h:8x25 <-- tmp_dst:8x[100x24x24], tmp_col:25x[100x24x24]^T) (C2)multiply_float2D(tmp_col:25x[100x24x24] <-- Ki2h:8x25^T, tmp_dst:8x[100x24x24]) pack_col2patch(ninput:■100x28x28 <-- tmp_col:25x[100x24x24], 5, 1) 0.0 0.1 0.2 1.0 1.1 1.2 2.0 2.1 2.2 … … 0.27 … … 1.27 … … 2.27 : : : : : : 27.0 27.1 27.2 … … : : : 27.3 … 27:27 28 28 0:23 1:23 2:23 : : … 23:0 23:1 23:2 … … 4.27 23.23 xICx100 24 24 x100x8 tmp_dst ninput (original) g_Ki2h (C1) 0.0 0.1 0.2 1.0 1.1 1.2 2.0 2.1 2.2 0.23 1.23 2.23 : : : 23.0 23.1 23.2 : 23.23 … … … … … 0.0 0.1 0.2 1.0 1.1 1.2 2.0 2.1 2.2 0.3 1.3 2.3 : : : : 0.4 1.4 2.4 : : : : : 4.4 0.0 0.1 0.2 1.0 1.1 1.2 2.0 2.1 2.2 0.3 1.3 2.3 : : : : 0.4 1.4 2.4 : : : : : 4.4 0.0 0.1 0.2 1.0 1.1 1.2 2.0 2.1 2.2 0.3 1.3 2.3 : : : : 0.4 1.4 2.4 : : : : : 4.4 0.0 0.1 0.2 1.0 1.1 1.2 2.0 2.1 2.2 0.3 1.3 2.3 : : : : 0.4 1.4 2.4 : : : : : 4.4 0.0 0.1 … : : … 0.4 0.5 … 0.23 1.0 1.1 : : : 0:27 1.4 1.5 1.0 1.1 … : : : 1.4 1.5 … 1:23 2.0 2.1 : : : 1.27 2.4 2.5 … 1.23 23.0 :… : : … 1.27 23.4 23.1 … 23.23 : … : 23.5 … 23.27 … 2.23 24.0 : : : … 2.27 24.4 24.1 … 24.23 : : : 24.5 … 24:27 : : : 4.4 4.5 … : : : 4.27 5.4 5.5 : : : … 5.27 27.4 : : : 27.5 … 27:27 5x5 xIC 24x24 x100 tmp_col (reshaped for GPU) copy 5x5xICx8 nhidden 24 x8x100 20210401 46 IMAXの重み用バックプロパゲーション
  47. 47. unpack_patch2col(tmp_col:25x[100x24x24] <-- ninput:■100x28x28, ksize, kstride) reshape nhidden:100x[8x24x24] --> tmp_dst:8x[100x24x24] (C1)multiply_float2D(▲g_Ki2h:8x25 <-- tmp_dst:8x[100x24x24], tmp_col:25x[100x24x24]^T) (C2)multiply_float2D(tmp_col:25x[100x24x24] <-- Ki2h:8x25^T, tmp_dst:8x[100x24x24]) pack_col2patch(ninput:■100x28x28 <-- tmp_col:25x[100x24x24], 5, 1) 24 24 x8x100 nhidden Ki2h ninput (C2) 0.0 0.1 0.2 1.0 1.1 1.2 2.0 2.1 2.2 0.3 1.3 2.3 : : : : 0.4 1.4 2.4 : : : : : 4.4 0.0 0.1 0.2 1.0 1.1 1.2 2.0 2.1 2.2 0.3 1.3 2.3 : : : : 0.4 1.4 2.4 : : : : : 4.4 0.0 0.1 0.2 1.0 1.1 1.2 2.0 2.1 2.2 0.3 1.3 2.3 : : : : 0.4 1.4 2.4 : : : : : 4.4 0.2 1.0 1.1 1.2 2.0 2.1 2.2 0.3 1.3 2.3 : : : : 0.4 1.4 2.4 : : : : : 4.4 0.0 0.1 0.0 0.2 1.0 1.1 1.2 2.0 2.1 2.2 … … 0.27 … … 1.27 … … 2.27 : : : : : : 27.0 27.1 27.2 … … : : : 27.3 … 27:27 28 28 0:23 1:23 2:23 : : … 23:0 23:1 23:2 … … 4.27 23.23 xICx100 0.0 0.1 0.2 1.0 1.1 1.2 2.0 2.1 2.2 0.23 1.23 2.23 : : : :23.0 23.1 23.2 : 23.23 … … … … … 0.0 0.1 0.2 1.0 1.1 1.2 2.0 2.1 2.2 0.23 1.23 2.23 : : : :23.0 23.1 23.2 : 23.23 … … … … … 0.0 0.1 0.2 1.0 1.1 1.2 2.0 2.1 2.2 0.23 1.23 2.23 : : : :23.0 23.1 23.2 : 23.23 … … … … … 0.1 0.2 1.0 1.1 1.2 2.0 2.1 2.2 0.23 1.23 2.23 : : : 23.0 23.1 23.2 : 23.23 … … … … … 0.0 0.0 0.1 … : … 0.4 0.5 … 0.23 1.0 1.1 : 1.1 : 0:27 1.4 1.5 1.0 1.1 … 1.1 : : 1.4 1.5 … 1:23 2.0 2.1 : : : 1.27 2.4 2.5 … 1.23 23.0 :… : : … 1.27 23.4 23.1 … 23.23 : … : 23.5 … 23.27 … 2.23 24.0 : : : … 2.27 24.4 24.1 … 24.23 : : : 24.5 … 24:27 : : : 4.4 4.5 … : : : 4.27 5.4 5.5 : : : … 5.27 27.4 : : : 27.5 … 27:27 5x5 xIC 24x24 x100 contribution of pixel/ninput : merge 5x5xICx8 Integration of OC(8) 0.1 tmp_col (reshaped for GPU) 20210401 47 IMAXの入力用バックプロパゲーション
  48. 48. 0.50×0.50≒0.20 0000111101 0111110000 0000110000 Multiplier by AND gate 0.50+0.50≒0.50*2 0000111101 0111110000 0101111000 Scaled adder by random selector 20210401 48 ストカスティック積和演算 0.50+0.50=1.00 Adder by population counter Tati Erlina, Yan Chen, Renyuan Zhang and Yasuhiko Nakashima: "An Efficient Time-based Stochastic Computing Circuitry Employing Neuron-MOS", GLSVLSI2019, pp.51-56, May. (2019)
  49. 49. 20210401 49 IMAXのストカスティック積和演算
  50. 50. 20210401 50 様々なステンシル計算
  51. 51. 20210401 51 FD6の写像
  52. 52. 20210401 52 ライトフィールド画像処理
  53. 53. 20210401 53 ライトフィールド画像処理 レンダリング 距離画像生成
  54. 54. 20210401 54 逆行列は、連立一次方程式の特殊ケースで求まる 連立一次方程式 LU分解 前進消去 後退代入
  55. 55. 20210401 55 逆行列には、ローカルメモリ自己更新 for (j=i+1; j<M; j+=NCHIP*H*RMGRP) { /* 行方向 */ //EMAX5A begin inv_x1 mapdist=0 for (CHIP=0; CHIP<NCHIP; CHIP++) { for (INIT1=1,LOOP1=RMGRP,rofs=0-M*4; LOOP1--; INIT1=0) { /* stage#0 *//* mapped to FOR() on BR[63][1][0] */ for (INIT0=1,LOOP0=M-(i+1),cofs=0; LOOP0--; INIT0=0) { /* stage#0 *//* mapped to FOR() on BR[63][0][0] */ exe(OP_ADD, &cofs, INIT0?cofs:cofs, EXP_H3210, 4LL, EXP_H3210, 0LL, EXP_H3210, OP_AND, 0x00000000ffffffffLL, OP_NOP, 0LL); /* stage#0 */ exe(OP_ADD, &rofs, rofs, EXP_H3210, INIT0?M*4:0, EXP_H3210, 0LL, EXP_H3210, OP_NOP, 0LL, OP_NOP, 0LL); /* stage#0 */ exe(OP_ADD, &oofs, rofs, EXP_H3210, cofs, EXP_H3210, 0LL, EXP_H3210, OP_AND, 0x00000000ffffffffLL, OP_NOP, 0LL); /* stage#1 */ /***************************/ /* + - - - - - - - - - - - */ /* A[p[i]] 先頭行 */ /* 先頭行はi更新まで再利用可能 */ /* | * > > > > > > > > > > */ /* A[p[j]] 次行から引く */ /* 1行をLMMに写像 */ /* | v + - - - - - - - - - */ /* | v | * > > > > > > > > */ /* M/60を収容してi更新までj+=60を繰り返す *//* 行番号比較とcstによる端数制御 */ /* | v | v + - - - - - - - */ /* + CHIP#0 h=0 grp=0 */ /* | v | v - + - - - - - - */ /* + CHIP#0 h=0 grp=1 */ /* | v | v - - + - - - - - */ /* + CHIP#1 h=0 grp=0 */ /* | v | v - - - + - - - - */ /* + CHIP#1 h=0 grp=1 */ /* | v | v - - - - + - - - */ /* + CHIP#0 h=1 grp=0 */ /* | v | v - - - - - + - - */ /* + CHIP#0 h=1 grp=1 */ /* | v | v - - - - - - + - */ /* + CHIP#1 h=1 grp=0 */ /* | v | v - - - - - - - + */ /* + CHIP#1 h=1 grp=1 */ /***************************/ /* 最大60行まで写像可能 */ /* FOLDING時は,少なくとも第0列がFOLDINGであることが必要(conv-c2c仕様) */ /* CEXEにも関わらずSTWRの無意味なLMM入れ換えが発生するため,A[M][*](枠外領域)を使用 */ /* OK exe-loop */ exe(OP_CMP_LT, &cc0, l00[CHIP], EXP_H3210, M, EXP_H3210, 0LL, EXP_H3210, OP_NOP, 0LL, OP_NOP, 0); /* stage#1 LD */ mop(OP_LDWR, 1, &BR[2][2][1], top, cofs, MSK_W0, topw, len, 0, 0, NULL, len); /* A[p[i]*M+k] stage#2 | */ mop(OP_LDWR, 1, &BR[2][0][1], d00[CHIP], oofs, MSK_W0, d00w[CHIP], len2,0, 1, NULL, len2); /* A[p[j+h*NCHIP+CHIP]*M+k] stage#2 +-> | */ mop(OP_LDWR, 1, &BR[2][1][1], d00[CHIP], rofs, MSK_W0, d00w[CHIP], len2,0, 1, NULL, len2); /* A[p[j+h*NCHIP+CHIP]*M+k] stage#2 +-> | */ exe(OP_FMS, &AR[2][0], BR[2][0][1], EXP_H3210, BR[2][1][1], EXP_H3210, BR[2][2][1], EXP_H3210, OP_NOP, 0LL, OP_NOP, 0); /* stage#2 | ■■■ | 1.0 */ cex(OP_CEXE, &ex0, 0, 0, 0, cc0, 0xaaaa); /* stage#2 | AR[1] | */ mop(OP_STWR,ex0, &AR[2][0], oofs, d00[CHIP], MSK_D0, d00w[CHIP], len2, 0, 1, NULL, len2); /* stage#2 | + ST v */ #if (H>1) /* *--------- BR[2] */ exe(OP_CMP_LT, &cc1, l01[CHIP], EXP_H3210, M, EXP_H3210, 0LL, EXP_H3210, OP_NOP, 0LL, OP_NOP, 0); /* stage#2 LD */ mop(OP_LDWR, 1, &BR[3][2][1], top, cofs, MSK_W0, topw, len, 0, 0, NULL, len); /* A[p[i]*M+k] stage#3 | */ mop(OP_LDWR, 1, &BR[3][0][1], d01[CHIP], oofs, MSK_W0, d01w[CHIP], len2,0, 1, NULL, len2); /* A[p[j+h*NCHIP+CHIP]*M+k] stage#3 +-> | */ mop(OP_LDWR, 1, &BR[3][1][1], d01[CHIP], rofs, MSK_W0, d01w[CHIP], len2,0, 1, NULL, len2); /* A[p[j+h*NCHIP+CHIP]*M+k] stage#3 +-> | */ exe(OP_FMS, &AR[3][0], BR[3][0][1], EXP_H3210, BR[3][1][1], EXP_H3210, BR[3][2][1], EXP_H3210, OP_NOP, 0LL, OP_NOP, 0); /* stage#3 | ■■■ | 1.0 */ cex(OP_CEXE, &ex0, 0, 0, 0, cc1, 0xaaaa); /* stage#3 | AR[2] | */ mop(OP_STWR,ex0, &AR[3][0], oofs, d01[CHIP], MSK_D0, d01w[CHIP], len2, 0, 1, NULL, len2); /* stage#3 | + ST v */ #if (H>2) /* *--------- BR[3] */ if (j+h*NCHIP*RMGRP+CHIP*RMGRP+grp<M) A[(j+h*NCHIP*RMGRP+CHIP*RMGRP+grp)*M+i+1+k] -= A[(j+h*NCHIP*RMGRP+CHIP*RMGRP+grp)*M+i]*A[i*M+i+1+k];
  56. 56. 20210401 56 疎行列積和 マージソート 1 1.0 2 2.0 3 3.0 11 4.0 12 5.0 13 6.0 配列A 配列B 2 1.0 3 2.0 4 3.0 9 4.0 10 5.0 11 6.0 要素番号と値の組 1 a1 2 a2 3 s3 11 a11 12 a12 13 a13 入力A 入力B 2 b2 3 b3 4 b4 9 b9 10 b10 11 b11 値と付加情報(ポインタなど)の組 疎行列とソートには、デュアルアドレス同調機能が便利
  57. 57. 4段パイプライン浮動小数点演算器+メモリ参照(LD+ST) ⑩+⑪+初回初期値C出力レジスタ⇒演算器入力REG 以降、累算 演算器3段結果⇒演算器入力REG 演算器入力REG⇒演算器初段結果⇒演算器2段結果 ⇒演算器3段結果⇒演算器入力REGへ戻る累算リング 4段パイプラインAアドレス計算データフロー ①Aアドレス入力REG⇒②0/8加算出力⇒⑦通過 ⇒⑨通過⇒先頭へ戻るアドレス累算リング 4段パイプラインBアドレス計算データフロー ①Bアドレス入力REG⇒②0/8加算出力⇒⑦通過 ⇒⑨通過⇒先頭へ戻るアドレス累算リング 4段パイプラインAデータ参照フロー ⑤B組およびA組index比較+0/8加算出力 ⇒⑥A先頭オフセット加算結果⇒⑧Aマスク結果 ⇒④Aメモリ出力⇒先頭 4段パイプラインBデータ参照フロー ⑤B組およびA組index比較+0/8加算出力 ⇒⑥B先頭オフセット加算結果⇒⑧Bマスク結果 ⇒③Bメモリ出力⇒先頭 ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑨ ① ② ⑤ ⑥ ⑦ ⑧ ① ① ② ② ⑦ ⑦ ⑨ ⑨ ⑤ ⑧ ⑤ ⑥ ⑥ ⑧ ④ ③ ⑩ ⑪ オフセット加算 アドレスマスク操作 読み出し結果 B42 読み出し結果 A00 B,A行列のベースアドレス C02へのストア 20210401 57 4列多重化CGRAに5本のデータ流を埋め込む
  58. 58. ① ① ② ② ⑦ ⑦ ⑨ ⑨ ⑤ ⑧ ⑤ ⑥ ⑥ ⑧ ④ ③ ⑩ ⑪ オフセット加算 アドレスマスク操作 読み出し結果 B42 読み出し結果 A00 疎行列と同様、読み出し結果の大小関係に従い、 1次元配列内の異なるアドレスA,Bの片側を更新 後続ユニットにアドレスA,Bと、2つの読み出し データを送り、アドレスとデータの各々の大小関 係に従い、いずれかのデータをストアすることに より、LogN段のソートのうち、1段分を実現 ソート全体のLogN段のうち、1段分の ソート結果をローカルメモリにストア ストア先アドレスは単調増加 同時に後続ユニットが、前回の実行結果を前段の ローカルメモリから読み出し、LogN段の次段以降 を担当する。全体として、ローカルメモリをダブル バッファとするパイプライン実行が可能となる。 マージソートの作り方 20210401 58
  59. 59. 疎行列と同様、 読み出し結果の 大小関係に従い、 1次元配列内の 異なるアドレス A,Bの片側を更 新 後続ユニットにアドレスA,Bと、2つの読み出しデータを送り、アドレスとデータの各々の大小関 係に従い、いずれかのデータをストアすることにより、LogN段のソートのうち、1段分を実現 ストア先アドレスは単調増加 ソート全体のLogN段のうち、1段分のソート結果をローカルメモリにストア アドレスA アドレスB データB データA 疎行列と同様、 読み出し結果の 大小関係に従い、 1次元配列内の 異なるアドレス A,Bの片側を更 新 同一物理メモリ上で、計算結果を次に渡す マージソートのコンパイル結果 20210401 59
  60. 60. おまけ。疎行列圧縮 count0 = 0; for (row=0; row<M1; row++) { for (col=0; col<M2; col++) { if (A32_0[row*M2+col] == 0) continue; if (count0 >= M1*M2) continue; A32_P[count0].d = A32_0[row*M2+col]; A32_P[count0].x = row*M2+col; count0++; } } *Bas1P = B32_P-1; /* end of B32_0 */ for (i=0; i<M1; i+=RMGRP) { r1 = (Ull)(i*M2-1)<<32; ibase0 = B32_0+i*M2; itop0 = B32_0+i*M2; itop1 = itop0+RMGRP*M2; obase0 = *Bas1P; /* end of B32_0 */ otop1 = otop0; otop0 = *Bas1P+8; /* top of B32_P */ //with-prefetch/post-drain //EMAX5A begin imax mapdist=0 for (CHIP=0; CHIP<NCHIP; CHIP++) { for (INIT1=1,LOOP1=RMGRP,rofs=0; LOOP1--; INIT1=0) { for (INIT0=1,LOOP0=M2,cofs=0; LOOP0--; INIT0=0) { mop(OP_LDWR, 1, &r0, ibase0++, 0, MSK_D0, itop0, M2*RMGRP, 0, 0, itop1, M2*RMGRP); exe(OP_ADD, &r1, r1, EXP_H3210, 0x100000000LL, EXP_H3210, 0, EXP_H3210, OP_NOP, 0, OP_NOP, 0LL); exe(OP_NOP, &std, r1, EXP_H3210, 0, EXP_H3210, 0, EXP_H3210, OP_OR, r0, OP_NOP, 0LL); exe(OP_CMP_EQ, &cc0, r0, EXP_H1010, 0x00000000LL, EXP_H1010, 0, EXP_H3210, OP_NOP, 0, OP_NOP, 0LL); exe(OP_CMP_EQ, &cc1, r0, EXP_H1010, 0x80000000LL, EXP_H1010, 0, EXP_H3210, OP_NOP, 0, OP_NOP, 0LL); exe(OP_NOP, &cc2, cc0, EXP_H3210, 0, EXP_H3210, 0, EXP_H1010, OP_OR, cc1, OP_NOP, 0LL); exe(OP_CMOV, &oofs, cc2, EXP_H3210, 0, EXP_H3210, 8, EXP_H3210, OP_NOP, 0, OP_NOP, 0LL); exe(OP_ADD, &obase0, obase0, EXP_H3210, oofs, EXP_H3210, 0, EXP_H3210, OP_NOP, 0, OP_NOP, 0LL); mop(OP_STR, 3, &obase0, Bas1P, 0, MSK_D0, Bas1P, 2, 0, 0, NULL, 2); exe(OP_NOP, &AR[5][0], 0, EXP_H3210, 0, EXP_H3210, 0, EXP_H1010, OP_NOP, 0, OP_NOP, 0LL); cex(OP_CEXE, &ex0, 0, 0, 0, cc2, 0x0001); mop(OP_STR, ex0, &std, obase0, 0, MSK_D0, otop0, LP*2*RMGRP, 0, 0, otop1, LP*2*RMGRP); } } } //EMAX5A end //EMAX5A drain_dirty_lmm } 20210401 60
  61. 61. 20210401 61 ハッシュ計算には、面倒な演算が必要 for (i=0; i<ctx->mbuflen; i+=BLKSIZE) { /* 1データ流内の並列実行は不可能. 多数データ流のパイプライン実行のみ */ for (th=0; th<thnum; th++) { sregs[th*8+0] = state[th*8+0]; sregs[th*8+1] = state[th*8+1]; sregs[th*8+2] = state[th*8+2]; sregs[th*8+3] = state[th*8+3]; sregs[th*8+4] = state[th*8+4]; sregs[th*8+5] = state[th*8+5]; sregs[th*8+6] = state[th*8+6]; sregs[th*8+7] = state[th*8+7]; } for (j=0; j<BLKSIZE; j+=BLKSIZE/DIV) { for (th=0; th<thnum; th++) { a = sregs[th*8+0]; b = sregs[th*8+1]; c = sregs[th*8+2]; d = sregs[th*8+3]; e = sregs[th*8+4]; f = sregs[th*8+5]; g = sregs[th*8+6]; h = sregs[th*8+7]; #if (DIV==4) t1 = h+EP1(e)+CH(e,f,g)+k[j+ 0]+mbuf[i/BLKSIZE*MAX_THNUM*BLKSIZE+th*BLKSIZE+j+ 0]; t2 = EP0(a)+MAJ(a,b,c); h = g; g = f; f = e; e = d+t1; d = c; c = b; b = a; a = t1+t2; t1 = h+EP1(e)+CH(e,f,g)+k[j+ 1]+mbuf[i/BLKSIZE*MAX_THNUM*BLKSIZE+th*BLKSIZE+j+ 1]; t2 = EP0(a)+MAJ(a,b,c); h = g; g = f; f = e; e = d+t1; d = c; c = b; b = a; a = t1+t2; t1 = h+EP1(e)+CH(e,f,g)+k[j+ 2]+mbuf[i/BLKSIZE*MAX_THNUM*BLKSIZE+th*BLKSIZE+j+ 2]; t2 = EP0(a)+MAJ(a,b,c); h = g; g = f; f = e; e = d+t1; d = c; c = b; b = a; a = t1+t2; t1 = h+EP1(e)+CH(e,f,g)+k[j+ 3]+mbuf[i/BLKSIZE*MAX_THNUM*BLKSIZE+th*BLKSIZE+j+ 3]; t2 = EP0(a)+MAJ(a,b,c); h = g; g = f; f = e; e = d+t1; d = c; c = b; b = a; a = t1+t2; t1 = h+EP1(e)+CH(e,f,g)+k[j+ 4]+mbuf[i/BLKSIZE*MAX_THNUM*BLKSIZE+th*BLKSIZE+j+ 4]; t2 = EP0(a)+MAJ(a,b,c); h = g; g = f; f = e; e = d+t1; d = c; c = b; b = a; a = t1+t2; t1 = h+EP1(e)+CH(e,f,g)+k[j+ 5]+mbuf[i/BLKSIZE*MAX_THNUM*BLKSIZE+th*BLKSIZE+j+ 5]; t2 = EP0(a)+MAJ(a,b,c); h = g; g = f; f = e; e = d+t1; d = c; c = b; b = a; a = t1+t2; t1 = h+EP1(e)+CH(e,f,g)+k[j+ 6]+mbuf[i/BLKSIZE*MAX_THNUM*BLKSIZE+th*BLKSIZE+j+ 6]; t2 = EP0(a)+MAJ(a,b,c); h = g; g = f; f = e; e = d+t1; d = c; c = b; b = a; a = t1+t2; t1 = h+EP1(e)+CH(e,f,g)+k[j+ 7]+mbuf[i/BLKSIZE*MAX_THNUM*BLKSIZE+th*BLKSIZE+j+ 7]; t2 = EP0(a)+MAJ(a,b,c); h = g; g = f; f = e; e = d+t1; d = c; c = b; b = a; a = t1+t2; t1 = h+EP1(e)+CH(e,f,g)+k[j+ 8]+mbuf[i/BLKSIZE*MAX_THNUM*BLKSIZE+th*BLKSIZE+j+ 8]; t2 = EP0(a)+MAJ(a,b,c); h = g; g = f; f = e; e = d+t1; d = c; c = b; b = a; a = t1+t2; t1 = h+EP1(e)+CH(e,f,g)+k[j+ 9]+mbuf[i/BLKSIZE*MAX_THNUM*BLKSIZE+th*BLKSIZE+j+ 9]; t2 = EP0(a)+MAJ(a,b,c); h = g; g = f; f = e; e = d+t1; d = c; c = b; b = a; a = t1+t2; t1 = h+EP1(e)+CH(e,f,g)+k[j+10]+mbuf[i/BLKSIZE*MAX_THNUM*BLKSIZE+th*BLKSIZE+j+10]; t2 = EP0(a)+MAJ(a,b,c); h = g; g = f; f = e; e = d+t1; d = c; c = b; b = a; a = t1+t2; t1 = h+EP1(e)+CH(e,f,g)+k[j+11]+mbuf[i/BLKSIZE*MAX_THNUM*BLKSIZE+th*BLKSIZE+j+11]; t2 = EP0(a)+MAJ(a,b,c); h = g; g = f; f = e; e = d+t1; d = c; c = b; b = a; a = t1+t2; t1 = h+EP1(e)+CH(e,f,g)+k[j+12]+mbuf[i/BLKSIZE*MAX_THNUM*BLKSIZE+th*BLKSIZE+j+12]; t2 = EP0(a)+MAJ(a,b,c); h = g; g = f; f = e; e = d+t1; d = c; c = b; b = a; a = t1+t2; t1 = h+EP1(e)+CH(e,f,g)+k[j+13]+mbuf[i/BLKSIZE*MAX_THNUM*BLKSIZE+th*BLKSIZE+j+13]; t2 = EP0(a)+MAJ(a,b,c); h = g; g = f; f = e; e = d+t1; d = c; c = b; b = a; a = t1+t2; t1 = h+EP1(e)+CH(e,f,g)+k[j+14]+mbuf[i/BLKSIZE*MAX_THNUM*BLKSIZE+th*BLKSIZE+j+14]; t2 = EP0(a)+MAJ(a,b,c); h = g; g = f; f = e; e = d+t1; d = c; c = b; b = a; a = t1+t2; t1 = h+EP1(e)+CH(e,f,g)+k[j+15]+mbuf[i/BLKSIZE*MAX_THNUM*BLKSIZE+th*BLKSIZE+j+15]; t2 = EP0(a)+MAJ(a,b,c); h = g; g = f; f = e; e = d+t1; d = c; c = b; b = a; a = t1+t2; #endif sregs[th*8+0] = a; sregs[th*8+1] = b; sregs[th*8+2] = c; sregs[th*8+3] = d; sregs[th*8+4] = e; sregs[th*8+5] = f; sregs[th*8+6] = g; sregs[th*8+7] = h; } } for (th=0; th<thnum; th++) { state[th*8+0] += sregs[th*8+0]; state[th*8+1] += sregs[th*8+1]; state[th*8+2] += sregs[th*8+2]; state[th*8+3] += sregs[th*8+3]; state[th*8+4] += sregs[th*8+4]; state[th*8+5] += sregs[th*8+5]; state[th*8+6] += sregs[th*8+6]; state[th*8+7] += sregs[th*8+7]; } }
  62. 62. 20210401 62 ハッシュ計算のコンパイル結果
  63. 63. 20210401 63 FFTには、ダブルバッファリングが必要 BlockEnd = 1; for (BlockSize=2; BlockSize<=NumSamples; BlockSize<<=1) { for (i=0; i<NumSamples; i+=BlockSize) { for (j=i,n=0; n<BlockEnd; j++,n++) { k = j + BlockEnd; idx = n + BlockEnd; tr = art[idx]*RealOut[k] - ait[idx]*ImagOut[k]; ti = art[idx]*ImagOut[k] + ait[idx]*RealOut[k]; RealOut[k] = RealOut[j] - tr; ImagOut[k] = ImagOut[j] - ti; RealOut[j] += tr; ImagOut[j] += ti; } } BlockEnd = BlockSize; } 1段目 2段目 3段目
  64. 64. 20210401 64 FFTのコンパイル結果
  65. 65. 20210401 65 文字列検索 void strsearch(int i) { char *str = sstr[i]; int len = slen[i]; register size_t shift; register size_t pos = len - 1; char *found; while (pos < clen) { while (pos < clen && (shift = table[(unsigned char)target[pos]]) > 0) pos += shift; if (!shift) { if (!strncmp(str, &target[pos-len+1], len)) out0[i*clen+(pos-len+1)] = 0xff; pos++; } } }
  66. 66. 20210401 66 文字列検索のコンパイル結果
  67. 67. ld @(gr1, 0) -> gr2 add gr1, 4 -> gr1 sub gr3, 1 -> gr3, z VLIW0 add sub gr1 gr3z Register File gr1 4 gr3 1 eag gr1 4 0 1 2 3 4 5 6 0 0 0 0 0 0 0 0 1 2 3 4 5 6 0 0 0 0 0 0 0 0 1 2 3 4 5 6 0 0 0 0 0 0 0 0 1 2 3 4 5 6 0 0 0 0 0 0 0 0 1 2 3 4 5 6 0 0 0 0 0 0 0 z 0 z 0 z 0 z 0 z 0 gr2 ld Propagation skip table gr/cr Stage 0 1 2 3 4 20210401 67 コンパイルが速いのは、非探索的だから
  68. 68. ld @(gr4, 0) -> gr5 add gr4, 4 -> gr4 bz end VLIW1 add sub gr1 gr3z add gr4 Register File gr1 4 gr4 4 gr3 1 gr4 bz end eag eag gr1 4 gr4 4 0 1 2 3 4 5 6 0 1 1 1 0 0 0 0 1 2 3 4 5 6 0 1 1 1 0 0 0 0 1 2 3 4 5 6 0 0 1 0 0 0 0 0 1 2 3 4 5 6 0 0 0 0 0 0 0 0 1 2 3 4 5 6 0 0 0 0 0 0 0 z 1 z 1 z 0 z 0 z 0 gr5 ld gr2 ld Propagation skip table gr/cr Stage 0 1 2 3 4 VLIW1 20210401 68 LAPPと同様の非探索的高速コンパイル手法
  69. 69. gr5 ld gr2 ld sll gr2, 16 -> gr2 VLIW2 add sub gr1 gr3z add gr4 sll Register File gr1 4 gr4 4 16 gr3 1 0 1 2 3 4 5 6 0 1 1 1 1 1 0 0 1 2 3 4 5 6 0 1 1 1 1 1 0 0 1 2 3 4 5 6 0 0 1 0 1 1 0 0 1 2 3 4 5 6 0 0 0 0 0 1 0 0 1 2 3 4 5 6 0 0 0 0 0 0 0 z 1 z 1 z 0 z 0 z 0 gr4 bz end eag eag gr1 4 gr4 4 Propagation skip table gr/cr Stage 0 1 2 3 4 VLIW2 VLIW2 20210401 69 LAPPと同様の非探索的高速コンパイル手法
  70. 70. gr5 ld gr2 ld or gr2, gr5 -> gr5 VLIW3 add sub gr1 gr3z add gr4 gr2 Register File or gr5 gr1 4 gr4 4 gr3 1 0 1 2 3 4 5 6 0 1 1 1 1 1 0 0 1 2 3 4 5 6 0 1 1 1 1 1 0 0 1 2 3 4 5 6 0 0 1 0 1 1 0 0 1 2 3 4 5 6 0 0 1 0 0 1 0 0 1 2 3 4 5 6 0 0 0 0 0 0 0 z 1 z 1 z 0 z 0 z 0 gr4 bz end eag eag gr1 4 gr4 4 Propagation skip table gr/cr Stage 0 1 2 3 4 sll 16 VLIW3 VLIW3 VLIW3 20210401 70 LAPPと同様の非探索的高速コンパイル手法
  71. 71. gr5 gr2 ld st, gr5 -> @(gr6, 0) add gr6, 4 -> gr6 bra loop VLIW4 add sub gr1 gr3z add gr4 Register File gr5 gr5 add gr6 gr1 4 gr4 4 16 gr6 gr6 4 gr6 gr6 gr3 1 0 1 2 3 4 5 6 0 1 1 1 1 1 0 0 1 2 3 4 5 6 0 1 1 1 1 1 0 0 1 2 3 4 5 6 0 0 1 0 1 1 0 0 1 2 3 4 5 6 0 0 1 0 0 1 0 0 1 2 3 4 5 6 0 0 0 0 0 1 0 z 1 z 1 z 0 z 0 z 0 gr4 gr6 bz bra end loop eag eag eag gr1 4 gr4 4 gr6 0 st Propagation skip table gr/cr Stage 0 1 2 3 4 gr5 ld gr2 or sll VLIW4 VLIW4 VLIW4 VLIW4 20210401 71 LAPPと同様の非探索的高速コンパイル手法
  72. 72. 20210401 72 ボードだけ買えば(50万~1650万)CGRA遊べる
  73. 73. 20210401 73 HBM2 and VMK version will appear soon IMAX2: Ultra-speed compilable CGRA 2022/12/XX First CGRA, based on linear cores (not island-style) 32-unit, 1280-operations/4cycle (768-int32, 256-fp32, 256-media8/16, 512-load/store, 1024-stochastic-fma8, and 128-sparse-matrix) IMAX2 32 cores 250MHz 1280 operations per 4 cycles ALVEO-U280/U280 Memory/core: 64KB Operations/core: 32-load/8-store, quad-sparse-load, 3-cascaded octa-int/media, octa-single-float FMA, 32-stochastic FMA http://archlab.naist.jp/proj-arm64/fpga/U280-step4000-20221020.img.gz IMAX2 32 cores 250MHz 1280 operations per 4 cycles VMK180/VM1802 Memory/core: 64KB Operations/core: 32-load/8-store, quad-sparse-load, 3-cascaded octa-int/media, octa-single-float FMA, 32-stochastic FMA http://archlab.naist.jp/proj-arm64/fpga/VMK180-step4000-20221020.img.gz
  74. 74. 仕様書、ファイル一式は公開済 20210401 74

×