SlideShare uma empresa Scribd logo
1 de 48
Baixar para ler offline
マルチコア時代の
並列プログラミング
1
ES松浦 @matu_ani
「1機のザクは通常の3倍の速度で接近しています!!」
13年9月22日日曜日
自己紹介:社外のボク
2
•翻訳本の監修メンバー
• 『C++の設計と進化』← Amazon 1位!
• 『ストラウストラップのプログラミング入門』
• 雑誌記事『STL.NET』
•sapporo.cpp/boostjp
• 『プログラミングの魔法少女』
• https://sites.google.com/site/sapporocpp/linguamagi
13年9月22日日曜日
僕もまだまだ勉強中です。
勉強仲間募集中です。
お嫁さんも募集中
二十代料理好き尚可
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
シングルスレッドで動作するプログラムはこれ以
上早くならない。
マルチコアによる真の並列処理を指す。極力排他
しない・待たせないことが重要。
13年9月22日日曜日
ここで有名な
問題など
8
* 画像と本文は何の関係もありません
13年9月22日日曜日
Singleton
9
public static synchronized Singleton getInstance()
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
例:マルチスレッド環境で遅延初期化なシングルトン
13年9月22日日曜日
Singleton
9
public static synchronized Singleton getInstance()
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
ほとんどの場合、無駄に排他される
例:マルチスレッド環境で遅延初期化なシングルトン
13年9月22日日曜日
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日日曜日
DCLどーよ?
• DCLとは、「ロック→条件判定」というロジックを
「条件判定→ロック→(再度)条件判定」と書き換える
イディオム。
• 主に遅延初期化などの処理においてロックのオーバー
ヘッドを減らすために用いられた。
• ところが! DCLはコンパイラやCPUによるリオーダ
ーの影響等により正しく動作しない場合が
あることがわかったため、今ではアンチパターンと
呼ばれることすらある。
• ただし、現代において、DCLは正しく実装すれば有用であ
る。→ 今回の範囲外
11
13年9月22日日曜日
DCLがなぜだめなのか、
基礎からいこう。
12
* 画像と本文は何の関係もありません
ぐ∼
13年9月22日日曜日
並列プログラミングのキモ
• スレッドやロックが主役ではない
• 「状態(state)」が問題
• 複数スレッドから同時アクセスしてしまう。
• 副作用に依存する逐次処理もまた状態依存
• これらをスレッドセーフにする必要がある
(スレッドセーフでない状態:データレース)
13
13年9月22日日曜日
アトミック(Atomic)
• 不可分のこと
• これ以上処理を分割することができない
• あるいは分割出来ないようにした単位
• アトミックでなければ他のスレッドに割り込まれ、スレッ
ドセーフを保証できない。
• アトミックでない例
14
++count; // 「Read Modify Write」
long long value = 100; // 64bit変数
value = 0; // 32bitレジスタ2つによる実装が許されている
13年9月22日日曜日
リオーダー問題(reoder)
15
シングルスレッドで動く分にはプログラムは書いてある
とおりに動く(ように見える)。
int x,y; // グローバルに
x = 1;
y = 2;
// ここに来とき y==2 && x==1 である
ここには一貫性セマンティクスがある
あたりまえじゃん!
13年9月22日日曜日
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 か?
そんな保証はどこにもない
→ リオーダーされるから
13年9月22日日曜日
リオーダーって?
• プ ロ グ ラ ム 実 行 速 度 の 向 上 な ど の 目 的 で 実 行 順
序 を 入 れ 替 え る 最 適 化 手 法 の 一 つ
x = 1;
y = 2;
• あるスレッドにとって問題ないなら順番を入れ替えちゃうか
も
• コンパイラがプログラムコードを機械語に変換するとき
• CPUが機械語のコードを実際に実行するとき
• キ ャ ッ シ ュ メ モ リ の 影 響 な ど を 考 慮 し て 命 令 の
実 行 順 序 を 入 れ 替 え る!
17
13年9月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日日曜日
可視性 (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日日曜日
可視性 (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日日曜日
可視性って
•コンパイラや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日日曜日
でも、今現在ちゃんと動
いてんぞ
現在我々がロックを使った排他モデルによ
りマルチスレッド・プログラミングする場
合、自動的に以下の恩恵を受けている。
•ロックによる明示的なアトミック化
•メモリバリアによるリオーダー制御、
および、可視性の保証(キャッシュと
メインメモリ同期)
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 (instance == null) // Check 2
instance = new Singleton();
}
}
return instance;
}
13年9月22日日曜日
DCLの問題
26
mem = allocate();
instance = mem; // (*)
ctorSingleton(instance);
instance = new Singleton();
↑これ、いくつかのJITコンパイラは次の
コードを生成する。
(*)の時点で、instanceは未初期化の領域
を指す。→ 負け
13年9月22日日曜日
じゃあこれなら?
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();
// 負け
13年9月22日日曜日
これならいいべ?
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コンパイラが以下のコードを生成
するとしたら?
だめ。リオーダーされるかも。→ 負け
13年9月22日日曜日
これならいいべ?
28
mem = allocate(); // 1
ctorSingleton(mem); // 2
instance = mem; // 3
あるJITコンパイラが以下のコードを生成
するとしたら?
だめ。リオーダーされるかも。→ 負け
mem = allocate(); // 1
instance = mem; // 3
ctorSingleton(mem); // 2
13年9月22日日曜日
ひとまず、まとめ
• マルチコアの世界を正しく理解する必要があ
る。
• 思い込みいくない(あるスレッドの逐次性が他のスレッ
ドからも同じように見えるなどと考えてはいけない)。
• 並列プログラミングをサポートする標準API
やライブラリを使う。
• 心配なら普通にロックモデルを採用しよう。
29
13年9月22日日曜日
Java/C++
• リオーダーを細かく制御するメモリバリア
API
• アトミック性を提供するデータ型やキーワ
ード
• JavaやC++では様々なAPIが提供される。
• ゼロ・オーバーヘッド原則のC++はとんでもないことやってます(超むず)
30
13年9月22日日曜日
様々な並列道具
•Java concurrentパッケージ
•Java 8 Fork/Join Framework
• concurrentパッケージ 拡張。Parallel系、lambda
•C++11 Atomic operations library
•C#4.0 Parallel.For
31
13年9月22日日曜日
並列いろいろ
• 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日日曜日
最後に、関数型言語
• そもそもの問題は「状態」だ。
• 状態(副作用)を持たない関数型言語は、
並列プログラミングとの相性がよい。
• Haskell、Erlang、Ocaml、Scala、F#、
• C#、C++、...
33
13年9月22日日曜日
最後に、関数型言語
• そもそもの問題は「状態」だ。
• 状態(副作用)を持たない関数型言語は、
並列プログラミングとの相性がよい。
• Haskell、Erlang、Ocaml、Scala、F#、
• C#、C++、...
33
マルチコアな現代、
関数型言語が注目されている!
13年9月22日日曜日
おつかれさまでした!
34
13年9月22日日曜日

