Chapter 12 : 병렬 프로그래밍과 병렬처리

Download Report

Transcript Chapter 12 : 병렬 프로그래밍과 병렬처리

1
Chapter 13 – 병렬 프로그래밍과 병렬 처리
Outline
13.1 병렬 처리 소개
13.2 병렬 처리와 프로그래밍 언어
13.3 세마포어
13.4 모니터
13.5 메시지 전달 기법
13.6 실시간 언어
2
13.1 병렬 처리 소개
• 병렬 처리(parallel processing)
– 다수의 프로세서들이 여러 개의 프로그램들 또는 한 프로그램의 분할된
부분들을 동시에 처리하는 기술
• 병렬 프로그래밍에 대한 연구
 병렬 프로그래밍 언어 자체에 대한 연구
Ada, Occam, Concurrent Pascal
 병렬 컴파일러에 관한 연구
3
13.1 병렬 처리 소개
• 컴퓨터 시스템을 분류 - Flynn의 분류
– 스트림
• 하나의 프로세서에 의하여 순서대로 처리되는 일련의
명령어들과 데이터들의 흐름
– Flynn에 의한 네 가지 분류
•
•
•
•
SISD(Single-instruction Single-data)
SIMD(Single-instruction Multiple-data)
MISD(Multiple-instruction Single-data)
MIMD(Multiple-instruction Multiple-data)
4
13.1 병렬 처리 소개
• 컴퓨터 시스템을 분류 - Flynn의 분류
– 병렬 처리 컴퓨터는 SIMD와 MIMD
프로그램
제어 프로세서
프로세서
자료
프로세서
자료
...
...
프로그램
프로그램
...
프로그램
프로세서
프로세서
...
프로세서
자료
자료
...
자료
프로세서
자료
5
13.1 병렬 처리 소개
•
MIMD 형태의 병렬 처리 컴퓨터는 프로세서들이 메모리를 사용하는 방식
– 공유 메모리 구조(shared-memory architecture)
– 분산 메모리 구조(distributed-memory architecture)
6
13.1 병렬 처리 소개
•
공유 메모리 구조
프로세서
프로세서
프로세서
주기억 장소
공유 메모리 구조의 형태
•
공유 메모리 구조에서 일반적으로 사용되는 상호 연결망
– 버스(Bus)
– 크로스바 스위치(Crossbar Switch)
– 다단계 상호 연결망(Multistage Interconnection Network:MIN)
7
13.1 병렬 처리 소개
• 분산 메모리 구조(1)
주기억 장소
프로세서
주기억 장소
주기억 장소
프로세서
프로세서
주기억 장소
주기억 장소
프로세서
프로세서
분산 메모리 구조의 형태
– 초기의 병렬 처리 컴퓨터
• 메시지 전달(message passing) 방식
8
13.1 병렬 처리 소개
• 분산 메모리 구조(2)
– 분산 메모리 구조에서 사용되는 상호 연결망
•
•
•
•
•
•
•
•
•
선형 배열 구조
원형 구조
성형 구조
트리 구조
메시(mesh) 구조
시스톨릭(systolic) 구조
완전 연결(completely connected) 구조
코달 원형(chordal ring) 구조
하이퍼큐브(hypercube)
9
13.2 병렬 처리와 프로그래밍 언어
• 병렬, 병행
• 병행성의 표현
① 문제가 지니고 있는 고유의 병행성을 자연스럽게 표현
② 효율적인 병행 기계어 프로그램으로 번역
• 병렬 구조 모델
① 언어들이 분산 모델을 가정하고 통신 기능을 제공
② 공유 기억 장소 모델과 상호 배제를 위한 기능들을 사용
10
13.2 병렬 처리와 프로그래밍 언어
• 대표적 예제
– 유한 버퍼 문제(the bounded buffer problem)
– 병렬 행렬 곱셈(parallel matrix multiplication)
• 정수형 행렬 선언
VAR a,b,c:ARRAY[n,n] OF INTEGER
FOR i := 1 TO n DO
FOR j := 1 TO n DO
c[i,j] := 0;
FOR k := 1 TO n DO
c[i,j] := c[i,j] + a[i,k] * b[k,j];
END;
END;
END;
11
13.2 병렬 처리와 프로그래밍 언어
• 명시적인 언어 기능을 사용하지 않는 병렬 프로그래밍
– 묵시적으로 본래의 병렬성을 포함
• 함수형 언어, 논리형 언어, 객체 지향 언어
– 프로그래밍 언어에서 병렬 구조를 정의
• 번역기에게 프로그래머가 병렬성이 요구되는 프로그램의 부분을 명확히
지적할 수 있도록 컴파일러 옵션을 주는 것
– 병렬 처리를 할 수 있는 라이브러리를 제공
• m_set_procs, m_fork, m_kill_procs, m_get_myid
12
13.2 병렬 처리와 프로그래밍 언어
표 13.1 병렬 처리를 제공하는 라이브러리 사용의 예
#include <parallel/paralle.h>
#define SIZE 100
#define NUMPROCS 10
shared int a[SIZE][SIZE], b[SIZE][SIZE], c[SIZE][SIZE];
void main(void) {
int err;
int multiply();
m_set_procs(NUMPROCS);
m_fork(multiply);
m_kill_procs();
}
void multiply(void) {
int i,j,k;
for(i = m_get_myid(); i < SIZE; i += NUMPROCS)
for(j = 0; j < SIZE; ++j)
for(k = 0;k < SIZE; ++k)
c[i][j] += a[i][k] * b[k][j];
}
13
13.2 병렬 처리와 프로그래밍 언어
• 프로세스 생성과 소멸(1)
– 병렬 처리 메커니즘 지원
• 프로세스 생성 기능
– m_set_procs와 m_fork 라이브러리 프로시저
– 프로세스를 생성하는 방법
• 현 프로세스를 두 개 이상의 프로세스로 분리 사용.
– 같은 프로그램의 사본 사용
– 부모 프로세스, 자식 프로세스
– SIMD 구조와 유사
– SPMD(Single Program Multiple Data) 프로그래밍
• 각 코드 세그먼트 – 새 프로세스
– 각각의 다른 프로세스는 다른 코드를 가짐
– MPMD
– 전형적인 예(fork – join 모델)
14
13.2 병렬 처리와 프로그래밍 언어
• 프로세스 생성과 소멸(2)
– MPMD
•
•
•
•
MPMD 예 - fork-join 모델
다수의 자식 프로세스 생성(a fork)
모든 자식 프로세스 종결 기다림(a join)
UNIX 시스템 호출 fork()는 SPMD 프로세스 생성기
– fork-join 생성기가 아님(용어 혼돈)
• fork-join 모델을 MPMD 프로세스 생성기라 칭함
• 표 12.1 은 MPMD 예(m_kill_procs – join)
15
13.2 병렬 처리와 프로그래밍 언어
• 병렬 처리를 위한 세 가지 선택 방법
• 입상(granularity)크기에 따른 분류
① 명령어 수준의 병렬성- 작은 덩이
② 프로시저 수준의 병렬성 - 중간 덩이
③ 프로그램 수준의 병렬성- 큰 덩이
– 작은 덩이 : 입상 프로세스 생성 유지 오버헤드
– 큰 덩이 : 병렬성 부여 기회 소멸
16
13.2 병렬 처리와 프로그래밍 언어
• 프로세스 생성자(부모), 피생성자(자식)
– 구분가능(생성방법 관계없이)
• 프로세스 생성 기법 고려 사항
 자식 프로세스 수행 중
