• 検索結果がありません。

Microsoft PowerPoint ppt [互換モード]

N/A
N/A
Protected

Academic year: 2021

シェア "Microsoft PowerPoint ppt [互換モード]"

Copied!
48
0
0

読み込み中.... (全文を見る)

全文

(1)

計算機アーキテクチャ特論A

•

計算機アーキテクチャ特論A

–

並列アーキテクチャの基本(枝廣)

–

10/2, 10/16, 10/23, 10/30,

11/6, 11/13,

(11/20(予備))

–

内容(変更の可能性あり)

• 序論(マルチコア=並列アーキテクチャ概論) • キャッシュ・コヒーレンシ、メモリ・コンシステンシ • 並列プログラミングモデル、⾔語 • 並列に関する法則 • 同期 • 並列アルゴリズム、並列化の課題

–

資料置場︓

http://www.pdsl.jp/class/

Page 1

2017年11⽉6⽇ 枝廣

(2)

同期のためのハードウェアとソフトウェアとの協調

•

同期の必要性(排他制御)

•

排他制御のための基本ソフトウェア関数と仕

組み

–

ミューテックス(ロックとアンロック)

–

セマフォ

•

基本ソフトウェア関数の実現

–

必須のハードウェア機構︓アトミック命令

–

アトミック命令の例とロックの実現

•

スワップ

•

ロードリンクト・ストアコンディショナル

(3)

排他制御

問

︓

下図のような銀⾏預⾦システムにおい

て、⼆つのスレッドから同時に読み書き

可能な場合、問題が起こることがある。

どのような場合か説明せよ。

預金残高100万円

スレッド1:

10万円預ける

スレッド2:

10万円下ろす

①

②

③

④

何らかの同期を

とることが必要

(4)

同期のためのハードウェアとソフトウェアとの協調

•

同期の必要性(排他制御)

•

排他制御のための基本ソフトウェア関数と仕

組み

–

ミューテックス(ロックとアンロック)

•

Mutex (Mutual Exclusion): 相互排他

–

セマフォ

•

基本ソフトウェア関数の実現

–

必須のハードウェア機構︓アトミック命令

–

アトミック命令の例とロックの実現

•

スワップ

•

ロードリンクト・ストアコンディショナル

(5)

Mutex (Lock – Unlock)を⽤いた排他制御の実現

時間

その他の

処理

預金残高

の変更

(クリティカル

セクション)

その他の

処理

Thread 1

Lock

Thread 1

は実行可能

Unlock

Thread 2

Unlock

されるまで

Wait

STOP

(6)

排他制御の例

•

Mutex (= Mutual Exclusion)

–

ある変数のLock/Unlock

•

セマフォ

–

リソースが複数ある場合に利⽤

–

利⽤可能なリソース数を保持し、リソースが

残っている限りプログラムはクリティカルセ

クションに⼊れる

–

Mutexはリソース数が⼀つの特殊ケースと考

えられる

(7)

pthread, POSIX セマフォ

•

pthread mutex

–

pthread_mutex_init

•

ロック変数の初期化

–

pthread_mutex_lock,

pthread_mutex_unlock

–

pthread_destroy

•

POSIX セマフォ

–

sem_init

–

sem_wait, sem_post

–

sem_destroy

7

(8)

Windows Thread API

•

クリティカルセクション

–

InitializeCriticalSection

–

EnterCriticalSection, LeaveCriticalSection

–

DeleteCriticalSection

•

セマフォ

–

CreateSemaphore

–

WaitForSingleObject, ReleaseSemaphore

–

CloseHandle

(9)

9

#include <stdio.h>

#include <math.h>

#define DATA_NUM 100

int main() {

BOOL primes[DATA_NUM];

int I, j,

count

;

Example2’: Calculate Primes

and count # of Primes

/* Check */

for (i = 0; i < DATA_NUM; i++) {

primes[i] = TRUE;

limit = (int)sqrt((double)i);

for (j = 2; j <= limit; j++)

if (primes[j] && i % j == 0) {

primes[i] = FALSE;

break;

}

if (j > limit) count++;

}

/* Output */

for (i = 2; i < DATA_NUM; i++) {

if (primes[i] == 1) printf("%d ", i);

}

printf("¥n");

return 0;

}

(10)

#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <math.h> #include <pthread.h> #define THREAD_NUM 3 #define DATA_NUM 100 typedef struct _thread_arg {

int id;

bool *primes;

pthread_mutex_t *mutex; } thread_arg_t;

int count;