Mais conteúdo relacionado

Mais procurados

Mais procurados (20)

例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
さくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みさくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組み
 
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0
 
Parser combinatorってなんなのさ
Parser combinatorってなんなのさParser combinatorってなんなのさ
Parser combinatorってなんなのさ
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 
Java でつくる 低レイテンシ実装の技巧
Java でつくる低レイテンシ実装の技巧Java でつくる低レイテンシ実装の技巧
Java でつくる 低レイテンシ実装の技巧
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
BuildKitの概要と最近の機能
BuildKitの概要と最近の機能BuildKitの概要と最近の機能
BuildKitの概要と最近の機能
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
 
比較サイトの検索改善(SPA から SSR に変換)
比較サイトの検索改善(SPA から SSR に変換)比較サイトの検索改善(SPA から SSR に変換)
比較サイトの検索改善(SPA から SSR に変換)
 
Multibranch pipelineでいろいろ学んだこと
Multibranch pipelineでいろいろ学んだことMultibranch pipelineでいろいろ学んだこと
Multibranch pipelineでいろいろ学んだこと
 
ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発ふつうのRailsアプリケーション開発
ふつうのRailsアプリケーション開発
 
5分で分かるgitのrefspec
5分で分かるgitのrefspec5分で分かるgitのrefspec
5分で分かるgitのrefspec
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
 
C#でわかる こわくないMonad
C#でわかる こわくないMonadC#でわかる こわくないMonad
C#でわかる こわくないMonad
 
20170525 jsug バッチは地味だが役に立つ
20170525 jsug バッチは地味だが役に立つ20170525 jsug バッチは地味だが役に立つ
20170525 jsug バッチは地味だが役に立つ
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
 

Semelhante a マルチコア時代の並列プログラミング (9)

Objectie-C de ラムダ
Objectie-C de ラムダObjectie-C de ラムダ
Objectie-C de ラムダ
 
JavaScriptのテストコード 一緒に勉強しませんか??
JavaScriptのテストコード 一緒に勉強しませんか??JavaScriptのテストコード 一緒に勉強しませんか??
JavaScriptのテストコード 一緒に勉強しませんか??
 
130329 perl casual_ruik
130329 perl casual_ruik130329 perl casual_ruik
130329 perl casual_ruik
 
プログラミング学習のための学習
プログラミング学習のための学習プログラミング学習のための学習
プログラミング学習のための学習
 
Unityとスマートフォンアプリの最適化
Unityとスマートフォンアプリの最適化Unityとスマートフォンアプリの最適化
Unityとスマートフォンアプリの最適化
 
Groovy kisobenkyoukai20130309
Groovy kisobenkyoukai20130309Groovy kisobenkyoukai20130309
Groovy kisobenkyoukai20130309
 
Read Groovy Compile process(Groovy Benkyoukai 2013)
Read Groovy Compile process(Groovy Benkyoukai 2013)Read Groovy Compile process(Groovy Benkyoukai 2013)
Read Groovy Compile process(Groovy Benkyoukai 2013)
 
Code injectiontool
Code injectiontoolCode injectiontool
Code injectiontool
 
Gorilla.vim#6
Gorilla.vim#6Gorilla.vim#6
Gorilla.vim#6
 

Mais de Akihiko Matuura (6)

最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
 
アーキテクチャパターンの紹介
アーキテクチャパターンの紹介アーキテクチャパターンの紹介
アーキテクチャパターンの紹介
 
Go 言語を語ってみるか
Go 言語を語ってみるかGo 言語を語ってみるか
Go 言語を語ってみるか
 
boost and c++11
boost and c++11boost and c++11
boost and c++11
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
 
Open Business Model
Open Business ModelOpen Business Model
Open Business Model
 

Último

Último (10)

Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 

マルチコア時代の並列プログラミング