同時実行 sample

53
ハードウェアによる並列処理 CPU アーキテクチャ入門 ( その 3) Dora.Panda Nov 27th, 2015

Upload: shinichiro-niiyama

Post on 18-Jul-2015

408 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: 同時実行 Sample

ハードウェアによる並列処理 CPUアーキテクチャ入門(その3)

Dora.Panda Nov 27th, 2015

Page 2: 同時実行 Sample

今日のお題

• ハードウェアによる並列処理(同時実行)のお話です。

• 以下の3つについて説明します。

• スーパースカラー

• マルチプロセッサー

• ハードウェアスレッディング

Page 3: 同時実行 Sample

本題に入る前に事前知識の確認

Page 4: 同時実行 Sample

レジスタ・キャッシュ・RAM• レジスタ

• CPU内部のメモリ領域

• 数個~数十個程度

• 動作速度はCPUと同速度

• CPUはレジスタ内のデータのみ制御/計算可能

• キャッシュ

• CPUと直結したメモリ領域

• 数k~数MBytes

• 動作速度はCPUと同速度~数十分の一

• RAM • CPU外部のメモリ領域

• ~xxGBytes

• 動作速度はCPUの百分の一程度

CPU

DRAM HDD

演算回路

レジスタレジスタ

キャッシュ

Page 5: 同時実行 Sample

パイプライン• CPUの命令実行部分を機能的に分割したもの

• IF:命令フェッチ

• RF:命令デコード

• EX:命令実行

• MEM:保存先計算

• WR:保存(メモリ/レジスタ)

IF RF EX ME WR

IF RF EX M WIF RF EX M W

IF RF EX M WIF RF EX M W

IF RF EX M W

命令1命令2命令3命令4命令5

この順で命令を実行 5クロックで1命令を実行

同時に5命令を実行可能 毎1クロック毎に1命令実行完了

時間

Page 6: 同時実行 Sample

前回までのおさらい

• パイプラインの現実

• パイプラインとキャッシュにより、理論上は最速で1クロックあたり1命令実行。=1.0[IPC]

• IPC = Instruction Per Clock

• どんなに工夫してもIPCは1.0の壁を超えることは不可能。

Page 7: 同時実行 Sample

IPCを1.0以上にする解決策は?

• 実行回路を複数用意すべし

• スーパスカラー

• マルチコア

• ハードウェアスレッディング

Page 8: 同時実行 Sample

スーパースカラー実行ユニット並列化

Page 9: 同時実行 Sample

スーパスカラーの概念

• CPUコア内部にパイプラインを複数用意

• 命令を同時実行することで高速化

• ソフトウェアからは並列実行数不明

IF RF EX ME WR

パイプライン1段

パイプライン2段IF RF EX ME WR

IF RF EX ME WR

RAM(Cache)Register

RAM(Cache)Register

Page 10: 同時実行 Sample

スーパースカラーの実際1

Inst Decoder

RF EX ME WR

Inst Cache Inst Decoder

Inst QueueInst Inst Inst Inst

RF EX ME WR

Data CacheRegisterRegister

• スーパスカラーの実際のパイプライン • 複数命令を同時に読み出してデコード • 複数命令をキューに入れる • 依存性が無い命令を同時実行

全部が複数あるわけではない

Page 11: 同時実行 Sample

スーパースカラーの実際2• EXは対称ではない

• SandyBridgeは演算が3way、メモリ制御が3way • 同時実行する可能性が高い回路のみ複数実装

引用元:http://pc.watch.impress.co.jp/docs/column/kaigai/20130602_601851.html

Page 12: 同時実行 Sample

並列度向上策• インオーダとアウトオブオーダ実行

• インオーダ(順序通り)

• 互いに関連していない命令だけをプログラムの順序通りに実行

• アウトオブオーダ(順序外)

• 互いに関連していない命令をプログラムの順序が変わっても良いから実行

• インオーダで実行を開始して、アウトオブオーダで終わることもある(命令によって実行クロック数が違う)

実装はCPUによって異なります

Page 13: 同時実行 Sample

複数実行ユニットの問題• データハザードが発生する例

1: ADD R3 <- R1, R2 2: SUB R5 <- R3, R4

RF EX ME WR

RF EX ME WR

R1 R2 R3 R4 R5

時間

ADD R3 <- R1, R2

SUB R5 <- R3, R4

1行目を実行

Page 14: 同時実行 Sample

複数実行ユニットの問題• データハザードが発生する例

ADD R3 <- R1, R2 SUB R5 <- R3, R4

RF EX ME WR

RF EX ME WR

R1 R2 R3 R4 R5

