Contenu connexe
Similaire à マルチコア時代の並列プログラミング
Similaire à マルチコア時代の並列プログラミング (9)
Plus de Akihiko Matuura (6)
マルチコア時代の並列プログラミング
- 11. Singleton
9
public static synchronized Singleton getInstance()
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
ほとんどの場合、無駄に排他される
例:マルチスレッド環境で遅延初期化なシングルトン
13年9月22日日曜日
- 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日日曜日
- 16. アトミック(Atomic)
• 不可分のこと
• これ以上処理を分割することができない
• あるいは分割出来ないようにした単位
• アトミックでなければ他のスレッドに割り込まれ、スレッ
ドセーフを保証できない。
• アトミックでない例
14
++count; // 「Read Modify Write」
long long value = 100; // 64bit変数
value = 0; // 32bitレジスタ2つによる実装が許されている
13年9月22日日曜日
- 20. リオーダーって?
• プ ロ グ ラ ム 実 行 速 度 の 向 上 な ど の 目 的 で 実 行 順
序 を 入 れ 替 え る 最 適 化 手 法 の 一 つ
x = 1;
y = 2;
• あるスレッドにとって問題ないなら順番を入れ替えちゃうか
も
• コンパイラがプログラムコードを機械語に変換するとき
• CPUが機械語のコードを実際に実行するとき
• キ ャ ッ シ ュ メ モ リ の 影 響 な ど を 考 慮 し て 命 令 の
実 行 順 序 を 入 れ 替 え る!
17
13年9月22日日曜日
- 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. 可視性 (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. 可視性 (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日日曜日
- 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. DCLの問題
26
mem = allocate();
instance = mem; // (*)
ctorSingleton(instance);
instance = new Singleton();
↑これ、いくつかのJITコンパイラは次の
コードを生成する。
(*)の時点で、instanceは未初期化の領域
を指す。→ 負け
13年9月22日日曜日
- 38. じゃあこれなら?
27
tmp = new Singleton();
instance = tmp;
結局だめ。コンパイラはtmpなんて一時変数無
しに最適化するかも知んない。
instance = new Singleton();
// 負け
13年9月22日日曜日
- 41. これならいいべ?
28
mem = allocate(); // 1
ctorSingleton(mem); // 2
instance = mem; // 3
あるJITコンパイラが以下のコードを生成
するとしたら?
だめ。リオーダーされるかも。→ 負け
mem = allocate(); // 1
instance = mem; // 3
ctorSingleton(mem); // 2
13年9月22日日曜日
- 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日日曜日