void thread_func(void *arg) {

thread_arg_t* targ = (thread_arg_t *)arg; int c_start, c_end, range, limit;

int i, j;

/* Determine Range of Values to be Checked */ range = (DATA_NUM - 2) / THREAD_NUM + 1; c_start = 2 + targ->id *range;

c_end = 2 + (targ->id+1) *range;

if (c_end > DATA_NUM) c_end = DATA_NUM; /* Check */

for (i = c_start; i < c_end; i++) { limit = (int)sqrt((double) i); for (j = 2; j <= limit; j++) if (targ->primes[j] && i % j == 0) { targ->primes[i] = false; break; } if(j > limit) { pthread_mutex_lock(targ->mutex); count++; pthread_mutex_unlock(targ->mutex); } } return;

Pthread (1/2)

Calc Primes

(11)

11

/* Wait for All Threads */

for (i = 0; i < THREAD_NUM; i++)

pthread_join(handle[i], NULL);

/* Destroy Mutex Variable */

pthread_mutex_destroy(&mutex);

/* Output */

for (i = 2; i < DATA_NUM; i++)

if (primes[i])

printf("%d ", i);

printf("¥n");

return 0;

int main() { pthread_t handle[THREAD_NUM]; thread_arg_t targ[THREAD_NUM]; bool primes[DATA_NUM]; int i;

pthread_mutex_t mutex;

/* Initialize */

for (i = 0; i < DATA_NUM; i++) primes[i] = true;

/* Initialize mutex variable */

pthread_mutex_init(&mutex,

NULL);

/* Start */

for (i = 0; i < THREAD_NUM; i++) { targ[i].id = i; targ[i].primes = primes; targ[i].mutex = &mutex; pthread_create(&handle[i], NULL, (void*)thread_func, (void*)&targ[i]); }

Pthread (2/2)

(12)

#include <stdio.h> #include <windows.h> #include <math.h>

#define THREAD_NUM 3 #define DATA_NUM 100 typedef struct _thread_arg {

int id;

BOOL *primes;

CRITICAL_SECTION *cs; } thread_arg_t;

int count;

void thread_func(void *arg) {

thread_arg_t* targ = (thread_arg_t *)arg; int c_start, c_end, range, limit;

int i, j;

/* Determine Range of Values to be Checked */ range = (DATA_NUM - 2) / THREAD_NUM + 1; c_start = 2 + targ->id * range;

c_end = 2 + (targ->id + 1) * range;

if (c_end > DATA_NUM) c_end = DATA_NUM; /* Check */

for (i = c_start; i < c_end; i++) { limit = (int)sqrt((double)i); for (j = 2; j <= limit; j++) if (targ->primes[j] && i % j == 0) { targ->primes[i] = FALSE; break; } if(j > limit) { EnterCriticalSection(targ->cs); count++; LeaveCriticalSection(targ->cs); } } return;

Windows thread (1/2)

Calc Primes

(13)

13

WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE);

/* Destroy critical section Variable */ DeleteCriticalSection(&cs);

/* Output */

for (i = 2; i < DATA_NUM; i++) { if (primes[i] == 1) printf("%d ", i); } printf("¥n"); return 0; } int main() { HANDLE handle[THREAD_NUM]; thread_arg_t targ[THREAD_NUM]; BOOL primes[DATA_NUM]; int i; CRITICAL_SECTION cs;

for (i = 0; i < DATA_NUM; i++) { primes[i] = TRUE;

}

/* Initialize critical section variable */ InitializeCriticalSection(&cs);

for (i = 0; i < THREAD_NUM; i++) { targ[i].id = i;

targ[i].primes = primes; targ[i].mutex = &cs;

handle[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread_ func, (void *)&targ[i], 0, NULL);

}

(14)

OpenMP

•

Clause

–

付加情報

–

private, shared (変数)

–

reduction (演算)

•

#pragma omp critical

•

#pragma omp atomic

(15)

Reduction

15

Thread 1

counting

Thread 2

counting

Thread 3

counting

Thread 4

counting

Count

Final Result

(16)

#include <stdio.h>

#include <math.h>

#include <omp.h>

#define DATA_NUM 100

int main() {

BOOL

primes[DATA_NUM];

int I, j,

count;

/* Initialize */

#pragma omp parallel for for (i = 0; i < DATA_NUM; i++)

primes[i] = TRUE;

OpenMP

/* Check */

#pragma omp parallel for

reduction(+;count)

private(limit, j)

for (i = 0; i < DATA_NUM; i++) {

limit = (int)sqrt((double)i);

for (j = 2; j <= limit; j++)

if (primes[j] && i % j == 0) {

primes[i] = FALSE;

break;

}

if (j > limit) count++;

}

/* Output */

for (i = 2; i < DATA_NUM; i++) {

if (primes[i] == 1) printf("%d ", i);

}

printf("¥n");

return 0;

(17)

Mutex (Lock/Unlock)の仕組み

• 共有資源(今の場合預金残高やカウンタ、あるいはクリ

ティカルセクション)ごとに変数(ロック変数とよぶ)を持つ

• ロック変数が未使用、使用中のフラグとなり、「未使用」を

読むことができたスレッドはロック変数を「使用中」に書き

換えて先に進む(ロック取得)

• 共有資源の利用が終われば「未使用」に戻す(unlock)

• ただし、ロック変数を同時に読み書きできると同じ問題が

起こる。ロック変数をロックする???

• プロセッサにはアトミックなメモリアクセスを支援するハード

ウェア機構が存在することが普通であり、それを使う

– アトミックなメモリアクセス:

メモリへの「読み」と「書き」の処理が他のプロセッサからの処

理に割り込まれずに行われること

Page 17

(18)

Mutex (Lock/Unlock)の仕組み(スピンロック)

開始 ロック変数を読み, 1を書き込む操作を アトミックに実行 読んだ値=0? クリティカルセクション に入る クリティカルセクション から出る ロック変数を0に (ロック解除) Yes (ロック成功) No スピンウェイト または ビジーウェイト

(19)

スピンロック

(20)

セマフォ

•

Mutex (Lock/Unlock)は⼀つの共有資源に対する

相互排他

•

セマフォ︓複数共有資源の管理

–

P操作︓資源を取得するときの操作

–

V操作︓資源を開放するときの操作

P(i) Si ← Si -1 Si <0? P(i)を発行した プロセスを続行 No P(i)を発行したプロ セスを資源iに対する 待ち行列Q(i)に入れて 待機状態にする Yes (a) 資源iに対するP操作 V(i) Si ← Si+1 Si≦0? 終了 No 資源iに対する待ち 行列Q(i)からプロセス を取り出し実行 Yes (b) 資源iに対するV操作

(21)

セマフォ(1)

(22)
(23)

セマフォ(3)

(24)
(25)

同期のためのハードウェアとソフトウェアとの協調

•

同期の必要性(排他制御)

•

排他制御のための基本ソフトウェア関数と仕

組み

–

ミューテックス(ロックとアンロック)

–

セマフォ

•

基本ソフトウェア関数の実現

–

必須のハードウェア機構︓アトミック命令

–

アトミック命令の例とロックの実現

•

スワップ

•

ロードリンクト・ストアコンディショナル

Page 25

(26)

アトミックなメモリアクセスとは

•

アトミックなメモリアクセスとは︓

メモリへの「読み」と「書き」の処理

が他のプロセッサからの処理に割り込

まれずに⾏われること

•

右図で、共有リソースの使⽤権を得る

ために、「未使⽤」を⼀つだけ準備し、

これを読んだCPUが使⽤権を得るとす

る

(使⽤権を得たならば「使⽤中」と書

き換え、終了後「未使⽤」に戻す)

•

①→②→③→④の順で処理が⾏われれ

ばCPU1が使⽤権を得て、CPU2は使⽤

中を読むので問題は起こらない

•

もしも①→②の間に③の処理が割り込

むとCPU1,2の両⽅が使⽤権を得る

•

このようなことが起こらないような

ハードウェアサポートが重要であり、

プロセッサは「アトミックなメモリア

クセス」を⾏うための命令を持つ

CPU1 CPU2 未使用 使用中 使用中 ① ② ③ ④ 共有リソース

(27)

アトミック命令の例(ARMのSWAP)

SWAP reg, [Addr]

•

レジスタ値(reg)とメモリ値([Addr])とのアトミックな交換

–

Lock Example ([0x60] = 0: Not Use, 1: Used)

L1: mov r1,#1

swap r1,[0x60]

jeq r1,#1,L1

–

Unlock Example

mov r1,#0

st r1,[0x60]

27 CPU1 DSP Mem HW Not Use Used Used 0x60

(28)

Lock --- Example 1

CPU DSP Mem HW

[0x60]=0

Unlock

r1=1

L1: mov r1,#1

(29)

Lock --- Example 1

29 CPU DSP Mem HW

[0x60]=0→1

r1=1→0

swap r1,[0x60]

Lock!

Get Lock!

(30)

Lock --- Example 1

CPU DSP Mem HW

[0x60]=1

Lock!

r1=0

jeq r1,#1,L1

Go Ahead!

(31)

Lock --- Example 2

31 CPU DSP Mem HW

[0x60]=1

Lock

r1=1

L1: mov r1,#1

(32)

Lock --- Example 2

CPU DSP Mem HW

[0x60]=1→1

Lock

r1=1→1

swap r1,[0x60]

(33)

Lock --- Example 2

33 CPU DSP Mem HW

[0x60]=1

Still Locked

r1=1

jeq r1,#1,L1

Cannot Get Lock,

Return to L1

(Loop Until CPU

(34)

Unlock --- Example

CPU DSP Mem HW

[0x60]=1

Lock

r1=0

mov r1,#0

(35)

Unlock --- Example

35 CPU DSP Mem HW

[0x60]=1

Unlock

r1=0

st r1,[0x60]

0

0

Store to [0x60]

(36)

Swap --- Why Swap?

CPU DSP Mem HW

[0x60]=0→1

Unlock

r1=1→0

swap r1,[0x60]

(37)

Swap --- Whatʼs Swap?

37 CPU DSP Mem HW

[0x60]=0

Unlock

r1=1

swap r1,[0x60]

0

1

0

1

Load from [0x60]

Store to [0x60]

(38)

Resource Conflict (3)

•

Why is SWAP necessary?

If LD/ST instructions are used instead of

SWAP,

• Case: P1 and P2 require a resource at the same time

(P1) LD r1,[0x60]

; P1 loads value 0

(P2) LD r1,[0x60]

; P2 loads value 0 as

well

Both Processors get the right!

• Case: P1’s Lock and P2’s Unlock happens at the same

time

(P1) LD r1,[0x60] ; P1 loads value 1

(P2) ST r1,[0x60] ; P2 stores value 0

(P1) ST r1,[0x60] ; P1 stores value 1

P1 overwrites the unlock by P2.

(39)

Swap --- Case 1

39 CPU DSP Mem HW

[0x60]=0

Unlock

r1=1

0

0

(P1) Load from [0x60]

(P2)Load from [0x60]

0

Get Lock!

Get Lock!

(40)

Swap --- Case 1

CPU DSP Mem HW

[0x60]=0

Unlock

r1=1

0

1

0

1

(P1) Load from [0x60]

Store to [0x60]

(P2)Load from [0x60]

0

Go Ahead!

Go Ahead!

Lock!

(41)

Swap --- Case 2

41 CPU DSP Mem HW

[0x60]=1

Lock

r1=0

Trying to

Get Lock

(42)

Swap --- Case 2

CPU DSP Mem HW

[0x60]=1

Lock

r1=1

1

(P1) Load from [0x60]

Cannot Get Lock!

(43)

Swap --- Case 2

43 CPU DSP Mem HW

[0x60]=1

Lock

r1=1

1

(P1) Load from [0x60]

Cannot Get Lock!

P2 Releases Lock!

Unlock!

(P2)Store to [0x60]

0

0

(44)

Swap --- Case 2

CPU DSP Mem HW

[0x60]=1

Lock

r1=1

1

(P1) Load from [0x60]

P2 Doesn

’t have Lock.

Unlock!

(P2)Store to [0x60]

0

0

1

(P2) Store to [0x60]

1

Lock!

Nobody can lock ANYMORE!

Loop

INFINITELY!

(45)

アトミック命令を実現するためのハードウェア

•

CPU1上のSW1がメモリの値を読んで(①)、書き終わ

る(②)までCPU2はメモリアクセスできない

•

メモリシステムのロック

–

CPUはバスに対して「ロックアクセス」を⾏うことができ、そ

の間他のCPUはバスにアクセスできない

–

⼤きな負荷となる

Page 45 CPU1 CPU2 キャッシュ SW1 SW2 CPU1 CPU2 未使用 ( 0 ) 使用中 ( 1 ) 使用中 ( 1 ) ① ② ③ ④ 共有リソース

(46)

ロードリンクト、ストアコンディショナル (LLSC)

•

LLbit ・・・特殊なハードウェア機構。address で⽰さ

れたメモリ領域の排他状態を保持する

•

LLbitはLL 命令において排他状態に設定され,SC 命令

においてこれを⽤いて同じプロセッサからの同じ共有変

数に対するSC 命令のみが成功するように動作する.

•

ハードウェアのロックがない

(47)

ロードリンクト、ストアコンディショナル (LLSC)

(48)

参照

関連したドキュメント

ERROR  -00002 認証失敗または 圏外   クラウドへの接続設定及びア ンテ ナ 接続を確認して ください。. ERROR  -00044 回線未登録または

据付確認 ※1 装置の据付位置を確認する。 実施計画のとおりである こと。. 性能 性能校正

第12条第3項 事業者は、その産業廃棄物の運搬又は処分を他 人に委託する場合には、その運搬については・ ・ ・

  他人か ら産業廃棄物 の処理 (収集運搬、処 分)の 委託を 受けて 、その

可搬型設備は、地震、津波その他の 自然現象、設計基準事故対処設備及び

なお、2011 年度のコスト削減額の実績は、緊急特別事業計画で掲げた 434 億円を 12 億円 上回る 446

可搬型設備は,地震,津波その他の 自然現象,設計基準事故対処設備及び

引き続き、中間処理業者の現地確認を1回/3年実施し評価を実施す