時間

ADD R3 <- R1, R2

SUB R5 <- R3, R4

2行目を実行

Page 15: 同時実行 Sample

複数実行ユニットの問題• データハザードが発生する例

1: ADD R3 <- R1, R2 2: SUB R5 <- R3, R4

RF EX ME WR

RF EX ME WR

R1 R2 R3 R4 R5

時間

ADD R3 <- R1, R2

SUB R5 <- R3, R4

同時に実行

先行命令の結果待ち Read After Writeハザード

Page 16: 同時実行 Sample

データハザードの種類• RAR(Read after Read)

• ハザードではない。

• RAW(Read after Write)

• 先行命令のWriteを待たないと後続命令がReadできない。

• WAR(Write after Read)

• WAW(Write after Write)

• 先行命令の実行時間が長いとハザード。

先行/後続 READ WRITE

READ - WARWRITE RAW WAW

IF RF EX ME WR

IF RF EX ME WR

Reg

IF RF EX

IF RF EX ME WR

Reg

EX ME WR

IF RF EX ME WR

IF RF EX ME WR

Reg

EX EX EX

RAW

WAR

WAW

Page 17: 同時実行 Sample

真の依存と偽の依存• 真の依存

• 回避不可能なハザード。

• 結果が必要なRAW。

• 偽の依存

• 使用するレジスタを変更すると解決可能なハザード。

• WARやWAWはレジスタを実行時に置き換えて解決。

Page 18: 同時実行 Sample

レジスタリネーミング• 偽の依存関係を解決する

• レジスタが共通であるために発生するハザード。

• 論理レジスタを物理レジスタに置き換えて実行。

• 論理レジスタ

• プログラムが使用するレジスタ

• 物理レジスタ

• CPU内部の実行用レジスタ R1 P1 P2

R3 <- R3 / R5 R4 <- R3 / 6 R3 <- R5 + 1 …

P1 <- R3 / R5 P2 <- P1 / 6 P3 <- R5 + 1 …

WAW

WAR

Page 19: 同時実行 Sample

論理レジスタと物理レジスタ

引用元:http://www.itmedia.co.jp/enterprise/articles/0506/29/news002.html     http://pc.watch.impress.co.jp/docs/column/kaigai/20130602_601851.html

論理レジスタ = 16個 物理レジスタ =160個

Page 20: 同時実行 Sample

マルチコア複数CPUによる同時実行

Page 21: 同時実行 Sample

マルチコアにする目的

• CPUを複数用意する目的

• 処理の高速化

• スレッドやプロセスを同時実行

• 消費電力を抑える

• 消費電力を押さえつつ高速化

汎用PCで一般的な対象マルチプロセッサ(SMP)について説明します

Page 22: 同時実行 Sample

ソフトウェアから見た問題

• 同期

• 同一のリソース(メモリ領域)に対するアトミックなアクセス

• キャッシュコヒーレンシ

• それぞれのコアがキャッシュを持つため、一貫性を保つ仕組みが必要

Page 23: 同時実行 Sample

同期の問題

• セマフォ等、フラグ状態による排他制御が必須

• シングルプロセッサでは割り込み禁止で実現できる。

• マルチコアはHW支援必須。

• 共有フラグにアクセスするときにHWがLock制御

flag = 0:アクセス可能 flag = 1:アクセス不可

CPU1 CPU2

Memory

Shared Data Flag

Page 24: 同時実行 Sample

同期問題の解決

• Lock信号を用意

• アトミック命令実行時にLock信号をアサート(有効化)する。

• L1キャッシュにアクセスするときはアサートしない。(コヒーレンシ制御で解決)

CPU1 CPU2

Memory

Shared Data Flag

Lock

Page 25: 同時実行 Sample

キャッシュコヒーレンシの問題

• 同じ領域を複数のコアがキャッシュしている

• 一方のコアがデータをライトすると不整合が発生する。

• リードは問題無い。

• キャッシュコヒーレンシプロトコルにより不整合状態を解決する

CPU1

Memory

Shared Data

L1 cache

Shared Data

L1 cache

Shared Data

CPU2

Page 26: 同時実行 Sample

コヒーレンシプロトコル• MESI/MOESIプロトコル

• M:Modified • 自分だけがキャッシュ+DRAMと不一致

• O:Owned • 他CPUと同内容をキャッシュ+

DRAMと不一致 • E:Exclusive

• 自分のみがキャッシュ • S:Shared

• 他CPUと同内容をキャッシュ+DRAMと一致

• I:Invalid • 無効(キャッシュしていない)

MO

E S

I

Page 27: 同時実行 Sample

