73
The SIMD BY USAGI ITO

The simd

Embed Size (px)

Citation preview

Page 1: The simd

The SIMDBY USAGI ITO

Page 2: The simd

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・

Page 3: The simd

… 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

Page 4: The simd

この資料に含まれる画像等について• 画像について• この資料に含まれる写真は原則として Wikimedia Commons に収録された画

像を用いています• https://commons.wikimedia.org/wiki/Main_Page

• 他に特別なソースを用いる場合には都度、付近に出典を明示しています

Page 5: The simd

The SIMDPART Ⅰ

今回終わらなかったところから PART

II全部終わったら

PART II は現代編へ

Page 6: The simd

The SIMD #1

GET THE SIMD!

Page 7: 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 z[1]=x[1]+y[1]

I1 z[2]=x[2]+y[2]

I1 z[3]=x[3]+y[3]

通常の命令による逐次処理 SIMD 命令による並列処理

処理時間 : 命令 4 回分 処理時間 : 命令 1 回分

あくまでもイメージ デス

Page 8: The simd

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]

Page 9: The simd

SIMD 命令だと?

CPU に値x[0,4) をまとめて load

メインメモリー CPU

レジスター

CPU に値y[0,4) をまとめて load

メインメモリー CPU

レジスター

CPU/addps

計算結果はCPU レジス

ターへ

CPU から値z[0,4) へまとめ

て storeCPU レジスター

メインメモリー

この手順を 1回だけで 4 つのデータの足し算が終わる!

{ movd(load): 1[CPI] × 2 + addps: 3[CPI] + mov(store): 1[CPI] } = 6 [clocks/process]

Page 10: The simd

つまり SIMD とは?• 「同じ処理」を連続したデータに対して N回逐次実行する代わりに• 「同じ処理」を連続したデータ N件に対して一度にやっちゃって!• という CPU 命令のこと

狭義ニハネ・w・

Page 11: The simd

SIMD: Single Instruction Multiple Data

