문장 수준 동시성과 정리

태스크를 만들지 않고도 여러 프로세서를 쓸 수 있을까?

문장 수준 동시성

반복들을 나눠서 한꺼번에

지금까지의 동시성은 태스크, 곧 서브프로그램 크기의 단위였습니다. 문장 수준 동시성은 그보다 작습니다. 반복문의 반복들 같은 문장들을 여러 프로세서에 나눠 동시에 실행합니다.

반복 8번과 프로세서 4개는 예시입니다. 이때 프로세서끼리 주고받는 통신을 줄이는 것이 목표입니다.

고성능 포트란

지시문으로 알리는 셋

고성능 포트란(High-Performance Fortran)은 과학 계산용 언어 포트란에 덧붙인 확장입니다. 프로그래머가 지시문으로 알려 주면 컴파일러가 프로세서가 여럿인 컴퓨터에 맞춰 줍니다.

컴파일러는 소스 코드를 기계어로 번역하는 프로그램입니다. 지시문(directive)은 실행되는 코드가 아니라 컴파일러에게 건네는 말입니다.

DISTRIBUTE

배열을 어떻게 나눠 줄까

DISTRIBUTE 지시문은 배열의 요소를 프로세서들의 메모리에 나눠 줍니다. BLOCK은 이어진 덩어리째로, CYCLIC은 하나씩 돌아가며 줍니다.

배열은 값 여러 개를 줄지어 담은 것이고 요소는 그 값 하나입니다. 요소 8개와 프로세서 4개는 예시입니다. 프로세서 수는 PROCESSORS 지시문으로 정합니다.

ALIGN

짝은 같은 프로세서에

ALIGN 지시문은 한 배열의 요소를 다른 배열의 요소와 같은 프로세서에 놓습니다. 함께 계산할 값이 한곳에 있으면 프로세서 사이의 통신이 줄어듭니다.

이 강의가 따르는 교재의 배열은 요소가 500개와 501개이고, 그림은 앞의 몇 개만 그렸습니다. 실제로는 줄 앞에 !HPF$를 붙입니다.

FORALL

다 계산한 뒤에 대입

FORALL 문은 동시에 실행해도 되는 문장들을 지정합니다. 이 예는 등호 오른쪽 1,000개를 먼저 다 계산한 다음에 대입(값을 넣는 일)이 이루어지도록 정해 둡니다.

예시: list(i) = list(i-1)처럼 오른쪽이 같은 배열을 읽으면, 하나씩 대입할 때 이미 바뀐 값을 읽게 됩니다. 1:1000은 1부터 1000까지입니다.

정리 1

동시성은 어디서, 어떻게

동시 실행은 명령, 문장, 서브프로그램 수준에서 일어납니다. 프로세서가 여럿이면 물리적 동시성, 하나가 번갈아 실행하면 논리적 동시성입니다.

서브프로그램 수준의 동시성에는 경쟁 동기화와 협력 동기화, 두 가지가 필요합니다.

정리 2

동기화 장치 넷

세마포어는 가장 기본이지만 빠뜨리기 쉽고, 모니터는 경쟁 동기화를 대신 해 주며, 메시지 전달은 가장 일반적인 모델입니다. 자바와 C#은 스레드로 동시성을 지원합니다.

고성능 포트란은 문장 수준에서, 데이터를 프로세서들에 어떻게 나눌지 지정하는 지시문을 줍니다.

다음 강의

13강은 예외 처리와 이벤트 처리입니다. 실행 중에 생긴 오류와 사건을 다룹니다

12강 끝목록으로 돌아가기