- 부모 프로세스 일시 중지 가능한가?
- 부모 프로세스 동시 실행 가능한가?
 기억 장소 공유 가능
- 부모 프로세스와 자식 프로세스
- 자식 프로세스들 사이
• 표 13.1 사용 예
-
부모 프로세스 일시 중지
- 전역 변수 a, b, c (shared 선언) – 모든 프로세스 공유
• 프로세스 종결 기법 제공
17
13.2 병렬 처리와 프로그래밍 언어
• 명령어 수준의 병렬성
parbegin
S1;
S2;
...
Sn;
parend
for i := 1 to n do parallel begin
for j := 1 to n do begin
forc[i,j]
j :=:=10;
to n do begin
c[i,j]
:= 10;
for
k :=
to n do begin
for k := 1c[i,j]
to n:=
doc[i,j]
begin
+ a[i,k] * b[k,j];
c[i,j] := c[i,j] + a[i,k] * b[k,j];
end; end;
end;
end;
end;
- 명령어 수준의 병렬성은 VHDL과 같은 하드웨어 기술 언어
18
13.2 병렬 처리와 프로그래밍 언어
• 프로시저 수준의 병렬성
• 한 프로시저 – 한 프로세스 대응
• 생성 소멸 기법 ( p : 프로시저, x : 프로세스)
1)
x := newprocess(p);
...
...
killprocess(x);
2) 선언문 사용
var x : process(p);
• X의 영역과 생성 종결 : 지역 변수와 유사
• Ada에서 이 기법 사용
19
13.2 병렬 처리와 프로그래밍 언어
• 프로그램 수준의 병렬성
– 프로세스 – 전체 프로그램
– MPMD 방식(자신의 사본을 생성 : 자식 프로세스)
– 예 : UNIX 의 fork()
•
•
•
•
호출 시점에 환경 상속
fork() 반환 값 – 부모(n:번호), 자식(0) 프로세스 구별
exit - 생성 프로세스 종료
wait - 프로세스 동기(부모 프로세스 일시 중지)
20
13.2 병렬 처리와 프로그래밍 언어
표 13.2
Fork 구조를 나타내는
C코드 예
#define SIZE 100
#define NUMPROCS 10
int a[SIZE][SIZE], b[SIZE][SIZE], c[SIZE][SIZE];
void main(void) {
int myid;
for (myid = 0; myid < NUMPROC; ++myid )
if(fork( ) == 0) {
multiply(myid);
exit(0);
}
for (myid = 0; myid < NUMPROCS; ++myid)
wait(0);
/* code to output c goes here */
}
void multiply(int myid)
{
int i,j,k;
for( i=myid; i < SIZE; i += NUMPROCS)
for ( j=0; j < SIZE; ++j) {
c[i][j] = 0;
for(k = 0; k<SIZE; ++k)
c[i][j] += a[i][k] * b[k][j];
}
}
21
13.2 병렬 처리와 프로그래밍 언어
• 병행 언어는 다음 사항들을 필요
① 병렬로 실행될 수 있는 코드 묶음을 한정
• 프로세스, 태스크, collateral절
② 프로세스의 실행 시작을 기술하는 방법
③ 공유 자료의 상호 배제를 보장하는 방법
④ 병행 프로그램들을 동기화 시킬 수 있는 수단이 제공
• 모니터의 대기-신호(wait-signal) 연산과 Ada의 랑데뷰(rendezvous)
⑤ 프로세스에 우선 순위를 부여하는 방법
⑥ 프로세스를 지정된 시간 동안 지연시키는 기법
22
13.3 세마포어
• Process
– Terminate (정해진 시간 안에 임계구역 실행 끝냄)
– Fair scheduling ( 한정된 시간 안에 임계구역 들어감)
• 임계구역 (critical region) – mutual exclusion 요구
• 세마포어 (semaphor) - Dijkstra 개발, Algol 68
– Binary valued variable : s
– 두 연산 wait(s), signal(s)
• Queue, fair scheduling 요구
wait(s) : if s = 1 then s := 0 else 프로세스 P를 큐에 저장
signal(s) : if queue  empty then 대기중인 프로세스 준비
else s:= 1
23
13.3 세마포어
표 13.3 Mutual Exclusion Using a Binary Semaphore
procedure READER
begin
...
wait(mutex)
DB에서 자료 읽음
signal(mutex)
...
end
procedure WRITER
begin
...
wait(mutex)
DB에 기록
signal(mutex)
...
end
24
13.3 세마포어
표 13.4 세마포어를 이용하여 해결한 생산자-소비자 문제
ok := 0 ; fin := 1
procedure PRODUCER
while 입력할 레코드가 있으면 do
wait(fin)
한 레코드를 버퍼에 채움
signal(ok)
end
procedure CONSUMER
loop
wait(ok)
버퍼에서 한 레코드를 읽어서 출력
signal(fin)
결과를 출력
repeat
end
25
13.3 세마포어
• Counting semaphore : ALGOL 68 (sema)
– 선언문 : sema mutex
Down mutex : if mutex = 0 then 실행이 블록됨
else mutex := mutex – 1
Up mutex : mutex := mutex + 1, mutex 때문에 블록된 프로그램
을 실행 제개함
• Collateral 문
– ( , ) 로 분리, begin – end 또는 ( ) 로 쌓임
begin
BEGIN
S1, S2, … , Sn
END
S1
S2
…
Sn
end
그림 13.5 Algol 68의 collateral statement
26
13.3 세마포어
• 병렬절(parallel clause)
표 13.5 Algol 68에서 해결한 생산자-소비자 문제
Begin
int buffer[50] ;
int I := 0, j := 0;
sema numberin := level 0, openspots := level 50 ;
par (do down openspots ;
I := I mod 50 + 1
read(buffer[I]) ;
up numberin ;
od
do down numberin ;
j := j mod 50 + 1;
print(buffer[j]) ;
up openspots ;
od)
end
27
13.4 모니터
• 모니터 (monitor)
• 공유 자료 접근 코드를 하나로 묶은 단위 프로그램
• Syntax
– SIMULA의 CLASS 비슷(추상 자료형 지원)
monitor name
begin
이 모니터의 지역 자료 선언
프로시저들 선언
지역 자료 초기화 코드
end name
선언된 프로시저 P를 호출하는데 다음과 같은 형식
name.P (실 매개변수들)
28
13.4 모니터
•
•
•
•
어느 주어진 시간에는 한 프로세스만이 모니터 프로시저를 실행시킴
Queue 구성 자동
Wait – signal
Concurrent Pascal (Brinch Hansen)
Modula (Wirth)
Mesa (Xerox)
CSP/K (Holt) – Concurrent SP/K
29
13.4 모니터
• CSP/K
– 선언문
name : procedure options (concurrent)
• Monitor 선언 (monitor안에 entry선언)
• Process선언
30
13.4 모니터
• 표 13.6 CSP/K 예
EXAMPLE: PROCEDURE OPTIONS(CONCURRENT)
CRITICAL: MONITOR
DECLARE (SUM) BINARY FIXED;
DO; SUM=0;
END;
COUNT: ENTRY;
SUM=SUM+1;
END;
WATCH: ENTRY;
PUT SKIP LIST(SUM);
SUM=0;
END;
END CRITICAL;
COUNTER: PROCESS;
...
CALL COUNT;
...
END COUNTER;
WATCHER: PROCESS;
...
CALL WATCH;
...
END WATCHER;
END EXAMPLE;
31
13.4 모니터
• Concurrent-Pascal(1)
–
–
–
–
프로세스, 모니터, 클래스 개념삽입
init, delay(wait), continue(signal)
자료형 : queue
프로세스 형식 (외부영역변수 상속불허)
type 프로세스이름 = process (형식 매개 변수들)
변수, 상수, 자료형, 프로시저 선언문들;
몸체
end
32
13.4 모니터
• Concurrent-Pascal(2)
– 모니터 형식
type 모니터이름 = monitor (형식 매개 변수들)
공유 변수들
지역 프로시저들
진입점을 갖는 프로시저들
begin
초기화 코드
end
– entry 선언 procedure
procedure entry controldisk(var x: buffer)
33
13.4 모니터
• Concurrent-Pascal(3)
– 프로세스 선언과 초기화
var X:(프로세스 이름)
init X(실매개 변수)
– 모니터 선언과 초기화
var p, q: 모니터 이름;
을 선언한 후, 문장
init q(실매개변수들)
34
13.4 모니터
표 13.7 Concurrent-Pascal의 생산자-소비자 문제
type buffer = array (1..80) of char,
producer = process
var card : buffer
begin
card(1) := ‘N’
while card(1) <> ‘E’ do
begin read(card); spool(card) end
end;
consumer = process
var line : buffer
begin
line := ‘N’
while line <> ‘E’ do
begin unspool(line); write(line) end
end;
35
13.4 모니터
cbuffer = monitor
var pool : array(1..5) of buffer
front, read, nobuf, noful : interger
procedure entry spool(contents : buffer)
begin if noful = nobuf then delay;
pool(rear) := contents
rear := rear mod nobuf +1;
noful := noful +1;
continue
end;
procedure entry unspool(contents : buffer)
begin if noful = 0 then delay;
contents := pool(front);
front := front mod nobuf +1;
noful := noful –1;
continue
end;
begin front := 1; rear := 1; nobuf := 5; oful := 0
end
var x: producer, y : consumer, z :
cbuffer
begin
init x, y, z
end.
36
13.4 모니터
• 모니터
– 병행 프로세스들이 자원을 액세스하지 못하도록 자원들의 집합 둘레에
벽을 만드는 기법
– 프로그래머에게 세 가지 설비를 제공
① 모니터 안에 정의된 프로시저를 호출하는 방법
② 외부에서의 다양한 호출에 대한 스케줄링 방법
- 일반적으로 큐 사용
③ 모니터를 호출한 프로세스들의 대기와 실행 계속을 허용하는 기법
- 예) wait-signal 또는 delay-continue문
37
13.5 메시지 전달 기법
• Processor들의 network 구축 (최근)
• Monitors
– 단일 processor 또는 공동기억장소사용 다중 processor
• 분산형 병행처리언어
– Brinch Hansen : DP , Hoare : CSP
• DP, CSP
– 병행 프로그램의 실행 단위로 프로세스 선택
– 프로세스들 간의 통신 : 메시지
– 느슨히 결합된 분산 네트워크
38
13.5 메시지 전달 기법
• CSP 에서 프로세서 P
Q! action(x)
// Q 프로세스에 메시지 송신 //
P? action(y) // 프로세스 P로부터 메시지 수신 //
– action : 메시지 형태 지정 (형태)
• DP : Brinch-Hansen
call Q.R(input # output) // 프로세스 Q의 프로시저 R를 실행 //
- input : 실입력 매개 변수
- output : 프로세스 Q에서 값을 받기 위해 사용된 매개 변수
procedure R(입력매개변수들 # 출력매개변수들) // Q에서 프로시저 R선언
39
13.5 메시지 전달 기법
• 동기화 문제
– CSP, Ada, DP
• 보호 명령어(Guarded command)
– non-deterministic 지원
• CSP 프로세스 선언
[p :: commands | q :: commands]
- ‘|’ : p,q 프로세스, 병행 수행 가능
• 보호 조건을 사용할 수 있는 문장
 택일 명령문(alternative command)
 반복 명령문(repetitive command)
40
13.5 메시지 전달 기법
• 택일 명령문
[ x > 0  y := +1 | x < 0  y := -1 | x=0  y := 0 ]
• CSP 반복 명령문
i := 1; *[ i <= n; A(i)  0  A(i) := b(i) / A(i) ]
- i가 1에서 n까지 배열 A(i)가 0인 경우를 제외한 모든
A(i)의 요소들을 B(i)/A(i)로 배정
• DP의 Guard 문
– When B1 : S1 | B2 : S2 | . . . End
• 조건이 참인것이 있을 때까지 기다림
– cycle B1 : S1 | B2 : S2 | . . . End
• B1 - Bn 의 조건 중 하나 이상이 참인 경우 무한 반복
슬라이드 쇼가 끝났습니다.
41
42
용 어 정리
43
임계 구역 (critical section)
용어 국제 표준 규격 15.04.02
critical section
임계 구역
A portion of a task during the execution of which other parts of this or other tasks are
prohibited from execution.
어떤 태스크의 일부분으로 이 부분을 실행 시에는 이 태스크의 다른 부분이나 다른
태스크들의 실행이 금지된다.
44
세마포어 (semaphore)
용어 국제 표준 규격 15.07.06
semaphore
세마포어
A data structure for controlling, by means of a queue, access to the resources that are
available to more than one task, but only to one task at a time.
두 개 이상의 태스크가 사용 가능한 자원에 접근을 큐로써 제어하기 위한 자료
구조이다. 그러나 어느 한 시간에 오직 하나의 태스크만이 사용 가능하다.
45
모니터 (monitor)
용어 국제 표준 규격 15.07.07
monitor (in programming language)
모니터(프로그래밍 언어에서)
A shared data object together with a set of operations that may manipulate the data
object in order to control requests for resources or access to the resources that are
available to parallel processes, but only to one process at a time.
자원 요청을 제어하기 위하여, 또는 병렬 프로세스들이 한번에 한 개씩 이용할 수 있게
자원에 접근하도록, 자료 객체를 다룰 수 있는 연산들의 집합을 가진 공유 자료 객체.