• 「 Single Instruction: 単一の命令で」• 「 Multiple Data: 複数のデータ」• ひとよんで SIMD (しむど)と申す ( ・ `ω ・ ´)

少しまじめに解説しはじめる・w・

Page 12: The simd

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)

Page 13: The simd

最近の”演算装置”をフリンの分類に当てはめると?

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・

Page 14: The simd

PC の CPU が SIMD 命令を手に入れたのは何時?

i38612~40[MHz]

• x86 が 32bit 命令に拡張• EAX などのレジスターが汎用化

i48625~100[MHz]

• FPU(x87) を内蔵• L1-cache 8KiB 内蔵

Pentium 60~300[MHz]

•Super-scalar 実装 (1.0[IPC] の突破 )

•MMX命令の対応

Pentium II233~450MHz

• P6-microarchtecture

• 投機的実行 , out-of-oder

1985

1989

1993

1997

このへんの話は Dora Panda

さんの担当・w・

1995

Prntium Pro150~200[M

Hz]

http://www.pc-9800.net/

With 98 NEC PC-9800 シリーズ データバンクよりカタログ画像を引用

Page 15: The simd

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

Page 16: The simd

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 命令を直接機械語

でコーディングできるプログラマーにしか実装できなかった(当時)

Page 17: The simd

Appendix ICPU が 200MHz の時代の MMX で実現できた事!

フェードイン /フェードアウト

のリアルタイム処理

具体的には・・・

- 640×480[pixels] の RGB 画像 - MMX: 60 [FPS] - 非MMX: 20 [FPS]

そういう時代じゃった・w・

Page 18: The simd

参考• 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 には

ネ…

Page 19: The simd

ちなみに…本当に 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・

Page 20: The simd

ともあれこうして 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・

Page 21: The simd

The SIMD #1

GET THE SIMD!

FIN

Page 22: The simd

The SIMD #2

THE ANCIENT SYSTEM

Page 23: The simd

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・

Page 24: The simd

~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

Page 25: The simd

SIMD 型の並列計算は・・・• 実は 199x 年代になるまで Super-computer でも使われないまま

でした• →200x 年代になるとそうでもないのだけど、それはまた HPC のおはなし

• 1996 、 PC向け CPU の MMX Pentium の登場呼んだ?

研究や議論はさておき、実製品としての SIMD 型のハードウェア、特にマイクロプロセッサーの命令として対応したのは実は PC の CPU の MMX Pentium から

MMX もいまから 20 年も昔のはなし十分に Ancient だね・w・

Page 26: The simd

PC の CPU以外でのSIMD の実装例はないの?

• 身近な例、• あります・w・

Page 27: The simd

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" 搭載

Page 28: The simd

ARM アーキテクチャーの SIMD 命令• ARM• RISC 型(ということになっている)• 省電力かつパワフルな組み込みデバイスはたいてい採用• 多くの Smart Phone ( ~ 現在)• Raspberry Pi 2 ( 2015~ )• 任天堂 3DS ( 2011~ )

SIMD 命令"Neon" 搭載

Neon は ARMv7 仕様なので

Raspberry Pi は "2" から・w・

ほぼ現代だけどキニシナイ・w・

Page 29: The simd

Cell Broadband Engine

• Cell Broadband Engine; 通称 Cell (セル)• SONY/IBM/東芝 製

• Playstation 3• 説明略

• Roadrunner• U.S.A. エネルギー省の Super-computer ( 2008~2013 )• 一時 TOP500 で 1位を維持

Roadrunnerhttp://ja.wikipedia.org/wiki/Roadrunner

"SPE: Synergistic Processor Element"搭載

Page 30: The simd

PC以外の x86 系 CPU のSIMD採用例• Pentium III• Intel 製

• XBOX ( Mobile Celeron 733MHz; 2001~ )

SIMD 命令"MMX"&"SSE"搭載

そろそろ SIMD がどんなところで必要とされているか

見えてきたカナ?・w・

Page 31: The simd

GPU

• GPU: Graphics Processing Unit• NVIDIA GeForce• ATI Radeon

• GPU は何をしているの?• たくさんの頂点データ ({x0,y0,z0}, {x1,y1,z1},…): Multiple Data を• 単一の射影変換処理(ある視点で見た座標→別の視点で見た座標) : Single

Instruction で• 変換処理して色を塗って絵として表示してくれるハードウェア

自分中心の座標 地球上の座標 地球上のとある場所のカメラから見た座標

GPU のお話はまたあとでじっくり

しましょう・w・

Page 32: The simd

ちょっとまとめ・w・• SIMD 型のアーキテクチャーはどんなところで使われている?

• 「マルチメディア」処理などエンドユーザーに密接なプロセッサーに採用• 例 : 画像処理…すべてのピクセル、数メガ個に同じ処理を適用したい!• RGB なら 3[elements/pixel] なので 640×480 [pixels] でも 921,600 [#] も同じ処理の繰り返し!• フェードアウトやフェードインもこうした地味な計算の集合• 影付けや、より高度なエフェクトの合成処理もこうして頑張って計算している

• 例 : 2D のウィンドウの座標、 3D のゲームのキャラクターの頂点座標

一般 PC やスマフォやゲーム機とか・w・

近年の HPC の話はそのうち nakayoshix さ

んにでも聞きましょう・w・

Page 33: The simd

The SIMD #2

THE ANCIENT SYSTEM

FIN

Page 34: The simd

The SIMD #3

THE POWER

Page 35: The simd

SIMD を使えるとどれくらい嬉しいの?• PC の CPU の SIMD のはなしに戻ります• 現在の多くの CPU で一般に利用可能な SIMD 命令として "SSE" を

例にかんたんな計算処理のベンチマークをしてみましょう・w・

Wandbox でも試せるのでみなさんご一緒に・w・

Page 36: The simd

実験の必要要件• SSE 命令を使える CPU を使えること• 一般的な近年の PC 、 Intel や AMD の 64bit な CPU なら使えます

• よさ気な C++14 対応な処理系• Clang-3.6 とか GCC-5.1 とか

• 計算機のメモリーや命令の基礎的な仕組みの知識• 基礎的なプログラミングの知識• 必要最小限の C++ で SIMD 命令を使う方法

(このあと本資料で解説)

Page 37: The simd

実験 I:原始的な SIMD 命令のテストプログラム

• SIMD を使わない版• やっていること• float の値を 1024個分の枠を用意• 数列 0.0, 1.0, 2.0, 3.0 … 1023.0

を設定• initial_sum に実験処理前の和を保存• 実験処理直前の時刻を保存• 実験処理 : すべての値を += 1.0f す

る• final_sum に実験処理後の和を保存• 実験処理直後の時刻を保存• 実験処理に要した時間を計算• 表示

Page 38: The simd

実験 I:原始的な SIMD 命令のテストプログラム

• SIMD を使う版• 使わない版からの変更点• #include <xmmintrin.h>• __m128 型を XMM レジスターと

か名前付けて使ってる• for ループが 4 つ毎に飛ばしてる• 足し算が load/add/store に分解さ

れてる

Microsoft ファンの方はストリーミング SIMD 拡張子 (SSE)

を見て改変してネ・w・チョットダケチガウ

vs.使わない版

はよなった・w・

Page 39: The simd

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・

Page 40: The simd

ところで、XMM レジスターとは?( 1/2 )

レジスター≈

CPU の中の計算用の記憶域

EAX

EBX

ECX

EDX …

• 前提知識• CPU は主記憶で計算処理してナイ• load: COPY{ 主記憶 レジス

ター }• store: COPY{ レジスター 主記憶 }

• CPU が加算などの計算をする時のオペランドは基本的には「 CPU レジスター」と呼ばれる CPU 内部の記憶域• 汎用的に使えるレジスターは…• EAX, EBX … など名前の付いた

32bit の記憶域などちなみに 16bit枠は EAX のAX 分

x86 の進化の歴史が詰まってる・w・

Page 41: The simd

ところで、XMM レジスターとは?( 2/2 )

• 従来の一般用の x86 レジスター( EAX 等)は 32bit の記憶域

• XMM は SSE の実装に伴いSSE 命令専用に追加された128bit の記憶域群• SSE では XMM レジスターの

128bit の記憶域を、 4つの floatを一括して取り扱うための記憶域として使用

XMM1

XMM2

…EAX

EBX

ECX

EDX

… 従来の 32bit 記憶域の 4倍サイズの記憶域を付け焼き刃・w・

Page 42: The simd

ところで、intrinsics では load/add/store しかできないの?

• intrinsics については・・・• intel Intrinsics Guide で SIMD

拡張命令セットや用途の分類に応じて簡単な仕様を確認できる

もちろん、いろいろデキマス・w・

Page 43: The simd

やりました!あとは自分で調べて SIMD マスターになれます!!

• そんなに• 甘くないかも・w・

Page 44: The simd

本当にはよなった?• 速くはなってる• 何度か実行すると遅い時と速い時

があるのでは?• ところ

で、 "loadu_ps"/"storeu_ps" の "u" はナンダロウネ・w・

vs.使わない版

はよなった・w・

ちなみに ps は packed-single 、

「まとめられた - 単精度値」の意味だよ・w・

Page 45: The simd

The SIMD #3

THE POWER

FIN

Page 46: The simd

The SIMD #3

CONTROL THE SIMD

Page 47: The simd

とある実行中のプロセスのメモリー配置状態

0x00123456

0x00123457

0x00123458

0x00123459

0x0012345A

0x0012345B

0.0f 1.0f …

……

「中途半端」な位置デスネ・w・

Page 48: The simd

「美しい」実行中のプロセスのメモリー配置状態

0x00123450

0x00123451

0x00123452

0x00123453

0x00123454

0x00123455

0.0f 1.0f …

……

美しい・w・

Page 49: The simd

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・

Page 50: The simd

でも、どうやって?実行時のメモリーアライメントをプログラムするの?

• C++11 ならカンタン・w・• 言語標準機能 alignas を使える

• ちなみに昔は・・・• 多めに確保してアドレスのアライ

メントが合う位置から使いはじめる工夫で対応可能• placement new

• 処理系依存の方法もあった• __attibute__((aligned(xxx)))

• __declspec(align(xxx))z だけ 16 バイト境界

へアライメント

されました・w・ これで u 版はもう要らないネ・w・

Page 51: The simd

やりました!あとは自分で調べて SIMD マスターになれます!!

• そんなに• 甘くないかも・w・

Page 52: The simd

SSE にも add/sub/mul/div以外にもいろいろあるけど?SSE以外の SIMD 命令は?

• それはまた PART II で• 詳しくやろうか・w・

ともあれ、これでPC の SIMD の基礎

は大丈夫じゃ・w・

Page 53: The simd

intrinsics より簡単になりませんか・・・スマフォ向けに ARM の Neon に興味が・・・

• それらもまた PART II で• 詳しくやろうか・w・

i-saint さんがタイムリーな関連記事を書いてくれていたので

気になる方はどうぞ・w・introdunction to SIMD programming

Page 54: The simd

The SIMD #4

CONTROL THE SIMD

FIN

Page 55: The simd

The SIMD #5

THE PARALLEL AND THE CONCURRENCY

Page 56: The simd

SIMD は " 並列 "並列処理と並行処理の違い、大丈夫ですか?

• ちなみに、• SIMD は " 並列 " 処理・w・

Page 57: The simd

SIMD は " 並列 "並列処理と並行処理の違い、大丈夫ですか?

COOKPAD ニュースプロ御用達!長ねぎのみじん切りを動画でマスター!http://cookpad.com/articles/5385

• あくまでも逐次処理• これは SISD ・w・

Page 58: The simd

SIMD は " 並列 "並列処理と並行処理の違い、大丈夫ですか?

Yahoo!ブログ カワラヌマイニチ・・・白髪ネギカッター!!!http://blogs.yahoo.co.jp/backblackhead/36252328.html

• 同じ処理を• 複数のアドレスへ適用• これは SIMD で• 並列処理・w・

Page 59: The simd

SIMD は " 並列 "並列処理と並行処理の違い、大丈夫ですか?

TOKYO GAS 最適厨房 /厨房談義 第 9 回進化するミクニの厨房「厨房というフレームにとらわれない独自の厨房観」http://eee.tokyo-gas.co.jp/saitekichubo/information/dangi09/01.html

• (同一処理も含め)• 複数の処理を

• 複数のワーカープロセスで並行処理

• MIMD ・w・

Page 60: The simd

蛇足 :パイプライン型の並行処理(見様によっては並列処理)

ホテルブリランテ武蔵野スタッフブログ 2012 年 2 月2/22~の今週のランチ(フレンチ調理場より)http://www.hotel-brillante.com/blog/2012/02/

ちなみにこれが

パイプライン型の

並行処理

単機能の専門の

ワーカープロセスが

同時並行で複数の処理を

流れ作業で実行

Page 61: The simd

並列処理と並行処理とSIMD の位置付け

並行処理• MIMD

並列処理• SIMD

複数種類の仕事を

同時に手分けして実行

1 つ種類の複数の仕事を

同時に手分けして実行

実は包含関係・w・

Page 62: The simd

The SIMD #5

THE PARALLEL AND THE CONCURRENCY

FIN

Page 63: The simd

The SIMD #6

THE TWO LAWS OR CURSES

Page 64: The simd

計算機の進化と並列化・並行化の法則

• ムーアの法則

• p: 集積回路上のトランジスター数の倍率 [-]

• n: 現時点からの経過年数 [years]

• 『 1 年半でトランジスターの集積度は 2倍になる』

ムーアの法則(カーツワイルの収穫加速の法則)

面で実装されるデバイスの集積度のはなし・w・

Page 65: The simd

計算機の進化と並列化・並行化の法則

• アムダールの法則• システム全体を並列化できるわけ

ではない• システム全体の並列化による高速化の限界は並列化できない処理に依存する

• ポラックの法則• intel の経験則• 『 CPUの性能向上は、ダイサイズの増加の平方根分にしかならい』

• ムーアの法則の 1年半後の集積度は 2倍になるが、実効性能はにしかならない

ならばマルチコアだ!参考: PC WATCH 後藤弘茂のWeekly海外ニュース 2004年11月

ポラックの法則を破るためのマルチコア

SIMD の高度化も並行処理志向の進化の一旦

Page 66: The simd

SIMD のはなしで大切なこと• 局所の最適化にかかるコストは• 全体のパフォーマンスアップに有意か?

• intrinsics で SIMD 最適化するということは• コードの可読性は明らかに落ちるが保守性・生産性の低下によるデメリットは高速化の恩恵に対して大きすぎないか?• コードの可読性が落ちるという事は同等の保守性を保つには相応のドキュメンテー

ションコストも必要

• エンジニアの魂は判断材料にはしない(実際やる時には必要)• 複雑な仕様楽しい・w・• 機械語楽しい・w・

Page 67: The simd

それでも SIMD 最適化したい時がアル・w・

Page 68: The simd

The SIMD #6

THE TWO LAWS OR CURSES

FIN

Page 69: The simd

The SIMD #...

THE NEW … TO THE PRESENT …

Page 70: The simd

次回 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・

Page 71: The simd

Appendix II:ところで、 SIMD って「しむど」なの?

『しむどでいいですよ』

Page 73: The simd

The SIMDPART Ⅰ

FIN

次回もよろしくね・w・