0
マルチコア時代の
並列プログラミング
1
ES松浦 @matu_ani
「1機のザクは通常の3倍の速度で接近しています!!」
13年9月22日日曜日
自己紹介:社外のボク
2
•翻訳本の監修メンバー
• 『C++の設計と進化』← Amazon 1位!
• 『ストラウストラップのプログラミング入門』
• 雑誌記事『STL.NET』
•sapporo.cpp/boostjp
• 『プログラミング...
僕もまだまだ勉強中です。
勉強仲間募集中です。
お嫁さんも募集中
二十代料理好き尚可
3
13年9月22日日曜日
ねらい
• マルチコア時代、並列プログラミングは
避けては通れない。が、とても難しいで
す。逆に、もしマスターできるなら強み
になる。
•今回は、その難しさとか、背景レベルの
お話しをしますので、問題共有しましょ
う!
4
13年9月22日日曜日
5
導入
13年9月22日日曜日
並列プログラミング
「並列プログラミングって、マルチス
レッドで動いて、共有オブジェクトは
排他する、アレですよね?」
6
13年9月22日日曜日
並列プログラミング
「並列プログラミングって、マルチス
レッドで動いて、共有オブジェクトは
排他する、アレですよね?」
6
あちゃー、地球の重力に縛られたオ
ールドタイプだわ!
13年9月22日日曜日
並列プログラミングとは
•ムーアの法則の終焉(The Free Lunch
is Over)
•マルチコア時代の到来
7
シングルスレッドで動作するプログラムはこれ以
上早くならない。
マルチコアによる真の並列処理を指す。極力排他
しない・待た...
ここで有名な
問題など
8
* 画像と本文は何の関係もありません
13年9月22日日曜日
Singleton
9
public static synchronized Singleton getInstance()
{
if (instance == null)
{
instance = new Singleton();
}
ret...
Singleton
9
public static synchronized Singleton getInstance()
{
if (instance == null)
{
instance = new Singleton();
}
ret...
Double Checked Locking
(以下DCL)
10
public static Singleton getInstance()
{
if (instance == null) // Check 1
{
synchronized(...
DCLどーよ?
• DCLとは、「ロック→条件判定」というロジックを
「条件判定→ロック→(再度)条件判定」と書き換える
イディオム。
• 主に遅延初期化などの処理においてロックのオーバー
ヘッドを減らすために用いられた。
• ところが! DC...
DCLがなぜだめなのか、
基礎からいこう。
12
* 画像と本文は何の関係もありません
ぐ∼
13年9月22日日曜日
並列プログラミングのキモ
• スレッドやロックが主役ではない
• 「状態(state)」が問題
• 複数スレッドから同時アクセスしてしまう。
• 副作用に依存する逐次処理もまた状態依存
• これらをスレッドセーフにする必要がある
(スレッドセー...
アトミック(Atomic)
• 不可分のこと
• これ以上処理を分割することができない
• あるいは分割出来ないようにした単位
• アトミックでなければ他のスレッドに割り込まれ、スレッ
ドセーフを保証できない。
• アトミックでない例
14
+...
リオーダー問題(reoder)
15
シングルスレッドで動く分にはプログラムは書いてある
とおりに動く(ように見える)。
int x,y; // グローバルに
x = 1;
y = 2;
// ここに来とき y==2 && x==1 である
こ...
16
リオーダー問題(reoder)
// スレッド(1)
x = 1;
y = 2;
// ここに来とき y==2 && x==1 である
// スレッド(2)
y==2 なら、必ず x==1 か?
13年9月22日日曜日
16
リオーダー問題(reoder)
// スレッド(1)
x = 1;
y = 2;
// ここに来とき y==2 && x==1 である
// スレッド(2)
y==2 なら、必ず x==1 か?
そんな保証はどこにもない
→ リオーダーさ...
リオーダーって?
• プ ロ グ ラ ム 実 行 速 度 の 向 上 な ど の 目 的 で 実 行 順
序 を 入 れ 替 え る 最 適 化 手 法 の 一 つ
x = 1;
y = 2;
• あるスレッドにとって問題ないなら順番を入れ替え...
可視性 (Memory Visibility)
18
// スレッド1
read_file(buffer); // でかいデータよむ
read_flag = true;
// スレッド2
while( ! read_flag ); // rea...
可視性 (Memory Visibility)
18
// スレッド1
read_file(buffer); // でかいデータよむ
read_flag = true;
// スレッド2
while( ! read_flag ); // rea...
可視性 (Memory Visibility)
18
// スレッド1
read_file(buffer); // でかいデータよむ
read_flag = true;
// スレッド2
while( ! read_flag ); // rea...
可視性って
•コンパイラやCPUが、キャッシュメモ
リの利用を最適化する。
•そのため、あるスレッドでのメモリの
見え方が、別のスレッドで同じように
見えるとは限らない。
19
13年9月22日日曜日
キャッシュメモリ
メインメモリ以外に各
CPUがキャッシュメ
モリを持つ。
→ キャッシュメモリ
とメインメモリは常に
同期するわけではない
20
13年9月22日日曜日
マルチコアの世界とは
•他のCPUのやっていることには基本的
に関わらない。
21
13年9月22日日曜日
マルチコアの世界とは
•他のCPUのやっていることには基本的
に関わらない。
21
あるスレッドの一貫性セマンテ
ィクスは、別のスレッドから見
たとき同じではない。
13年9月22日日曜日
でも、今現在ちゃんと動
いてんぞ
22
13年9月22日日曜日
でも、今現在ちゃんと動
いてんぞ
現在我々がロックを使った排他モデルによ
りマルチスレッド・プログラミングする場
合、自動的に以下の恩恵を受けている。
22
13年9月22日日曜日
でも、今現在ちゃんと動
いてんぞ
現在我々がロックを使った排他モデルによ
りマルチスレッド・プログラミングする場
合、自動的に以下の恩恵を受けている。
•ロックによる明示的なアトミック化
22
13年9月22日日曜日
でも、今現在ちゃんと動
いてんぞ
現在我々がロックを使った排他モデルによ
りマルチスレッド・プログラミングする場
合、自動的に以下の恩恵を受けている。
•ロックによる明示的なアトミック化
•メモリバリアによるリオーダー制御、
および、可視性の保...
ロックモデルって
•確かに安全だね。わかりやすいね。
•でも、それって無駄に安全だよね。
• 最適化を妨げる。
•マルチコアを活かしきってないよね。
23
13年9月22日日曜日
24
じゃあ、
DCLに戻るか* 画像と本文は何の関係もありません
ロ∼ラ∼
13年9月22日日曜日
DCL
25
public static Singleton getInstance()
{
if (instance == null) // Check 1
{
synchronized(Singleton.class) {
if (inst...
DCLの問題
26
mem = allocate();
instance = mem; // (*)
ctorSingleton(instance);
instance = new Singleton();
↑これ、いくつかのJITコンパイラは...
じゃあこれなら?
27
tmp = new Singleton();
instance = tmp;
13年9月22日日曜日
じゃあこれなら?
27
tmp = new Singleton();
instance = tmp;
結局だめ。コンパイラはtmpなんて一時変数無
しに最適化するかも知んない。
13年9月22日日曜日
じゃあこれなら?
27
tmp = new Singleton();
instance = tmp;
結局だめ。コンパイラはtmpなんて一時変数無
しに最適化するかも知んない。
instance = new Singleton();
// 負け...
これならいいべ?
28
mem = allocate(); // 1
ctorSingleton(mem); // 2
instance = mem; // 3
あるJITコンパイラが以下のコードを生成
するとしたら?
13年9月22日日曜日
これならいいべ?
28
mem = allocate(); // 1
ctorSingleton(mem); // 2
instance = mem; // 3
あるJITコンパイラが以下のコードを生成
するとしたら?
だめ。リオーダーされるか...
これならいいべ?
28
mem = allocate(); // 1
ctorSingleton(mem); // 2
instance = mem; // 3
あるJITコンパイラが以下のコードを生成
するとしたら?
だめ。リオーダーされるか...
ひとまず、まとめ
• マルチコアの世界を正しく理解する必要があ
る。
• 思い込みいくない(あるスレッドの逐次性が他のスレッ
ドからも同じように見えるなどと考えてはいけない)。
• 並列プログラミングをサポートする標準API
やライブラリを使う...
Java/C++
• リオーダーを細かく制御するメモリバリア
API
• アトミック性を提供するデータ型やキーワ
ード
• JavaやC++では様々なAPIが提供される。
• ゼロ・オーバーヘッド原則のC++はとんでもないことやってます(超むず...
様々な並列道具
•Java concurrentパッケージ
•Java 8 Fork/Join Framework
• concurrentパッケージ 拡張。Parallel系、lambda
•C++11 Atomic operations l...
並列いろいろ
• Lock-freeアルゴリズム・データ構造
• SIMD (Single Instruction Multiple Data)
• GPGPU
• アクターモデル(ScalaのActor、Cocoaの
Operation Qu...
最後に、関数型言語
• そもそもの問題は「状態」だ。
• 状態(副作用)を持たない関数型言語は、
並列プログラミングとの相性がよい。
• Haskell、Erlang、Ocaml、Scala、F#、
• C#、C++、...
33
13年9月2...
最後に、関数型言語
• そもそもの問題は「状態」だ。
• 状態(副作用)を持たない関数型言語は、
並列プログラミングとの相性がよい。
• Haskell、Erlang、Ocaml、Scala、F#、
• C#、C++、...
33
マルチコアな...
おつかれさまでした!
34
13年9月22日日曜日
Upcoming SlideShare
Loading in...5
×

Matuura concurrent3

409

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
409
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Matuura concurrent3"

  1. 1. マルチコア時代の 並列プログラミング 1 ES松浦 @matu_ani 「1機のザクは通常の3倍の速度で接近しています!!」 13年9月22日日曜日
  2. 2. 自己紹介:社外のボク 2 •翻訳本の監修メンバー • 『C++の設計と進化』← Amazon 1位! • 『ストラウストラップのプログラミング入門』 • 雑誌記事『STL.NET』 •sapporo.cpp/boostjp • 『プログラミングの魔法少女』 • https://sites.google.com/site/sapporocpp/linguamagi 13年9月22日日曜日
  3. 3. 僕もまだまだ勉強中です。 勉強仲間募集中です。 お嫁さんも募集中 二十代料理好き尚可 3 13年9月22日日曜日
  4. 4. ねらい • マルチコア時代、並列プログラミングは 避けては通れない。が、とても難しいで す。逆に、もしマスターできるなら強み になる。 •今回は、その難しさとか、背景レベルの お話しをしますので、問題共有しましょ う! 4 13年9月22日日曜日
  5. 5. 5 導入 13年9月22日日曜日
  6. 6. 並列プログラミング 「並列プログラミングって、マルチス レッドで動いて、共有オブジェクトは 排他する、アレですよね?」 6 13年9月22日日曜日
  7. 7. 並列プログラミング 「並列プログラミングって、マルチス レッドで動いて、共有オブジェクトは 排他する、アレですよね?」 6 あちゃー、地球の重力に縛られたオ ールドタイプだわ! 13年9月22日日曜日
  8. 8. 並列プログラミングとは •ムーアの法則の終焉(The Free Lunch is Over) •マルチコア時代の到来 7 シングルスレッドで動作するプログラムはこれ以 上早くならない。 マルチコアによる真の並列処理を指す。極力排他 しない・待たせないことが重要。 13年9月22日日曜日
  9. 9. ここで有名な 問題など 8 * 画像と本文は何の関係もありません 13年9月22日日曜日
  10. 10. Singleton 9 public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } 例:マルチスレッド環境で遅延初期化なシングルトン 13年9月22日日曜日
  11. 11. Singleton 9 public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } ほとんどの場合、無駄に排他される 例:マルチスレッド環境で遅延初期化なシングルトン 13年9月22日日曜日
  12. 12. Double Checked Locking (以下DCL) 10 public static Singleton getInstance() { if (instance == null) // Check 1 { synchronized(Singleton.class) { if (instance == null) // Check 2 instance = new Singleton(); } } return instance; } 13年9月22日日曜日
  13. 13. DCLどーよ? • DCLとは、「ロック→条件判定」というロジックを 「条件判定→ロック→(再度)条件判定」と書き換える イディオム。 • 主に遅延初期化などの処理においてロックのオーバー ヘッドを減らすために用いられた。 • ところが! DCLはコンパイラやCPUによるリオーダ ーの影響等により正しく動作しない場合が あることがわかったため、今ではアンチパターンと 呼ばれることすらある。 • ただし、現代において、DCLは正しく実装すれば有用であ る。→ 今回の範囲外 11 13年9月22日日曜日
  14. 14. DCLがなぜだめなのか、 基礎からいこう。 12 * 画像と本文は何の関係もありません ぐ∼ 13年9月22日日曜日
  15. 15. 並列プログラミングのキモ • スレッドやロックが主役ではない • 「状態(state)」が問題 • 複数スレッドから同時アクセスしてしまう。 • 副作用に依存する逐次処理もまた状態依存 • これらをスレッドセーフにする必要がある (スレッドセーフでない状態:データレース) 13 13年9月22日日曜日
  16. 16. アトミック(Atomic) • 不可分のこと • これ以上処理を分割することができない • あるいは分割出来ないようにした単位 • アトミックでなければ他のスレッドに割り込まれ、スレッ ドセーフを保証できない。 • アトミックでない例 14 ++count; // 「Read Modify Write」 long long value = 100; // 64bit変数 value = 0; // 32bitレジスタ2つによる実装が許されている 13年9月22日日曜日
  17. 17. リオーダー問題(reoder) 15 シングルスレッドで動く分にはプログラムは書いてある とおりに動く(ように見える)。 int x,y; // グローバルに x = 1; y = 2; // ここに来とき y==2 && x==1 である ここには一貫性セマンティクスがある あたりまえじゃん! 13年9月22日日曜日
  18. 18. 16 リオーダー問題(reoder) // スレッド(1) x = 1; y = 2; // ここに来とき y==2 && x==1 である // スレッド(2) y==2 なら、必ず x==1 か? 13年9月22日日曜日
  19. 19. 16 リオーダー問題(reoder) // スレッド(1) x = 1; y = 2; // ここに来とき y==2 && x==1 である // スレッド(2) y==2 なら、必ず x==1 か? そんな保証はどこにもない → リオーダーされるから 13年9月22日日曜日
  20. 20. リオーダーって? • プ ロ グ ラ ム 実 行 速 度 の 向 上 な ど の 目 的 で 実 行 順 序 を 入 れ 替 え る 最 適 化 手 法 の 一 つ x = 1; y = 2; • あるスレッドにとって問題ないなら順番を入れ替えちゃうか も • コンパイラがプログラムコードを機械語に変換するとき • CPUが機械語のコードを実際に実行するとき • キ ャ ッ シ ュ メ モ リ の 影 響 な ど を 考 慮 し て 命 令 の 実 行 順 序 を 入 れ 替 え る! 17 13年9月22日日曜日
  21. 21. 可視性 (Memory Visibility) 18 // スレッド1 read_file(buffer); // でかいデータよむ read_flag = true; // スレッド2 while( ! read_flag ); // readが終わるの待つ write_console(buffer); // 読み取った内容をコンソールに bool read_flag = false; これちゃんと動くか? 13年9月22日日曜日
  22. 22. 可視性 (Memory Visibility) 18 // スレッド1 read_file(buffer); // でかいデータよむ read_flag = true; // スレッド2 while( ! read_flag ); // readが終わるの待つ write_console(buffer); // 読み取った内容をコンソールに bool read_flag = false; これちゃんと動くか? そんな保証はどこにもない 13年9月22日日曜日
  23. 23. 可視性 (Memory Visibility) 18 // スレッド1 read_file(buffer); // でかいデータよむ read_flag = true; // スレッド2 while( ! read_flag ); // readが終わるの待つ write_console(buffer); // 読み取った内容をコンソールに bool read_flag = false; これちゃんと動くか? そんな保証はどこにもない それどころかスレッド2は永遠にwhile()するかも 13年9月22日日曜日
  24. 24. 可視性って •コンパイラやCPUが、キャッシュメモ リの利用を最適化する。 •そのため、あるスレッドでのメモリの 見え方が、別のスレッドで同じように 見えるとは限らない。 19 13年9月22日日曜日
  25. 25. キャッシュメモリ メインメモリ以外に各 CPUがキャッシュメ モリを持つ。 → キャッシュメモリ とメインメモリは常に 同期するわけではない 20 13年9月22日日曜日
  26. 26. マルチコアの世界とは •他のCPUのやっていることには基本的 に関わらない。 21 13年9月22日日曜日
  27. 27. マルチコアの世界とは •他のCPUのやっていることには基本的 に関わらない。 21 あるスレッドの一貫性セマンテ ィクスは、別のスレッドから見 たとき同じではない。 13年9月22日日曜日
  28. 28. でも、今現在ちゃんと動 いてんぞ 22 13年9月22日日曜日
  29. 29. でも、今現在ちゃんと動 いてんぞ 現在我々がロックを使った排他モデルによ りマルチスレッド・プログラミングする場 合、自動的に以下の恩恵を受けている。 22 13年9月22日日曜日
  30. 30. でも、今現在ちゃんと動 いてんぞ 現在我々がロックを使った排他モデルによ りマルチスレッド・プログラミングする場 合、自動的に以下の恩恵を受けている。 •ロックによる明示的なアトミック化 22 13年9月22日日曜日
  31. 31. でも、今現在ちゃんと動 いてんぞ 現在我々がロックを使った排他モデルによ りマルチスレッド・プログラミングする場 合、自動的に以下の恩恵を受けている。 •ロックによる明示的なアトミック化 •メモリバリアによるリオーダー制御、 および、可視性の保証(キャッシュと メインメモリ同期) 22 13年9月22日日曜日
  32. 32. ロックモデルって •確かに安全だね。わかりやすいね。 •でも、それって無駄に安全だよね。 • 最適化を妨げる。 •マルチコアを活かしきってないよね。 23 13年9月22日日曜日
  33. 33. 24 じゃあ、 DCLに戻るか* 画像と本文は何の関係もありません ロ∼ラ∼ 13年9月22日日曜日
  34. 34. DCL 25 public static Singleton getInstance() { if (instance == null) // Check 1 { synchronized(Singleton.class) { if (instance == null) // Check 2 instance = new Singleton(); } } return instance; } 13年9月22日日曜日
  35. 35. DCLの問題 26 mem = allocate(); instance = mem; // (*) ctorSingleton(instance); instance = new Singleton(); ↑これ、いくつかのJITコンパイラは次の コードを生成する。 (*)の時点で、instanceは未初期化の領域 を指す。→ 負け 13年9月22日日曜日
  36. 36. じゃあこれなら? 27 tmp = new Singleton(); instance = tmp; 13年9月22日日曜日
  37. 37. じゃあこれなら? 27 tmp = new Singleton(); instance = tmp; 結局だめ。コンパイラはtmpなんて一時変数無 しに最適化するかも知んない。 13年9月22日日曜日
  38. 38. じゃあこれなら? 27 tmp = new Singleton(); instance = tmp; 結局だめ。コンパイラはtmpなんて一時変数無 しに最適化するかも知んない。 instance = new Singleton(); // 負け 13年9月22日日曜日
  39. 39. これならいいべ? 28 mem = allocate(); // 1 ctorSingleton(mem); // 2 instance = mem; // 3 あるJITコンパイラが以下のコードを生成 するとしたら? 13年9月22日日曜日
  40. 40. これならいいべ? 28 mem = allocate(); // 1 ctorSingleton(mem); // 2 instance = mem; // 3 あるJITコンパイラが以下のコードを生成 するとしたら? だめ。リオーダーされるかも。→ 負け 13年9月22日日曜日
  41. 41. これならいいべ? 28 mem = allocate(); // 1 ctorSingleton(mem); // 2 instance = mem; // 3 あるJITコンパイラが以下のコードを生成 するとしたら? だめ。リオーダーされるかも。→ 負け mem = allocate(); // 1 instance = mem; // 3 ctorSingleton(mem); // 2 13年9月22日日曜日
  42. 42. ひとまず、まとめ • マルチコアの世界を正しく理解する必要があ る。 • 思い込みいくない(あるスレッドの逐次性が他のスレッ ドからも同じように見えるなどと考えてはいけない)。 • 並列プログラミングをサポートする標準API やライブラリを使う。 • 心配なら普通にロックモデルを採用しよう。 29 13年9月22日日曜日
  43. 43. Java/C++ • リオーダーを細かく制御するメモリバリア API • アトミック性を提供するデータ型やキーワ ード • JavaやC++では様々なAPIが提供される。 • ゼロ・オーバーヘッド原則のC++はとんでもないことやってます(超むず) 30 13年9月22日日曜日
  44. 44. 様々な並列道具 •Java concurrentパッケージ •Java 8 Fork/Join Framework • concurrentパッケージ 拡張。Parallel系、lambda •C++11 Atomic operations library •C#4.0 Parallel.For 31 13年9月22日日曜日
  45. 45. 並列いろいろ • Lock-freeアルゴリズム・データ構造 • SIMD (Single Instruction Multiple Data) • GPGPU • アクターモデル(ScalaのActor、Cocoaの Operation Queue) • OpenMP、PPL(Parallel Pattern Library) • STM(Software Transactional Memory) 32 13年9月22日日曜日
  46. 46. 最後に、関数型言語 • そもそもの問題は「状態」だ。 • 状態(副作用)を持たない関数型言語は、 並列プログラミングとの相性がよい。 • Haskell、Erlang、Ocaml、Scala、F#、 • C#、C++、... 33 13年9月22日日曜日
  47. 47. 最後に、関数型言語 • そもそもの問題は「状態」だ。 • 状態(副作用)を持たない関数型言語は、 並列プログラミングとの相性がよい。 • Haskell、Erlang、Ocaml、Scala、F#、 • C#、C++、... 33 マルチコアな現代、 関数型言語が注目されている! 13年9月22日日曜日
  48. 48. おつかれさまでした! 34 13年9月22日日曜日
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×