MOESIの例1

• キャッシュが空の状態からデータをリード

• Invalid -> Exclusive

MO

E S

I

CPU1 CPU2

I -> E I

Data

Data

Page 28: 同時実行 Sample

MOESIの例2

• CPU1がSharedのデータを書き換え

• CPU1 : Modified

• CPU2 : Invalid

CPU1 CPU2

S -> M S -> I

Data

MO

E S

I

Page 29: 同時実行 Sample

MOESIの例3

• CPU2がModifiedのデータをリード

• CPU1 : Modified -> Owned

• CPU2 : Invalid -> Owned

MO

E S

I

CPU1 CPU2

M -> O I -> O

Data

Page 30: 同時実行 Sample

消費電力

• 単純にコア数を増やすと消費電力も増える。

• コア数を増やしつつ消費電力を維持したい。

Page 31: 同時実行 Sample

CPUの消費電力

• トランジスタ間の負荷容量(コンデンサ)の充放電

• 配線やトランジスタ入力に存在する負荷成分

• 漏れ電流

• 様々な要因により意図しない電流が流れる。

充放電に着目して考えます

+V

GND

回路 回路

+V

GND

回路 回路

Page 32: 同時実行 Sample

スイッチングによる消費

• トランジスタがOn/Offを繰り返すとき、コンデンサの放電/充電が行われる。

• On/Off=CPUのクロックに合わせて行われる。

• クロックが速ければ単位時間あたりの充放電が多い。

• =消費電力が大きい。

消費電力はクロック周波数に比例

+V

GND

回路 回路

+V

充電

+V

放電

Page 33: 同時実行 Sample

消費電力と電圧の関係• クロックを遅くすることで負荷容量による消費電力を低減できる。

クロックを遅くすると電源電圧を下げられる。

電圧を下げるとコンデンサに蓄えられる電荷が減る。

負荷容量で消費される電力は電圧の2乗に比例する。

Page 34: 同時実行 Sample

クロックの速さと電圧• 電圧を高くすると立ち上がりが速くなる。

• 電圧を低くすると立ち上がりが遅くなる。

• クロックを遅くするなら電圧を低くしても良い。

0.00[V]

0.75[V]

1.50[V]

2.25[V]

3.00[V]

閾値電圧

同一電圧でクロックを速く

クロック信号として 成り立たなくなる

同一クロックで電圧を高く

奇麗なクロック信号になる

Page 35: 同時実行 Sample

消費電力概算• 消費電力と周波数、電圧の関係

• 周波数に比例し電圧の二乗に比例

• 周波数を2割下げ、電圧も2割下げる。

• 0.8 x 0.8 x 0.8 = 0.512

• 約半分の消費電力になる。

• クロックを2割下げてコアを2つにすると、ほぼ同じ消費電力で性能が1.6倍になる。

以下のサイトの情報を私なりに解釈した結果です。 http://news.mynavi.jp/column/architecture/001/

Page 36: 同時実行 Sample

実際の例• Core i7 Extremeの例

• コア数比:6 ÷ 4 = 1.5

• 周波数比:3.2 ÷ 3.6 = 0.889

• 電圧比 :0.889(仮)

• 3820を130[W]とした場合の3930KのTDPを計算

• 130 × 1.5 × 0.889 × 0.889 × 0.889 = 137[W]

http://ja.wikipedia.org/wiki/Intel_Core_i7#Core_i7_Extreme

CORE CLOCK [GHZ] TDP[W]

3930K 6 3.2 130

3820 4 3.6 130

なんとなくそれっぽい値。 実際には様々な要因があり、単純計算はできないようです。

Page 37: 同時実行 Sample

マルチコアのスケジューリング• Linuxの場合

• CPU毎に実行キューを用意する

• スレッドがCPUに割り当てられたあとは基本的にはそのCPUで実行し続ける。

• CPUを切り替えるとキャッシュ等リソースの入れ替えが発生。

Run Queue

Task

Low <- Priority -> High

TaskTaskTask CPU 0

Run Queue

Task

Low <- Priority -> High

Task CPU 1

CPU n

Run Queue

Task

Low <- Priority -> High

TaskTask

Page 38: 同時実行 Sample

ハードウェア スレッディング

スーパスカラーの効率化

Page 39: 同時実行 Sample

スーパスカラーとマルチコア の問題

• 複数のパイプラインが有効活用されない

• 命令の依存性が高く同時実行が難しい

• 回路規模が大きくなる

• ハードウェアのコスト上昇

• 消費電力上昇

Page 40: 同時実行 Sample

ハードウェアスレッディング(HT)

