Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
The SIMD
BY USAGI ITO
The SIMD Series
• #1 Get the SIMD! ― SIMDを手に入れろ!
• #2 The Ancient System ― 古きモノ
• #3 The Power ― その力
• #4 Control the SIMD...
… by Usagi Ito
• Current Working
• Software Architect / System Engineer of a Geological Software Maker
• Old Working
• Ins...
この資料に含まれる画像等について
• 画像について
• この資料に含まれる写真は原則としてWikimedia Commonsに収録された画像を
用いています
• https://commons.wikimedia.org/wiki/Main_P...
The SIMD
PART Ⅰ
今回終わらなかった
ところから PART II
全部終わったら
PART IIは現代編へ
The SIMD #1
GET THE SIMD!
CPUに搭載されたSIMD命令の役割とは?
I1 • z[0]=x[0]+y[0]
I2 • z[1]=x[1]+y[1]
I3 • z[2]=x[2]+y[2]
I4 • z[3]=x[3]+y[3]
I1 z[0]=x[0]+y[0]
I1...
CPUが足し算をする命令はaddだけ?
いいえ、違います
CPUに値xを
load
メインメモリー
 CPUレジス
ター
CPUに値yを
load
メインメモリー
 CPUレジス
ター
CPU/add
計算結果はCPU
レジスターへ
CPU...
SIMD命令だと?
CPUに値
x[0,4)をまと
めてload
メインメモ
リー CPUレ
ジスター
CPUに値
y[0,4)をま
とめてload
メインメモ
リー  CPUレ
ジスター
CPU/addps
計算結果は
CPUレジス
ター...
つまりSIMDとは?
• 「同じ処理」を連続したデータに対してN回逐次実行する代わりに
• 「同じ処理」を連続したデータN件に対して一度にやっちゃって!
• というCPU命令のこと
狭義ニハネ・w・
SIMD: Single Instruction Multiple Data
• 「Single Instruction: 単一の命令で」
• 「Multiple Data: 複数のデータ」
• ひとよんでSIMD(しむど)と申す( ・`ω・´...
Flynn’s taxonomy: フリンの分類
SIMD
MIMDMISD
SISD
• 「命令」vs.「データ」
• 「単一」vs.「複数」
• Michael J. Flynnが1966年に提唱
した計算機の命令とデータの4
つの単一・複...
最近の”演算装置”をフリンの分類に当てはめると?
SISD
• PCのCPUの一般的な命令
• x86, x87
• ARMv6
SIMD
• PCのCPUの特別なSIMD命令
• MMX, 3DNow!
• SSEx
• Smart Devi...
PCのCPUがSIMD命令を手に入れたのは何時?
i386
12~40[MHz]
• x86が32bit命令に拡張
• EAXなどのレジスターが汎用化
i486
25~100[MHz]
• FPU(x87)を内蔵
• L1-cache 8KiB...
Get the SIMD
• 1993年
• i486の後継世代のCPUとして当時のPCのCPU戦国時代にintelが投入したCPU
• その名を"Pentium"(ペンティアム)
• 1996年
• Pentiumアーキテクチャーの第3世代バ...
1996年末、こうしてPCのCPUは
SIMDを手に入れたのでした
• 実際に一般市民が購入できた"パソコン"としては、
• NEC PC9821V200 が主(当時はパソコンショップ≈NECのPC98ショップ)
• 実際にはPentium P...
Appendix I
CPUが200MHzの時代のMMXで実現できた事!
フェードイン/
フェードアウト
のリアルタイム処理
具体的には・・・
- 640×480[pixels]のRGB画像
- MMX: 60 [FPS]
- 非MMX: 20...
参考
• http://hp.vector.co.jp/authors/VA014520/asmhsp/chap8.html
• T.T Land / MASMによるHSP用プラグインの作り方 / 8.MMX命令による画像処理
• 実際にMMX...
ちなみに…
本当にSIMDが一般的にPCで使えるようになったのは?
• Pentium II ・・・ ではなくて、現実には Pentium III くらいの時代か
な?
• Pentium IIIでMMX命令の弱点を克服しつつ、とってもパワーア...
ともあれこうしてPCのCPUは・・・
• 1996年、MMX Pentium (P55C) で初のSIMD命令MMX
• Pentium II にも MMX は継承
• Pentium III で MMX の弱点を克服しつつ強化された SSE ...
The SIMD #1
GET THE SIMD!
The SIMD #2
THE ANCIENT SYSTEM
PC向けCPUよりも
古い時代のSIMDの歴史
• 1975
• ILLIAC IV
• イリノイ大学アーバナシャンペー
ン校が最後に完成させた計算機
• 開発期間: 10年
• 計画性能: 1 [GFLOPS]
• 13 [MHz] × 25...
~198xまでのSuper-computerたち
• SIMD vs. Super-scalar
• ILLIAC IV (SIMD)亡き後はCray-1に
代表されるSuper-scalar型の設計の
計算機の時代が198xまで続く
• 用語...
SIMD型の並列計算は・・・
• 実は199x年代になるまでSuper-computerでも使われないままでした
• →200x年代になるとそうでもないのだけど、それはまたHPCのおはなし
• 1996、PC向けCPUのMMX Pentiumの...
PCのCPU以外での
SIMDの実装例はないの?
• 身近な例、
• あります・w・
PPCアーキテクチャーのSIMD命令
• PPC: Power PC
• IBM製のCPU(AIM連合による; AIM: Apple-IBM-Motrola)
• RISC: Reduced Instruction Set Computer 型...
ARMアーキテクチャーのSIMD命令
• ARM
• RISC型(ということになっている)
• 省電力かつパワフルな組み込みデバイスはたいてい採用
• 多くのSmart Phone(~現在)
• Raspberry Pi 2(2015~)
• ...
Cell Broadband Engine
• Cell Broadband Engine; 通称Cell(セル)
• SONY/IBM/東芝 製
• Playstation 3
• 説明略
• Roadrunner
• U.S.A. エネルギ...
PC以外のx86系CPUの
SIMD採用例
• Pentium III
• Intel 製
• XBOX(Mobile Celeron 733MHz; 2001~)
SIMD命令
"MMX"&"SSE"
搭載
そろそろ SIMD が
どんなとこ...
GPU
• GPU: Graphics Processing Unit
• NVIDIA GeForce
• ATI Radeon
• GPUは何をしているの?
• たくさんの頂点データ({x0,y0,z0}, {x1,y1,z1},…): M...
ちょっとまとめ・w・
• SIMD型のアーキテクチャーはどんなところで使われている?
• 「マルチメディア」処理などエンドユーザーに密接なプロセッサーに採用
• 例: 画像処理…すべてのピクセル、数メガ個に同じ処理を適用したい!
• RGBなら...
The SIMD #2
THE ANCIENT SYSTEM
The SIMD #3
THE POWER
SIMDを使えると
どれくらい嬉しいの?
• PCのCPUのSIMDのはなしに戻ります
• 現在の多くのCPUで一般に利用可能なSIMD命令として"SSE"を例に
かんたんな計算処理のベンチマークをしてみましょう・w・
Wandboxでも試せる...
実験の必要要件
• SSE命令を使えるCPUを使えること
• 一般的な近年のPC、IntelやAMDの64bitなCPUなら使えます
• よさ気なC++14対応な処理系
• Clang-3.6とかGCC-5.1とか
• 計算機のメモリーや命令の...
実験I:
原始的なSIMD命令のテストプログラム
• SIMDを使わない版
• やっていること
• floatの値を1024個分の枠を用意
• 数列 0.0, 1.0, 2.0, 3.0 … 1023.0 を設定
• initial_sumに実...
実験I:
原始的なSIMD命令のテストプログラム
• SIMDを使う版
• 使わない版からの変更点
• #include <xmmintrin.h>
• __m128 型をXMMレジスターとか
名前付けて使ってる
• forループが4つ毎に飛ば...
SIMDの使い方の基礎(SSE編)
• intrinsicsという仕組みを使うよ
• MMX  <mmintrin.h>
• SSE  <xmmintrin.h>
• SSE2  <emmintrin.h>
• SSE3  <pmmin...
ところで、
XMMレジスターとは?(1/2)
レジスター
≈
CPUの中の計算用の記憶域
EAX EBX ECX EDX …
• 前提知識
• CPUは主記憶で計算処理してナイ
• load: COPY{ 主記憶  レジスター }
• sto...
ところで、
XMMレジスターとは?(2/2)
• 従来の一般用のx86レジスター
(EAX等)は32bitの記憶域
• XMMはSSEの実装に伴いSSE命
令専用に追加された128bitの記
憶域群
• SSEではXMMレジスターの128bit...
ところで、
intrinsicsではload/add/storeしかできないの?
• intrinsicsについては・・・
• intel Intrinsics Guide でSIMD拡張命
令セットや用途の分類に応じて簡
単な仕様を確認できる...
やりました!
あとは自分で調べてSIMDマスターになれます!!
• そんなに
• 甘くないかも・w・
本当にはよなった?
• 速くはなってる
• 何度か実行すると遅い時と速い時
があるのでは?
• ところで、"loadu_ps"/"storeu_ps"
の"u"はナンダロウネ・w・
vs.
使わない版
はよなった・w・
ちなみにpsはpacke...
The SIMD #3
THE POWER
The SIMD #3
CONTROL THE SIMD
とある実行中のプロセスの
メモリー配置状態
0x00123456 0x00123457 0x00123458 0x00123459 0x0012345A 0x0012345B
0.0f 1.0f …
……
…
「中途半端」な
位置デスネ・w・
「美しい」実行中のプロセスの
メモリー配置状態
0x00123450 0x00123451 0x00123452 0x00123453 0x00123454 0x00123455
0.0f 1.0f …
……
…
美しい・w・
loadu_psとload_psの違い:
メモリーアライメント
• load_ps
• 16byte境界に整っている(=アライメ
ント最適化されている)前提でメモ
リーアクセス
• アライメント最適化されていないと
SEGV
• loadu_p...
でも、どうやって?
実行時のメモリーアライメントをプログラムするの?
• C++11ならカンタン・w・
• 言語標準機能 alignas を使える
• ちなみに昔は・・・
• 多めに確保してアドレスのアライ
メントが合う位置から使いはじめ
る工...
やりました!
あとは自分で調べてSIMDマスターになれます!!
• そんなに
• 甘くないかも・w・
SSEにもadd/sub/mul/div以外にもいろいろあるけど?
SSE以外のSIMD命令は?
• それはまた PART II で
• 詳しくやろうか・w・
ともあれ、これで
PCのSIMDの基礎は
大丈夫じゃ・w・
intrinsicsより簡単になりませんか・・・
スマフォ向けにARMのNeonに興味が・・・
• それらもまた PART II で
• 詳しくやろうか・w・
i-saintさんがタイムリーな
関連記事を書いてくれていたので
気になる方はどうぞ...
The SIMD #4
CONTROL THE SIMD
The SIMD #5
THE PARALLEL AND THE CONCURRENCY
SIMDは"並列"
並列処理と並行処理の違い、大丈夫ですか?
• ちなみに、
• SIMDは"並列"処理・w・
SIMDは"並列"
並列処理と並行処理の違い、大丈夫ですか?
COOKPADニュース
プロ御用達!長ねぎのみじん切りを動画でマスター!
http://cookpad.com/articles/5385
• あくまでも逐次処理
• これはSISD...
SIMDは"並列"
並列処理と並行処理の違い、大丈夫ですか?
Yahoo!ブログ カワラヌマイニチ・・・
白髪ネギカッター!!!
http://blogs.yahoo.co.jp/backblackhead/36252328.html
• 同じ...
SIMDは"並列"
並列処理と並行処理の違い、大丈夫ですか?
TOKYO GAS 最適厨房/厨房談義 第9回
進化するミクニの厨房「厨房というフレームにとらわれない独自の厨房観」
http://eee.tokyo-gas.co.jp/saite...
蛇足:
パイプライン型の並行処理(見様によっては並列処理)
ホテルブリランテ武蔵野スタッフブログ2012年2月
2/22~の今週のランチ(フレンチ調理場より)
http://www.hotel-brillante.com/blog/2012/0...
並列処理と並行処理と
SIMDの位置付け
並行処理
• MIMD
並列処理
• SIMD
複数種類の仕事を
同時に手分けして実行
1つ種類の複数の仕事を
同時に手分けして実行
実は包含関係・w・
The SIMD #5
THE PARALLEL AND THE CONCURRENCY
The SIMD #6
THE TWO LAWS OR CURSES
計算機の進化と
並列化・並行化の法則
• ムーアの法則
• 𝑝 = 2 𝑛/1.5
• p: 集積回路上のトランジスター数の
倍率[-]
• n: 現時点からの経過年数[years]
• 『1年半でトランジスターの集積度
は2倍になる』
ムーア...
計算機の進化と
並列化・並行化の法則
• アムダールの法則
• システム全体を並列化できるわけ
ではない
• システム全体の並列化による高速
化の限界は並列化できない処理に
依存する
• ポラックの法則
• intelの経験則
• 『CPUの性...
SIMDのはなしで大切なこと
• 局所の最適化にかかるコストは
• 全体のパフォーマンスアップに有意か?
• intrinsicsでSIMD最適化するということは
• コードの可読性は明らかに落ちるが保守性・生産性の低下によるデメリットは
高速...
それでもSIMD最適化
したい時がアル・w・
The SIMD #6
THE TWO LAWS OR CURSES
The SIMD #...
THE NEW … TO THE PRESENT …
次回 PART II 予告編
• 具体的なSIMD命令セットごとの特徴と扱い方の紹介
• x86_64: MMX/SSE/SSE2/SSE3/SSSE3/SSE4.1/SSE4.2/AVX/FMA
• ARMv7: Neon
• SIMD最適化...
Appendix II:
ところで、SIMDって「しむど」なの?
『しむどでいいですよ』
Appendix II:
ところで、 SIMDって「しむど」なの?
『しむどでいいですよ』
"seem-dee"
The SIMD
PART Ⅰ
次回もよろしくね・w・
Upcoming SlideShare
Loading in …5
×

The simd

1,574 views

Published on

Published in: Science
  • Be the first to comment

The simd

  1. 1. The SIMD BY USAGI ITO
  2. 2. The SIMD Series • #1 Get the SIMD! ― SIMDを手に入れろ! • #2 The Ancient System ― 古きモノ • #3 The Power ― その力 • #4 Control the SIMD ― SIMDの制御 • #5 The Parallel and the Concurrency ― 並列と並行 • #6 The Two Laws or Curses ― 2つの法則、あるいは呪い • # … The New … to the Present … ― … 新たな … 現代へ … 数回に分け マス・w・
  3. 3. … by Usagi Ito • Current Working • Software Architect / System Engineer of a Geological Software Maker • Old Working • Instructor of the Computer Engineering • An Engineer of the Game Server, the Web System and Linux Infrastructure • The Works and the Supports • One of the Organizer of the “After-5 of an Adult Conversation Series” • One of the Organizer of the “Sapporo C++ Study Group” • One of the Authors of the Emscripten • One of the Translator of a several OSS products • One of the Overseeing members of “PROGRAMMING: Principles and Practice Using C++” Japanese Edition • Contacts • Facebook: usagi.wrp • GitHub: usagi こまけぇ(ry
  4. 4. この資料に含まれる画像等について • 画像について • この資料に含まれる写真は原則としてWikimedia Commonsに収録された画像を 用いています • https://commons.wikimedia.org/wiki/Main_Page • 他に特別なソースを用いる場合には都度、付近に出典を明示しています
  5. 5. The SIMD PART Ⅰ 今回終わらなかった ところから PART II 全部終わったら PART IIは現代編へ
  6. 6. The SIMD #1 GET THE SIMD!
  7. 7. CPUに搭載されたSIMD命令の役割とは? I1 • z[0]=x[0]+y[0] I2 • z[1]=x[1]+y[1] I3 • z[2]=x[2]+y[2] I4 • z[3]=x[3]+y[3] I1 z[0]=x[0]+y[0] I1 z[1]=x[1]+y[1] I1 z[2]=x[2]+y[2] I1 z[3]=x[3]+y[3] 通常の命令による逐次処理 SIMD命令による並列処理 処理時間: 命令4回分 処理時間: 命令1回分 あくまでも イメージ デス
  8. 8. CPUが足し算をする命令はaddだけ? いいえ、違います CPUに値xを load メインメモリー  CPUレジス ター CPUに値yを load メインメモリー  CPUレジス ター CPU/add 計算結果はCPU レジスターへ CPUから値zへ store CPUレジスター  メインメモリー これがさっきの例 だと4回逐次処理 { mov(load): 1[CPI] × 2 + add: 1[CPI] + mov(store): 1[CPI] } × 4 = 16 [clocks/process]
  9. 9. SIMD命令だと? CPUに値 x[0,4)をまと めてload メインメモ リー CPUレ ジスター CPUに値 y[0,4)をま とめてload メインメモ リー  CPUレ ジスター CPU/addps 計算結果は CPUレジス ターへ CPUから値 z[0,4)へまとめ てstore CPUレジスター  メインメモ リー この手順を1回だけ で4つのデータの 足し算が終わる! { movd(load): 1[CPI] × 2 + addps: 3[CPI] + mov(store): 1[CPI] } = 6 [clocks/process]
  10. 10. つまりSIMDとは? • 「同じ処理」を連続したデータに対してN回逐次実行する代わりに • 「同じ処理」を連続したデータN件に対して一度にやっちゃって! • というCPU命令のこと 狭義ニハネ・w・
  11. 11. SIMD: Single Instruction Multiple Data • 「Single Instruction: 単一の命令で」 • 「Multiple Data: 複数のデータ」 • ひとよんでSIMD(しむど)と申す( ・`ω・´) 少しまじめに 解説しはじめる・w・
  12. 12. Flynn’s taxonomy: フリンの分類 SIMD MIMDMISD SISD • 「命令」vs.「データ」 • 「単一」vs.「複数」 • Michael J. Flynnが1966年に提唱 した計算機の命令とデータの4 つの単一・複合のアーキテク チャーパターン • SIMDはそのうちの1つ ややマジメな 解説・w・ http://arith.stanford.edu/~flynn/ Michael J. Flynn (1934~; Age 81)
  13. 13. 最近の”演算装置”をフリンの分類に当てはめると? SISD • PCのCPUの一般的な命令 • x86, x87 • ARMv6 SIMD • PCのCPUの特別なSIMD命令 • MMX, 3DNow! • SSEx • Smart DeviceのCPUの特別な SIMD命令 • Neon • PPCのベクター演算ユニット • Altivec MISD • ドーナツ屋 • (演算装置での実用的な実 装製品は無いらしい) MIMD • Super-computerのシステム 全体を見ればMIMDっぽい • Grid-computingのシステム もMIMDとも言えなくもな い Big-dataの Map&Reduceや 関数型言語って これっぽいよね・w・ GPUもSIMD だよ・w・
  14. 14. PCのCPUがSIMD命令を手に入れたのは何時? i386 12~40[MHz] • x86が32bit命令に拡張 • EAXなどのレジスターが汎用化 i486 25~100[MHz] • FPU(x87)を内蔵 • L1-cache 8KiB 内蔵 Pentium 60~300[MHz] •Super-scalar実装 (1.0[IPC]の突破) •MMX命令の対応 Pentium II 233~450MHz • P6- microarchtecture • 投機的実行, out- of-oder 1985 1989 1993 1997 このへんの話は Dora Panda さんの担当・w・ 1995 Prntium Pro 150~200[MHz] http://www.pc-9800.net/ With 98 NEC PC-9800シリーズ データバンクより カタログ画像を引用
  15. 15. Get the SIMD • 1993年 • i486の後継世代のCPUとして当時のPCのCPU戦国時代にintelが投入したCPU • その名を"Pentium"(ペンティアム) • 1996年 • Pentiumアーキテクチャーの第3世代バージョン"P55C"が実売開始される • MMX命令(PC向けCPUでは初となるSIMD命令)が搭載される 「アメリカからの独自 ルートで仕入れた」 AMD VIA 1996年12月当時のPC Watchの記事を いまでも読むことができる Cyrix http://pc.watch.impress.co.jp/docs/article/961220/mmx.htm
  16. 16. 1996年末、こうしてPCのCPUは SIMDを手に入れたのでした • 実際に一般市民が購入できた"パソコン"としては、 • NEC PC9821V200 が主(当時はパソコンショップ≈NECのPC98ショップ) • 実際にはPentium ProやMMX Pentium 233MHzの製品が市場に流通してからも 長いことPC9821V13が売れ続け、PCが10万円ちょっとで買える時代となった • 当時のMMX Pentium 200MHz搭載機はまだ20万円より高値、一部の今で言うマ ルチメディア系のクリエイターやゲーマーなどマニアックなユーザーにしか MMX命令搭載のCPUはまだ普及しなかった • そもそもMMX命令対応のソフトウェアなんて無いに等しかった • 少なくともCにインラインアセンブラー等で部分的であれMMX命令を直接機械語で コーディングできるプログラマーにしか実装できなかった(当時)
  17. 17. Appendix I CPUが200MHzの時代のMMXで実現できた事! フェードイン/ フェードアウト のリアルタイム処理 具体的には・・・ - 640×480[pixels]のRGB画像 - MMX: 60 [FPS] - 非MMX: 20 [FPS] そういう時代じゃった・w・
  18. 18. 参考 • http://hp.vector.co.jp/authors/VA014520/asmhsp/chap8.html • T.T Land / MASMによるHSP用プラグインの作り方 / 8.MMX命令による画像処理 • 実際にMMX命令が使用可能かチェック(この時点で機械語の取り扱いが必要)し、 • MMX命令でフェードイン/フェードアウトを機械語実装する例が紹介されています PART Iではチラッ と見るだけ~ PART Iでは触れないけれど… EMMS命令とかレジスターの x87との共有とかMMXにはネ…
  19. 19. ちなみに… 本当にSIMDが一般的にPCで使えるようになったのは? • Pentium II ・・・ ではなくて、現実には Pentium III くらいの時代か な? • Pentium IIIでMMX命令の弱点を克服しつつ、とってもパワーアップしたSSE命 令が追加されてからソフトウェアでの実用も増えました • intelの驚異的なライバルに成長していたAMDのCPUはPentium IIIのSSE命令よ りも先に似たような3DNow!命令を追加していたのだけど普及に失敗・・・ • 実はPentium4より後、PC向けのCPUが64-bitになってから? • AMDのAMD64命令セットにintelもItaniumを諦めてEM64Tと称し対応し、 x86_64という互換レベルのCPUを作り続けるようになってから • x86_64にはSSE, SSE2までが拡張ではなく基本命令セットとして取り込まれたた めにCPUに応じてサポートを気にする必要があまりなくなってから一般に普及 • 現在はSSE4, AVX, SSE5などの最新の拡張レベルでは相変わらず戦争中・・・ • でも、コンパイラーが賢く進化してくれているし、JITのSIMD対応まで始まっ ている時代だからね・w・
  20. 20. ともあれこうしてPCのCPUは・・・ • 1996年、MMX Pentium (P55C) で初のSIMD命令MMX • Pentium II にも MMX は継承 • Pentium III で MMX の弱点を克服しつつ強化された SSE が登場 • AMDも3DNow!を搭載してCPUのSIMD対応を牽引 • Pentium 4 で SSE を強化する SSE2 が登場 • Pentium 4 後期型からSIMD処理をさらに強化するSSE3が登場 • Core で SSE4.1 SSE4.2 AVX AVX2と現在に至るまでSIMD命令は強化され続ける • AMDもSSE5とか一応頑張ってマス・w・ SIMDを手に入れたのでした・w・
  21. 21. The SIMD #1 GET THE SIMD!
  22. 22. The SIMD #2 THE ANCIENT SYSTEM
  23. 23. PC向けCPUよりも 古い時代のSIMDの歴史 • 1975 • ILLIAC IV • イリノイ大学アーバナシャンペー ン校が最後に完成させた計算機 • 開発期間: 10年 • 計画性能: 1 [GFLOPS] • 13 [MHz] × 256 [#] 並列 • 実現性能: 100~150 [MFLOPS] • 世界初のSIMD型計算ハードウェア • 週40時間の保守が必要 • 1976年に登場したスーパースカラー 型のCray-1に追いやられる スーパースカラー? 呼んだ? http://ja.wikipedia.org/wiki/ILLIAC_IV CPU いっぱい シングルタスクの Super-computer みたいな・w・
  24. 24. ~198xまでのSuper-computerたち • SIMD vs. Super-scalar • ILLIAC IV (SIMD)亡き後はCray-1に 代表されるSuper-scalar型の設計の 計算機の時代が198xまで続く • 用語としての"ベクター演算"は SIMD型もSuper-scalar型も含むが、 事実上は長い間Super-scalar型の計 算機がベクター演算型の計算機と して人類に開発・実用された Super-scalar そろそろ しゃべっていい? http://ja.wikipedia.org/wiki/Cray-1
  25. 25. SIMD型の並列計算は・・・ • 実は199x年代になるまでSuper-computerでも使われないままでした • →200x年代になるとそうでもないのだけど、それはまたHPCのおはなし • 1996、PC向けCPUのMMX Pentiumの登場 呼んだ? 研究や議論はさておき、 実製品としてのSIMD型のハードウェア、 特にマイクロプロセッサーの命令として対応したのは 実はPCのCPUのMMX Pentiumから MMXも いまから20年も昔のはなし 十分に Ancient だね・w・
  26. 26. PCのCPU以外での SIMDの実装例はないの? • 身近な例、 • あります・w・
  27. 27. PPCアーキテクチャーのSIMD命令 • PPC: Power PC • IBM製のCPU(AIM連合による; AIM: Apple-IBM-Motrola) • RISC: Reduced Instruction Set Computer 型CPU • 古の Apple Macintosh に一時期採用(1994~2006) • 任天堂 Game Cube に採用(PPC Gecko; 2001) • 任天堂 Wii に採用(PPC BroadWay; 2006) • Microsoft XBOX360に採用(PX) Power Mac G5 SIMD命令 "Altivec/VMX"搭載
  28. 28. ARMアーキテクチャーのSIMD命令 • ARM • RISC型(ということになっている) • 省電力かつパワフルな組み込みデバイスはたいてい採用 • 多くのSmart Phone(~現在) • Raspberry Pi 2(2015~) • 任天堂3DS(2011~) SIMD命令 "Neon"搭載 NeonはARMv7仕様なので Raspberry Piは"2"から・w・ ほぼ現代だけど キニシナイ・w・
  29. 29. Cell Broadband Engine • Cell Broadband Engine; 通称Cell(セル) • SONY/IBM/東芝 製 • Playstation 3 • 説明略 • Roadrunner • U.S.A. エネルギー省のSuper-computer(2008~2013) • 一時 TOP500 で1位を維持 Roadrunner http://ja.wikipedia.org/wiki/Roadrunner "SPE: Synergistic Processor Element" 搭載
  30. 30. PC以外のx86系CPUの SIMD採用例 • Pentium III • Intel 製 • XBOX(Mobile Celeron 733MHz; 2001~) SIMD命令 "MMX"&"SSE" 搭載 そろそろ SIMD が どんなところで 必要とされているか 見えてきたカナ?・w・
  31. 31. GPU • GPU: Graphics Processing Unit • NVIDIA GeForce • ATI Radeon • GPUは何をしているの? • たくさんの頂点データ({x0,y0,z0}, {x1,y1,z1},…): Multiple Data を • 単一の射影変換処理(ある視点で見た座標→別の視点で見た座標): Single Instruction で • 変換処理して色を塗って絵として表示してくれるハードウェア 自分中心の座標 地球上の座標 地球上のとある場所のカメラから見た座標 GPUのお話は またあとでじっくり しましょう・w・
  32. 32. ちょっとまとめ・w・ • SIMD型のアーキテクチャーはどんなところで使われている? • 「マルチメディア」処理などエンドユーザーに密接なプロセッサーに採用 • 例: 画像処理…すべてのピクセル、数メガ個に同じ処理を適用したい! • RGBなら3[elements/pixel]なので 640×480 [pixels]でも 921,600 [#] も同じ処理の繰り返し! • フェードアウトやフェードインもこうした地味な計算の集合 • 影付けや、より高度なエフェクトの合成処理もこうして頑張って計算している • 例: 2Dのウィンドウの座標、3Dのゲームのキャラクターの頂点座標 一般PCやスマフォやゲーム機とか・w・ 近年のHPCの話は そのうちnakayoshixさんに でも聞きましょう・w・
  33. 33. The SIMD #2 THE ANCIENT SYSTEM
  34. 34. The SIMD #3 THE POWER
  35. 35. SIMDを使えると どれくらい嬉しいの? • PCのCPUのSIMDのはなしに戻ります • 現在の多くのCPUで一般に利用可能なSIMD命令として"SSE"を例に かんたんな計算処理のベンチマークをしてみましょう・w・ Wandboxでも試せるので みなさんご一緒に・w・
  36. 36. 実験の必要要件 • SSE命令を使えるCPUを使えること • 一般的な近年のPC、IntelやAMDの64bitなCPUなら使えます • よさ気なC++14対応な処理系 • Clang-3.6とかGCC-5.1とか • 計算機のメモリーや命令の基礎的な仕組みの知識 • 基礎的なプログラミングの知識 • 必要最小限のC++でSIMD命令を使う方法 (このあと本資料で解説)
  37. 37. 実験I: 原始的なSIMD命令のテストプログラム • SIMDを使わない版 • やっていること • floatの値を1024個分の枠を用意 • 数列 0.0, 1.0, 2.0, 3.0 … 1023.0 を設定 • initial_sumに実験処理前の和を保存 • 実験処理直前の時刻を保存 • 実験処理: すべての値を += 1.0f する • final_sumに実験処理後の和を保存 • 実験処理直後の時刻を保存 • 実験処理に要した時間を計算 • 表示
  38. 38. 実験I: 原始的なSIMD命令のテストプログラム • SIMDを使う版 • 使わない版からの変更点 • #include <xmmintrin.h> • __m128 型をXMMレジスターとか 名前付けて使ってる • forループが4つ毎に飛ばしてる • 足し算がload/add/storeに分解され てる Microsoftファンの方は ストリーミング SIMD 拡張子 (SSE) を見て改変してネ・w・ チョットダケチガウ vs. 使わない版 はよなった・w・
  39. 39. SIMDの使い方の基礎(SSE編) • intrinsicsという仕組みを使うよ • MMX  <mmintrin.h> • SSE  <xmmintrin.h> • SSE2  <emmintrin.h> • SSE3  <pmmintrin.h> • SSSE3  <tmmintrin.h> • SSE4.1  <smmintrin.h> • SSE4.2  <nmmintrin.h> • AVX/AVX2/FMA  <immintrin.h> • AVX-512  <zmmintrin.h> • SSEに代表されるIntel系のSIMD 命令は・・・ • intrinsicsでSIMDレジスターを変数 型として使える • XMM float×4  __mm128 • intrinsicsでおよそSIMDの機械語に 対応するCスタイルの関数として使 える • z = x + y  z = _mm_add_ps( x, y ) アセンブらなくても 使える時代・w・
  40. 40. ところで、 XMMレジスターとは?(1/2) レジスター ≈ CPUの中の計算用の記憶域 EAX EBX ECX EDX … • 前提知識 • CPUは主記憶で計算処理してナイ • load: COPY{ 主記憶  レジスター } • store: COPY{レジスター  主記憶 } • CPUが加算などの計算をする時の オペランドは基本的には「CPUレ ジスター」と呼ばれるCPU内部の 記憶域 • 汎用的に使えるレジスターは… • EAX, EBX … など名前の付いた32bitの 記憶域など ちなみに16bit枠はEAXのAX分 x86の進化の歴史が詰まってる ・w・
  41. 41. ところで、 XMMレジスターとは?(2/2) • 従来の一般用のx86レジスター (EAX等)は32bitの記憶域 • XMMはSSEの実装に伴いSSE命 令専用に追加された128bitの記 憶域群 • SSEではXMMレジスターの128bitの 記憶域を、4つのfloatを一括して取 り扱うための記憶域として使用 XMM1 XMM2 … EAX … EBX … ECX … EDX … 従来の32bit記憶域の4倍サイズ の記憶域を付け焼き刃・w・
  42. 42. ところで、 intrinsicsではload/add/storeしかできないの? • intrinsicsについては・・・ • intel Intrinsics Guide でSIMD拡張命 令セットや用途の分類に応じて簡 単な仕様を確認できる もちろん、いろいろ デキマス・w・
  43. 43. やりました! あとは自分で調べてSIMDマスターになれます!! • そんなに • 甘くないかも・w・
  44. 44. 本当にはよなった? • 速くはなってる • 何度か実行すると遅い時と速い時 があるのでは? • ところで、"loadu_ps"/"storeu_ps" の"u"はナンダロウネ・w・ vs. 使わない版 はよなった・w・ ちなみにpsはpacked-single、 「まとめられた-単精度値」 の意味だよ・w・
  45. 45. The SIMD #3 THE POWER
  46. 46. The SIMD #3 CONTROL THE SIMD
  47. 47. とある実行中のプロセスの メモリー配置状態 0x00123456 0x00123457 0x00123458 0x00123459 0x0012345A 0x0012345B 0.0f 1.0f … …… … 「中途半端」な 位置デスネ・w・
  48. 48. 「美しい」実行中のプロセスの メモリー配置状態 0x00123450 0x00123451 0x00123452 0x00123453 0x00123454 0x00123455 0.0f 1.0f … …… … 美しい・w・
  49. 49. loadu_psとload_psの違い: メモリーアライメント • load_ps • 16byte境界に整っている(=アライメ ント最適化されている)前提でメモ リーアクセス • アライメント最適化されていないと SEGV • loadu_ps • アライメント最適化されていなくて も読み出す • 内部ではデータが跨っているメモ リー領域をすべて読みだしてシャッ フルしてレジスターへ整えて入れて くれる • 当然遅い・w・ un-alignedの uだった・w・ 0x00123450 0x00123451 0x00123452 0x00123453 0x00123454 0x00123455 1発で読み出す前提 だから速い・w・ 外から見ると、 どこからでも自由に読み出せる store_ps/storeu_ps も同様・w・
  50. 50. でも、どうやって? 実行時のメモリーアライメントをプログラムするの? • C++11ならカンタン・w・ • 言語標準機能 alignas を使える • ちなみに昔は・・・ • 多めに確保してアドレスのアライ メントが合う位置から使いはじめ る工夫で対応可能 • placement new • 処理系依存の方法もあった • __attibute__((aligned(xxx))) • __declspec(align(xxx))zだけ16バイト境界へ アライメント されました・w・ これで u 版はもう 要らないネ・w・
  51. 51. やりました! あとは自分で調べてSIMDマスターになれます!! • そんなに • 甘くないかも・w・
  52. 52. SSEにもadd/sub/mul/div以外にもいろいろあるけど? SSE以外のSIMD命令は? • それはまた PART II で • 詳しくやろうか・w・ ともあれ、これで PCのSIMDの基礎は 大丈夫じゃ・w・
  53. 53. intrinsicsより簡単になりませんか・・・ スマフォ向けにARMのNeonに興味が・・・ • それらもまた PART II で • 詳しくやろうか・w・ i-saintさんがタイムリーな 関連記事を書いてくれていたので 気になる方はどうぞ・w・ introdunction to SIMD programming
  54. 54. The SIMD #4 CONTROL THE SIMD
  55. 55. The SIMD #5 THE PARALLEL AND THE CONCURRENCY
  56. 56. SIMDは"並列" 並列処理と並行処理の違い、大丈夫ですか? • ちなみに、 • SIMDは"並列"処理・w・
  57. 57. SIMDは"並列" 並列処理と並行処理の違い、大丈夫ですか? COOKPADニュース プロ御用達!長ねぎのみじん切りを動画でマスター! http://cookpad.com/articles/5385 • あくまでも逐次処理 • これはSISD・w・
  58. 58. SIMDは"並列" 並列処理と並行処理の違い、大丈夫ですか? Yahoo!ブログ カワラヌマイニチ・・・ 白髪ネギカッター!!! http://blogs.yahoo.co.jp/backblackhead/36252328.html • 同じ処理を • 複数のアドレスへ適用 • これはSIMDで • 並列処理・w・
  59. 59. SIMDは"並列" 並列処理と並行処理の違い、大丈夫ですか? TOKYO GAS 最適厨房/厨房談義 第9回 進化するミクニの厨房「厨房というフレームにとらわれない独自の厨房観」 http://eee.tokyo-gas.co.jp/saitekichubo/information/dangi09/01.html • (同一処理も含め) • 複数の処理を • 複数のワーカープロセス で並行処理 • MIMD・w・
  60. 60. 蛇足: パイプライン型の並行処理(見様によっては並列処理) ホテルブリランテ武蔵野スタッフブログ2012年2月 2/22~の今週のランチ(フレンチ調理場より) http://www.hotel-brillante.com/blog/2012/02/ ちなみにこれが パイプライン型の 並行処理 単機能の専門の ワーカープロセスが 同時並行で複数の処理を 流れ作業で実行
  61. 61. 並列処理と並行処理と SIMDの位置付け 並行処理 • MIMD 並列処理 • SIMD 複数種類の仕事を 同時に手分けして実行 1つ種類の複数の仕事を 同時に手分けして実行 実は包含関係・w・
  62. 62. The SIMD #5 THE PARALLEL AND THE CONCURRENCY
  63. 63. The SIMD #6 THE TWO LAWS OR CURSES
  64. 64. 計算機の進化と 並列化・並行化の法則 • ムーアの法則 • 𝑝 = 2 𝑛/1.5 • p: 集積回路上のトランジスター数の 倍率[-] • n: 現時点からの経過年数[years] • 『1年半でトランジスターの集積度 は2倍になる』 ムーアの法則(カーツワイルの収穫加速の法則) 面で実装されるデバイスの 集積度のはなし・w・
  65. 65. 計算機の進化と 並列化・並行化の法則 • アムダールの法則 • システム全体を並列化できるわけ ではない • システム全体の並列化による高速 化の限界は並列化できない処理に 依存する • ポラックの法則 • intelの経験則 • 『CPUの性能向上は、ダイサイズ の増加の平方根分にしかならい』 • ムーアの法則の1年半後の集積度は2 倍になるが、実効性能は 𝟐倍にし かならない ならばマルチコアだ! 参考: PC WATCH 後藤弘茂のWeekly海外ニュース 2004年11月 ポラックの法則を破るためのマルチコア SIMDの高度化も並行処理 志向の進化の一旦
  66. 66. SIMDのはなしで大切なこと • 局所の最適化にかかるコストは • 全体のパフォーマンスアップに有意か? • intrinsicsでSIMD最適化するということは • コードの可読性は明らかに落ちるが保守性・生産性の低下によるデメリットは 高速化の恩恵に対して大きすぎないか? • コードの可読性が落ちるという事は同等の保守性を保つには相応のドキュメンテー ションコストも必要 • エンジニアの魂は判断材料にはしない(実際やる時には必要) • 複雑な仕様楽しい・w・ • 機械語楽しい・w・
  67. 67. それでもSIMD最適化 したい時がアル・w・
  68. 68. The SIMD #6 THE TWO LAWS OR CURSES
  69. 69. The SIMD #... THE NEW … TO THE PRESENT …
  70. 70. 次回 PART II 予告編 • 具体的なSIMD命令セットごとの特徴と扱い方の紹介 • x86_64: MMX/SSE/SSE2/SSE3/SSSE3/SSE4.1/SSE4.2/AVX/FMA • ARMv7: Neon • SIMD最適化と現実の構造体 • 色: RGB … 3要素 • 3D座標: XYZ … 3要素 • "Array of Structure"と"Structures of Array" • より手軽でクロスプラットフォームなSIMD最適化 • Intel SPMD Program Compiler • おまけネタ • simd.js • ES7とSIMD ここまでできたら今度こそ SIMDマスター? ・w・
  71. 71. Appendix II: ところで、SIMDって「しむど」なの? 『しむどでいいですよ』
  72. 72. Appendix II: ところで、 SIMDって「しむど」なの? 『しむどでいいですよ』 "seem-dee"
  73. 73. The SIMD PART Ⅰ 次回もよろしくね・w・

×