• ソフトウェアから見たハードウェアリソースを複数用意

• ソフトウェアは複数のCPUと認識して処理を行う

• ハードウェアが複数スレッドの命令を交互に実行

• OSが行うプロセスス1ケージューリングをハードウェアが実行するイメージ

CPU

RegIRQ

PIPE LINE

CPU

RegIRQ

PIPE LINE

RegIRQ

Page 41: 同時実行 Sample

HTのイメージ

• OSは複数CPUとみなしてスレッドをスケジュール

• 所定のタイミングで実行するスレッドを切り替える

• レイテンシの長いイベント

• キャッスミスなど

• 一定間隔で交互に

Page 42: 同時実行 Sample

HTの効果があるパターン• 各スレッドでリソースの競合が発生しない

• 実行ユニット(以下の図ではALUは効果あり)

• メモリ

Page 43: 同時実行 Sample

まとめそれぞれの特徴を整理

Page 44: 同時実行 Sample

まとめ

• 同時実行するための仕組みには複数の実現手段

• 実行ユニット、物理コア、レジスタを複数用意

• 実現手段により特徴が異なる

• それぞれに特徴があり、組み合わせて性能向上を図る

Page 45: 同時実行 Sample

実験並列実行の実験

Page 46: 同時実行 Sample

False Sharing

• 2つのスレッドが異なるメモリを使用しているにも関わらず、キャッシュの構造上、メモリの共有状態にあることを言う

• どちらかのスレッド(CPU)がメモリを書き換えると、もう一方のスレッドのキャッシュが無効化される

• キャッシュコヒーレンシ

Core1 Core2

Cache Line Cache Line

DRAM

異なるアドレスだが、 キャッシュは同一領域管理

Page 47: 同時実行 Sample

False SharingとHT

• 実行する物理コアが異なる

• False Sharingが発生

• 実行する物理コアが同一

• False Sharingは発生しない

Core1 Core2

Cache Line Cache Line

Core1 Core2

Cache Line

Page 48: 同時実行 Sample

False Sharing実験• 実験

• 2つのスレッドが異なるアドレスにデータを書き続ける

• 隣り合ったアドレス、64バイトずらしたアドレスへの書き込みの違い

• 異なる物理コア、同一物理コア内の異なる論理コア

アドレスオフセット/コア 同一物理コア 異なる物理コア

1バイト 2.5[s] 3.7[s]

64バイト 2.5[s] 1.6[s]

Page 49: 同時実行 Sample

Producer Consumer Threading Model

• Producer : データ生成

• Consumer : データ使用

• 例:

• P : ファイル読み出し

• C : 動画デコード

P C

P C

P C

P C

P P

C C

P P

C C

Model 1

Model 2

time

Thread 1

Thread 2

Thread 1

Thread 2

Page 50: 同時実行 Sample

Producer Consumer実験• Model1とModel2の比較

• Model1はキャッシュが同一

• Model2はキャッシュが異なるため、コヒーレンシ制御が多発MODEL/コア 同一論理 同物理

異論理 異物理

MODEL13.6[s] 2.4[s] 1.9[s]

99.9[%] 99.9[%] 99.9[%]

MODEL23.3[s] 2.4[s] 2.1[s]

99.9[%] 99.9[%] 98.9[%]

Page 51: 同時実行 Sample

Parallelism of Hardware Threading

• Hyper Threadingは実行ユニットが複数あるときに効果がある

• 例:

• ALUは複数の同時実行可能

• それ以外は1命令のみ ALUは3つあるが、 Divide(除算)は1つ

Page 52: 同時実行 Sample

Hardware Threadingと Sperscaler実験

• 実験1

• 加算だけを行うスレッドを2つ実行

• 実験2

• 除算だけを行うスレッドを2つ実行

スレッド/コア 同一 論理

同一物理 異論理 異物理

加算 3.4[s] 1.8[s] 1.9[s]

除算 4.2[s] 3.4[s] 2.2[s]

Page 53: 同時実行 Sample

参考文献• アーキテクチャ全般

• 1. David A.Patterson/John L.Hennessy; パターソン&ヘネシー コンピュータの構成と設計 第4版, 日経BP社, 2011年.

• 2. 中森 章; マイクロプロセッサ・アーキテクチャ入門, CQ出版, 2004年.

• 3. 安藤壽茂; コンピュータアーキテクチャの話, マイナビニュース

• 実例

• 4. Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3A: System Programming Guide, Part 1

• 5. Intel® 64 and IA-32 Architectures Optimization Reference Manual

• 6. Performance Analysis Guide for Intel® Core™ i7 Processor and Intel® Xeon™ 5500 processors