Outline PLSI 시스템접속병렬처리병렬프로그래밍개요 OpenMP를이용한병렬화 MPI를이용한병렬화순차코드의병렬화

Similar documents
<4D F736F F F696E74202D FC0CFB9DD5FBAB4B7C4C7C1B7CEB1D7B7A1B9D62E >

국가슈퍼컴퓨팅 공동활용체제구축

Microsoft Word - 3부A windows 환경 IVF + visual studio.doc

PowerPoint Presentation

Parallel Programming 박필성 IT 대학컴퓨터학과

6주차.key

슬라이드 1

fprintf(fp, "clf; clear; clc; \n"); fprintf(fp, "x = linspace(0, %d, %d)\n ", L, N); fprintf(fp, "U = [ "); for (i = 0; i <= (N - 1) ; i++) for (j = 0

Microsoft PowerPoint - 병렬표준.pptx

2011 PLSI 병렬컴퓨팅경진대회문제 01. 대학원팀 02. 학부팀 - 경진내용 - 경진환경 주어진순차코드를병렬화하여성능향상도 ( 획득점수 ) 를측정 점수 = ( 순차코드수행시간 ) / ( 병렬화코드수행시간 ) 프로그래밍언어 : C, Fortran 순차코드는 50 라

Parallel Programming & MPI 박필성 수원대학교 IT 대학컴퓨터학과

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

PowerPoint 프레젠테이션

untitled

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - chap01-C언어개요.pptx

Microsoft PowerPoint - [2009] 02.pptx

untitled

Microsoft PowerPoint - chap12-고급기능.pptx

Figure 5.01

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

금오공대 컴퓨터공학전공 강의자료

Microsoft PowerPoint - chap10-함수의활용.pptx

Microsoft PowerPoint - chap11-포인터의활용.pptx

Microsoft PowerPoint - chap06-2pointer.ppt

SRC PLUS 제어기 MANUAL

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

11장 포인터

목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

SMB_ICMP_UDP(huichang).PDF

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

PowerPoint 프레젠테이션

Microsoft Word - cover.docx

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

Microsoft PowerPoint - additional01.ppt [호환 모드]

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

Chapter #01 Subject

OCW_C언어 기초

[Brochure] KOR_TunA


차례. MPI 소개. MPI 를이용한병렬프로그래밍기초. MPI 를이용한병렬프로그래밍실제 4. MPI 병렬프로그램예제 l 부록 : MPI- l 용어정리 / 참고자료 Supercomputing Center 제 장 MPI 소개 MPI 를소개하고 MPI 를이해하는데 필요한기본

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

설계란 무엇인가?

Microsoft PowerPoint - 사용자지침서2

슬라이드 1

<4D F736F F F696E74202D203137C0E55FBFACBDC0B9AEC1A6BCD6B7E7BCC72E707074>

<C6F7C6AEB6F5B1B3C0E72E687770>

강의10

11장 포인터

MAX+plus II Getting Started - 무작정따라하기

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

Microsoft PowerPoint - chap-11.pptx

PowerPoint 프레젠테이션

슬라이드 1

PowerPoint 프레젠테이션

API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Docum

MS-SQL SERVER 대비 기능

Oracle9i Real Application Clusters

이도경, 최덕재 Dokyeong Lee, Deokjai Choi 1. 서론

Microsoft PowerPoint - chap03-변수와데이터형.pptx

PowerPoint Presentation

02장.배열과 클래스

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

Microsoft PowerPoint - 알고리즘_5주차_1차시.pptx

1. What is AX1 AX1 Program은 WIZnet 사의 Hardwired TCP/IP Chip인 iinchip 들의성능평가및 Test를위해제작된 Windows 기반의 PC Program이다. AX1은 Internet을통해 iinchip Evaluation

PowerPoint 프레젠테이션

1 장 C 언어복습 표준입출력배열포인터배열과포인터함수 const와포인터구조체컴파일러사용방법 C++ 프로그래밍입문

Microsoft PowerPoint - o8.pptx

<C0CCBCBCBFB52DC1A4B4EBBFF82DBCAEBBE7B3EDB9AE2D D382E687770>

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

C++-¿Ïº®Çؼ³10Àå

Integ

제 11 장포인터 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

슬라이드 1

Raspbian 설치 라즈비안 OS (Raspbian OS) 라즈베리파이 3 Model B USB 마우스 USB 키보드 마이크로 SD 카드 마이크로 SD 카드리더기 HDM I 케이블모니터

API 매뉴얼

untitled

Microsoft PowerPoint - chap04-연산자.pptx

슬라이드 1

Microsoft Word - ExecutionStack

02 C h a p t e r Java

C# Programming Guide - Types

Microsoft PowerPoint - o4.pptx

제1장 Unix란 무엇인가?

PowerPoint 프레젠테이션

chap 5: Trees

PowerPoint 프레젠테이션


컴파일러

untitled

KNK_C_05_Pointers_Arrays_structures_summary_v02

chap10.PDF

T100MD+

Microsoft PowerPoint - chap06-5 [호환 모드]

10주차.key

Transcription:

병렬프로그래밍 정진우

Outline PLSI 시스템접속병렬처리병렬프로그래밍개요 OpenMP를이용한병렬화 MPI를이용한병렬화순차코드의병렬화

PLSI 시스템개요

PLSI 사업과 PLSI 자원 PLSI 사업 (PLSI Project) 국내슈퍼컴퓨터자원을국가적차원의체계적인연동과관리를통해효율적으로사용할수있도록지원하는사업 PLSI is a national project to support that Korean national supercomputing resources can be used effectively through the systematic integration and management PLSI 자원 (PLSI Resources) PLSI 사업을통하여구축된고성능전용네트워크기반의슈퍼컴퓨터통합인프라 PLSI resources is an integrated supercomputing infrastructure based on the dedicated high performance network built by PLSI project

PLSI 자원현황 PLSI 자원연동구성 최소 1Gbps 수준의전용네트워크로국내주요슈퍼컴퓨팅센터의컴퓨팅자원을연동 글로벌파일시스템공유및글로벌스케줄링이가능 슈퍼컴전용라인슈퍼컴전용트래픽 KIST 서울대 건국대 서울시립대 UNIST 서울 Supercom_C3560 ACL Supercom C3560 ACL Supercom Ex4200 Supercom ACL ACL Supercom_C3560 ACL 울산 대전 광주 KISTI ACL KOBIC ACL Login Node PLSI _C6509 FireWall IDS Supercom_EX4200 ACL ACL Supercom_C3560 ACL GIST Supercom_C4006 ACL Supercom_C4006 Supercom_C3560 동명대 KREONET 부산대부경대 부산

PLSI 자원현황 PLSI 자원통합소프트웨어스택 각연동시스템은아래와같은통합소프트웨어스택이모두설치 이를통해연동된시스템어디서나추가적인인증이나데이터이전과정없이단일배치작업스케줄러 명령을사용하여작업의제출 모니터링 제어및여러시스템에걸친연계작업의원활한수행이가능 사용자 통합작업실행환경제공 ( 시스템접속 / 컴파일 / 작업실행 ) 윈도우클러스터통합구성요소 응용소프트웨어 [Fluent, Gaussian, VASP, GAMESS ] 컴파일러 / 디버거 병렬 API 라이브러리 통합소프트웨어스택 사용자접속 PLSI Portal SSH/X11 Remote Desktop 통합계정 LDAP Nagios 통합모니터링 글로벌스케줄러 LoadLeveler-MC GPFS-MC 글로벌공유파일시스템 프로그래밍환경 MPI [MPICH/MVAPICH/OpenMPI) 시스템통합 이기종시스템환경 컴파일러 [GCC/PGI/Intel/IBM/MS] Supercomputing 라이브러리 Infrastructure / 디버거 운영체제 AIX 5.3 CentOS 4/5 RHEL AS 3.4 SUSE ES9 Windows Server 2008 시스템 IBM POWER5 server IBM PowerPC Cluster X86-64 Cluster IA-64 Cluster 연동네트워크 [1GbE]

PLSI 시스템접속

PLSI 사용자포털서비스 (PLSI User Portal Service) URL : http://portal.plsi.or.kr 개요 슈퍼컴퓨터의자원활용을극대화하기위해개발된웹기반통합포털서비스 사용자들의슈퍼컴퓨터연동자원사용에편의를우선적으로고려 주요서비스기능 온라인계정신청및처리상태조회 PLSI 연동시스템의 H/W, S/W 정보확인 연동자원및작업현황모니터링수행 PLSI 연동시스템간사용자작업환경제공 웹기반의 SSH, SFTP 프로그램제공 계정및과금정보확인 공지사항, FAQ, 기술지원상담, 자료실등의고객서비스지원

PLSI 포털로그인 PlSI 계정과연동, 동일한 ID/Pass 로접속 PLSI 계정로그인

SSH 접속 컴퓨팅서비스 -> 쉘접속클릭

JRE 설치및애플릿실행

Xming - X11 forwarding 을위한 XLancher Site Download : http://sourceforge.net/search/?type_of_search=soft&wo rds=xming 사용방법 실행파일다운로드받은후설치 XLanuch 실행

Xming - X11 forwarding 을위한 XLancher» select Multiple windows

Xming - X11 forwarding 을위한 XLancher

Xming - X11 forwarding 을위한 XLancher

Xming - X11 forwarding 을위한 XLancher Xming 실행 GUI X11(X or Xwindow)

PuTTY ssh 원격접속클라이언트 Site Homepage : http://www.putty.nl/ Download : http://putty.nl/latest/x86/putty.exe Manual : http://www.putty.nl/0.60/htmldoc/ 사용방법 웹브라우저에 http://putty.nl/latest/x86/putty.exe 를입력후 putty.exe 를다운로드 다운로드받은 putty.exe 를실행

PLSI 시스템접속 - ssh 를통한접속방법 SSH 접속터미널사용하여로그인노드로접속한다. 사용자 : 1022port 로신청서에기술된사용자접속허용 IP 만접속이허용된다. [Linux/unix 사용자 ] 로그인주소 : login01.plsi.or.kr (150.183.146.110) login02.plsi.or.kr (150.183.146.111) $ssh -l plsiuser -p 1022 login01.plsi.or.kr $ssh -l plsiuser -p 1022 login02.plsi.or.kr [windows 사용자 ] putty 나 SSH Secure Shell Client 등의 ssh 접속유틸리티를이용한다. 프로그램은인터넷을통해무료로다운받을수있다.

PLSI 시스템접속 - ssh 를통한접속방법 1022 login01.plsi.or.kr PLSI Host Name : 접속할원격지주소입력 login01.plsi.or.kr Port : 1022 SSH 선택 Saved Sessions : 설정저장 Open : 접속실행

PLSI 시스템접속 - ssh 를통한접속방법 localhost:0.0 그래픽을사용하기위해선 SSH -> X11 탭에서 Enable X11 forwarding 체크 X display location : localhost:0.0

병렬프로그래밍개요

병렬처리 (1/3) 병렬처리란, 순차적으로진행되는계산영역을 여러개로나누어각각을여러프로세서에서 동시에수행되도록하는것

병렬처리 (2/3) 순차실행 병렬실행 Inputs Outputs

병렬처리 (3/3) 주된목적 : 더욱큰문제를더욱빨리처리하는것 프로그램의 wall-clock time 감소 해결할수있는문제의크기증가 병렬컴퓨팅계산자원 여러개의프로세서 (CPU) 를가지는단일컴퓨터 네트워크로연결된다수의컴퓨터

왜병렬인가? 고성능단일프로세서시스템개발의제한 전송속도의한계 ( 구리선 : 9 cm/nanosec) 소형화의한계 경제적제한 보다빠른네트워크, 분산시스템, 다중프로세서시스템 아키텍처의등장 è 병렬컴퓨팅환경 상대적으로값싼프로세서를여러개묶어동시에사용함 으로써원하는성능이득기대

프로그램과프로세스 프로세스는보조기억장치에하나의파일로서저장되어 있던실행가능한프로그램이로딩되어운영체제 ( 커널 ) 의 실행제어상태에놓인것 프로그램 : 보조기억장치에저장 프로세스 : 컴퓨터시스템에의하여실행중인프로그램 태스크 = 프로세스

프로세스 프로그램실행을위한자원할당의단위가되고, 한프로 그램에서여러개실행가능 다중프로세스를지원하는단일프로세서시스템 자원할당의낭비, 문맥교환으로인한부하발생 문맥교환 어떤순간한프로세서에서실행중인프로세스는항상하나 현재프로세스상태저장 à 다른프로세스상태적재 분산메모리병렬프로그래밍모델의작업할당기준

스레드 프로세스에서실행의개념만을분리한것 프로세스 = 실행단위 ( 스레드 ) + 실행환경 ( 공유자원 ) 하나의프로세스에여러개존재가능 같은프로세스에속한다른스레드와실행환경을공유 다중스레드를지원하는단일프로세서시스템 다중프로세스보다효율적인자원할당 다중프로세스보다효율적인문맥교환 공유메모리병렬프로그래밍모델의작업할당기준

프로세스와스레드 하나의스레드를갖는 3 개의프로세스 3 개의스레드를갖는하나의프로세스 스레드 프로세스

병렬성유형 데이터병렬성 (Data Parallelism) 도메인분해 (Domain Decomposition) 각태스크는서로다른데이터를가지고동일한일련의계산을수행 태스크병렬성 (Task Parallelism) 기능적분해 (Functional Decomposition) 각태스크는같거나또는다른데이터를가지고서로다른계산을수행

데이터병렬성 (1/3) 데이터병렬성 : 도메인분해 Problem Data Set Task 1 Task 2 Task 3 Task 4

데이터병렬성 (2/3) 코드예 ) : 행렬의곱셈 (OpenMP) DO K=1,N DO J=1,N DO I=1,N Serial Code C(I,J) = C(I,J) + END DO END DO END DO (A(I,K)*B(K,J)) Parallel Code!$OMP PARALLEL DO DO K=1,N DO J=1,N DO I=1,N C(I,J) = C(I,J) + END DO END DO END DO A(I,K)*B(K,J)!$OMP END PARALLEL DO

데이터병렬성 (3/3) 데이터분해 ( 프로세서 4 개 :K=1,20 일때 ) Process Iterations of K Data Elements Proc0 K = 1:5 Proc1 K = 6:10 Proc2 K = 11:15 Proc3 K = 16:20 A(I,1:5) B(1:5,J) A(I,6:10) B(6:10,J) A(I,11:15) B(11:15,J) A(I,16:20) B(16:20,J)

태스크병렬성 (1/3) 태스크병렬성 : 기능적분해 Problem Instruction Set Task 1 Task 2 Task 3 Task 4

태스크병렬성 (2/3) 코드예 ) : (OpenMP) Serial Code PROGRAM MAIN CALL interpolate() CALL compute_stats() CALL gen_random_params() END Parallel Code PROGRAM MAIN!$OMP PARALLEL!$OMP SECTIONS CALL interpolate()!$omp SECTION CALL compute_stats()!$omp SECTION CALL gen_random_params()!$omp END SECTIONS!$OMP END PARALLEL END

태스크병렬성 (3/3) 태스크분해 (3 개의프로세서에서동시수행 ) Process Proc0 Proc1 Proc2 Code CALL interpolate() CALL compute_stats() CALL gen_random_params()

병렬아키텍처 (1/2) Processor Organizations Single Instruction, Single Data Stream (SISD) Single Instruction, Multiple Data Stream (SIMD) Multiple Instruction, Single Data Stream (MISD) Multiple Instruction, Multiple Data Stream (MIMD) Uniprocessor Vector Processor Array Processor Shared memory (tightly coupled) Distributed memory (loosely coupled) Clusters Symmetric multiprocessor (SMP) Non-uniform Memory Access (NUMA)

병렬아키텍처 (2/2) 최근의고성능시스템 : 분산 - 공유메모리지원 소프트웨어적 DSM (Distributed Shared Memory) 구현 공유메모리시스템에서메시지패싱지원 분산메모리시스템에서변수공유지원 하드웨어적 DSM 구현 : 분산 - 공유메모리아키텍처 분산메모리시스템의각노드를공유메모리시스템으로구성 NUMA : 사용자들에게하나의공유메모리아키텍처로보여짐 ex) Superdome(HP), Origin 3000(SGI) SMP 클러스터 : SMP 로구성된분산시스템으로보여짐 ex) SP(IBM), Beowulf Clusters

병렬프로그래밍모델 공유메모리병렬프로그래밍모델 공유메모리아키텍처에적합 다중스레드프로그램 OpenMP, Pthreads 메시지패싱병렬프로그래밍모델 분산메모리아키텍처에적합 MPI, PVM 하이브리드병렬프로그래밍모델 분산-공유메모리아키텍처 OpenMP + MPI

공유메모리병렬프로그래밍모델 Single thread time S1 time S1 fork Multi-thread Thread P1 P1 P2 P3 P4 P2 P3 S2 join Shared address space P4 S2 Process Process

메시지패싱병렬프로그래밍모델 time Serial S1 time S1 S1 Messagepassing S1 S1 P1 P1 P2 P3 P4 P2 S2 S2 S2 S2 P3 Process 0 Process 1 Process 2 Process 3 P4 Node 1 Node 2 Node 3 Node 4 S2 Data transmission over the interconnect Process

하이브리드병렬프로그래밍모델 Message-passing time S1 fork Thread time S1 fork Thread P1 P2 P3 P4 S2 S2 join Shared address S2 S2 join Shared address Process 0 Node 1 Process 1 Node 2

DSM 시스템의메시지패싱 time S1 S1 S1 S1 P1 P2 P3 P4 Message-passing S2 S2 S2 S2 S2 S2 S2 S2 Process 0 Process 1 Process 2 Process 3 Node 1 Node 2

SPMD 와 MPMD (1/4) SPMD(Single Program Multiple Data) 하나의프로그램이여러프로세스에서동시에수행됨 어떤순간프로세스들은같은프로그램내의명령어들을수행하며그명령어들은같을수도다를수도있음 MPMD (Multiple Program Multiple Data) 한 MPMD 응용프로그램은여러개의실행프로그램으로구성 응용프로그램이병렬로실행될때각프로세스는다른프로세스와같거나다른프로그램을실행할수있음

SPMD 와 MPMD (2/4) SPMD a.out Node 1 Node 2 Node 3

SPMD 와 MPMD (3/4) MPMD : Master/Worker (Self-Scheduling) a.out b.out Node 1 Node 2 Node 3

SPMD 와 MPMD (4/4) MPMD: Coupled Analysis a.out b.out c.out Node 1 Node 2 Node 3

성능측정 성능에영향을주는요인들 병렬프로그램작성순서

프로그램실행시간측정 (1/2) time 사용방법 (bash, ksh) : $time [executable] $ time mpirun np 4 machinefile machines./exmpi.x real 0m3.59s user 0m3.16s sys 0m0.04s real = wall-clock time User = 프로그램자신과호출된라이브러리실행에사용된 CPU 시간 Sys = 프로그램에의해시스템호출에사용된 CPU 시간 user + sys = CPU time

프로그램실행시간측정 (2/2) 사용방법 (csh) : $time [executable] $ time testprog 1.150u 0.020s 0:01.76 66.4% 15+3981k 24+10io 0pf+0w 1 2 3 4 5 6 7 8 1 user CPU time (1.15초) 2 system CPU time (0.02 초 ) 3 real time (0 분 1.76 초 ) 4 real time 에서 CPU time 이차지하는정도 (66.4%) 5 메모리사용 : Shared (15Kbytes) + Unshared (3981Kbytes) 6 입력 (24 블록 ) + 출력 (10 블록 ) 7 no page faults 8 no swaps

성능측정 병렬화를통해얻어진성능이득의정량적분석성능측정 성능향상도 효율 Cost

성능향상도 (1/7) 성능향상도 (Speed-up) : S(n) 순차프로그램의실행시간 S(n) = 병렬프로그램의실행시간 (n개프로세서 ) = t s t p 순차프로그램에대한병렬프로그램의성능이득정도 실행시간 = Wall-clock time 실행시간이 100 초가걸리는순차프로그램을병렬화하여 10 개의프로세서로 50 초만에실행되었다면, è S(10) = 100 = 2 50

성능향상도 (2/7) 이상 (Ideal) 성능향상도 : Amdahl s Law f : 코드의순차부분 (0 f 1) t p = ft s + (1-f)t s /n 순차부분실행시간 병렬부분실행시간

성능향상도 (3/7) fts Serial section ts ( 1- f )t S Parallelizable sections 1 2 1 2 n- 1 n n processes n- 1 n tp ( 1- f ) t / S n

성능향상도 (4/7) t s S(n) = = t p t s ft s + (1-f)t s /n S(n) = 1 f + (1-f)/n 최대성능향상도 ( n à ) S(n) = 1 f 프로세서의개수를증가하면, 순차부분크기의역수에수렴

성능향상도 (5/7) f = 0.2, n = 4 Serial Parallel process 1 20 80 20 20 process 2 process 3 process 4 cannot be parallelized can be parallelized 1 S(4) = = 2.5 0.2 + (1-0.2)/4

성능향상도 (6/7) 프로세서개수대성능향상도 24 f=0 20 Speed-u up 16 12 8 4 f=0.05 f=0.1 f=0.2 0 0 4 8 12 16 20 24 number of processors, n

성능향상도 (7/7) 순차부분대성능향상도 16 14 Speed-u up 12 10 8 6 4 2 0 n=16 n=256 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 Serial fraction, f

효율 효율 (Efficiency) : E(n) t s S(n) n E(n) = = [ⅹ100(%)] t p ⅹn 프로세서개수에따른병렬프로그램의성능효율을나타냄 10개의프로세서로 2배의성능향상 : S(10) = 2 à E(10) = 20 % 100개의프로세서로 10배의성능향상 : S(100) = 10 à E(100) = 10 %

Cost Cost Cost = 실행시간 ⅹ 프로세서개수 순차프로그램 : Cost = t s t s n t s 병렬프로그램 : Cost = t p ⅹ n = = S(n) E(n) 예 ) 10 개의프로세서로 2 배, 100 개의프로세서로 10 배의성능향상 t s t p n S(n) E(n) Cost 100 50 10 2 0.2 500 100 10 100 10 0.1 1000

실질적성능향상에고려할사항 실제성능향상도 : 통신부하, 로드밸런싱문제 Serial 20 80 parallel 20 20 process 1 process 2 process 3 process 4 cannot be parallelized can be parallelized communication overhead Load unbalance

성능증가를위한방안들 1. 프로그램에서병렬화가능한부분 (Coverage) 증가 알고리즘개선 2. 작업부하의균등분배 : 로드밸런싱 3. 통신에소비하는시간 ( 통신부하 ) 감소

성능에영향을주는요인들 Coverage : Amdahl s Law 로드밸런싱동기화통신부하세분성입출력

로드밸런싱 모든프로세스들의작업시간이가능한균등하도록작업을분배하여작업대기시간을최소화하는것 데이터분배방식 (Block, Cyclic, Block-Cyclic) 선택에주의 이기종시스템을연결시킨경우, 매우중요함 동적작업할당을통해얻을수도있음 task0 task1 task2 WORK WAIT task3 time

동기화 병렬태스크의상태나정보등을동일하게설정하기위한조정작업 대표적병렬부하 : 성능에악영향 장벽, 잠금, 세마포어 (semaphore), 동기통신연산등이용 병렬부하 (Parallel Overhead) 병렬태스크의시작, 종료, 조정으로인한부하 시작 : 태스크식별, 프로세서지정, 태스크로드, 데이터로드등 종료 : 결과의취합과전송, 운영체제자원의반납등 조정 : 동기화, 통신등

통신부하 (1/4) 데이터통신에의해발생하는부하 네트워크고유의지연시간과대역폭존재 메시지패싱에서중요통신부하에영향을주는요인들 동기통신? 비동기통신? 블록킹? 논블록킹? 점대점통신? 집합통신? 데이터전송회수, 전송하는데이터의크기

통신부하 (2/4) 통신시간 = 지연시간 + 메시지크기 대역폭 지연시간 : 메시지의첫비트가전송되는데걸리는시간 송신지연 + 수신지연 + 전달지연 대역폭 : 단위시간당통신가능한데이터의양 (MB/sec) 메시지크기 유효대역폭 = = 통신시간 대역폭 1+ 지연시간 ⅹ 대역폭 / 메시지크기

통신부하 (3/4) Communication Time Commu unication time 1/slope = Bandwidth Latency message size

통신부하 (4/4) effective bandwidth (MB/s sec) 1000 100 10 1 0.1 0.01 Effective Bandwidth network bandwidth latency = 22 μs bandwidth = 133 MB/sec 1 10 100 1000 10000 100000 1000000 message size(bytes)

세분성 (1/2) 병렬프로그램내의통신시간에대한계산시간의비 Fine-grained 병렬성 통신또는동기화사이의계산작업이상대적으로적음 로드밸런싱에유리 Coarse-grained 병렬성 통신또는동기화사이의계산작업이상대적으로많음 로드밸런싱에불리 일반적으로 Coarse-grained 병렬성이성능면에서유리 계산시간 < 통신또는동기화시간 알고리즘과하드웨어환경에따라다를수있음

세분성 (2/2) time time Communication Computation Communication Computation (a) Fine-grained (b) Coarse-grained

입출력 일반적으로병렬성을방해함 쓰기 : 동일파일공간을이용할경우겹쳐쓰기문제 읽기 : 다중읽기요청을처리하는파일서버의성능문제 네트워크를경유 (NFS, non-local) 하는입출력의병목현상 입출력을가능하면줄일것 I/O 수행을특정순차영역으로제한해사용 지역적인파일공간에서 I/O 수행 병렬파일시스템의개발 (GPFS, PVFS, PPFS ) 병렬 I/O 프로그래밍인터페이스개발 (MPI-2 : MPI I/O)

확장성 (1/2) 확장된환경에대한성능이득을누릴수있는능력 하드웨어적확장성 알고리즘적확장성 확장성에영향을미치는주요하드웨어적요인 CPU- 메모리버스대역폭 네트워크대역폭 메모리용량 프로세서클럭속도

확장성 (2/2) Spee edu p Number of Workers

의존성과교착 데이터의존성 : 프로그램의실행순서가실행결과에영향을미치는것 DO k = 1, 100 F(k + 2) = F(k +1) + F(k) ENDDO 교착 : 둘이상의프로세스들이서로상대방의이벤트발생을기다리는상태 Process 1 Process 2 X = 4 SOURCE = TASK2 RECEIVE (SOURCE,Y) DEST = TASK2 SEND (DEST,X) Z = X + Y Y = 8 SOURCE = TASK1 RECEIVE (SOURCE,X) DEST = TASK1 SEND (DEST,Y) Z = X + Y

병렬프로그램작성순서 1 순차코드작성, 분석 ( 프로파일링 ), 최적화 hotspot, 병목지점, 데이터의존성등을확인 데이터병렬성 / 태스크병렬성? 2 병렬코드개발 MPI/OpenMP/? 태스크할당과제어, 통신, 동기화코드추가 3 컴파일, 실행, 디버깅 4 병렬코드최적화 성능측정과분석을통한성능개선

디버깅과성능분석 디버깅 코드작성시모듈화접근필요 통신, 동기화, 데이터의존성, 교착등에주의 디버거 : TotalView 성능측정과분석 timer 함수사용 프로파일러 : prof, gprof, pgprof, TAU

병렬프로그램작성예 (1/3) PI 계산알고리즘 1. 정사각형에원을내접시킴 2. 정사각형내에서무작위로점추출 3. 추출된점들중원안에있는점의개수결정 4. PI = 4 ⅹ 원안의점개수 전체점의개수

병렬프로그램작성예 (2/3) 순차코드작성 (Pseudo) tpoints = 10000 in_circle = 0 do j = 1,tpoints x = rand() y = rand() if (x, y) inside circle then 거의모든계산이루프에서실행 à 루프의반복을여러프로세스로나누어동시수행 각프로세스는담당한루프반복만을실행 다른프로세스의계산에대한정보불필요 à 의존성없음 SPMD 모델사용, 마스터프로세스가최종적으로계산결과를취합해야함 in_circle = in_circle + 1 end do PI = 4.0*in_circle/tpoints

병렬프로그램작성예 (3/3) 병렬코드작성 (Pseudo) tpoints = 10000 in_circle = 0 p = number of process num = tpoints/p find out if I am MASTER or WORKER do j = 1,num x = rand() y = rand() if (x, y) inside circle then in_circle = in_circle + 1 end do 기울임글꼴 ( 붉은색 ) 부분이병렬화를위해첨가된부분 if I am MASTER receive from WORKERS their in_circle compute PI (use MASTER and WORKER calculations) else if I am WORKER send to MASTER in_circle end if

OpenMP 를이용한병렬화

OpenMP 의역사 1990 년대 : 고성능공유메모리시스템의비약적발전 고수준, 표준병렬프로그래밍모델은분산메모리환경에치중 업체고유의지시어집합보유 à 표준화필요 1994년 ANSI X3H5 à 1996년 openmp.org 설립 1997년 OpenMP API 발표 Release History OpenMP Fortran API 버전 1.0 : 1997년 10월 C/C++ API 버전 1.0 : 1998년 10월 Fortran API 버전 1.1 : 1999년 11월 Fortran API 버전 2.0 : 2000년 11월 C/C++ API 버전 2.0 : 2002년 3월

OpenMP 란무엇인가? 공유메모리환경에서다중스레드병렬프로그램작성을위한응용프로그램인터페이스 (API) Open specifications for Multi Processing

공유메모리구조 Memory I/O Bus or Crossbar Switch Cache Cache Cache Cache Processor Processor Processor Processor

OpenMP 의구성 (1/2)

OpenMP 의구성 (2/2) 컴파일러지시어 스레드사이의작업분담, 통신, 동기화를담당 좁은의미의 OpenMP 예 ) C$OMP PARALLEL DO 실행시간라이브러리 병렬매개변수 ( 참여스레드의개수, 번호등 ) 의설정과조회예 ) CALL omp_set_num_threads(128) 환경변수 실행시스템의병렬매개변수 ( 스레드개수등 ) 를정의예 ) export OMP_NUM_THREADS=8

OpenMP 프로그래밍모델 Thread-Based Fork-Join 모델 F J F J O O O O Master Thread R K I N R K I N [Parallel Region] [Parallel Region]

OpenMP 프로그래밍개요 (1/11) 컴파일러지시어기반 : 순차코드에지시어삽입 컴파일러가지시어를참고하여다중스레드코드생성 OpenMP 를지원하는컴파일러필요 명시적병렬성 è 동기화, 의존성제거등의병렬화작업제어 순차코드 PROGRAM exam ialpha = 2 DO i = 1, 100 a(i) = a(i) + ialpha*b(i) ENDDO PRINT *, a END 병렬코드 PROGRAM exam ialpha = 2!$OMP PARALLEL DO DO i = 1, 100 a(i) = a(i) + ialpha*b(i) ENDDO!$ OMP END PARALLEL DO PRINT *, a END

OpenMP 프로그래밍개요 (2/11) Fork-Join export OMP_NUM_THREADS = 4 ialpha = 2 (Master Thread) (Fork) DO i=1,25... DO i=26,50... DO i=51,75... DO i=76,100... (Join) (Master) (Slave) (Slave) (Slave) PRINT *, a (Master Thread)

OpenMP 프로그래밍개요 (3/11) OpenMP 지시어문법 Fortran ( 고정형식 :f77) Fortran ( 자유형식 :f90) C 지시어 시작 ( 감시문자 )!$OMP < 지시어 > C$OMP < 지시어 > *$OMP < 지시어 >!$OMP < 지시어 > #pragma omp < 지시어 >!$OMP < 지시어 > 줄바꿈!$OMP <!$OMP&!$OMP < 지시어 > & #pragma omp \ 선택적 컴파일!$ C$ *$!$ #ifdef _OPENMP #endif 시작위치 첫번째열 무관 무관

OpenMP 프로그래밍개요 (4/11) 많이사용되는지시어 Fortran!$OMP PARALLEL!$OMP DO!$OMP PARALLEL DO!$OMP CRITICAL PRIVATE/SHARED DEFAULT REDUCTION C #pragma omp parallel #pragma omp for #pragma omp parallel for #pragma omp critical private/shared default reduction

OpenMP 프로그래밍개요 (5/11) 실행시간라이브러리 omp_set_num_threads(integer) : 스레드개수지정 omp_get_num_threads() : 생성된스레드개수리턴 omp_get_thread_num() : 스레드 ID 리턴 omp_get_max_threads() : 사용가능한최대스레드개수리턴 환경변수 OMP_NUM_THREADS : 사용가능한스레드최대개수 export OMP_NUM_THREADS=16 (ksh) setenv OMP_NUM_THREADS 16 (csh) C/C++ : #include <omp.h>

OpenMP 프로그래밍개요 (6/11) OpenMP 의전형적사용방법 ( 루프의병렬화 ) 1시간이많이걸리는루프찾음 ( 프로파일링 ) 2의존성, 데이터유효범위조사 3지시어삽입으로병렬화 PROGRAM exam 순차코드 REAL res(1000) DO i=1, 1000 CALL do_huge_comp (res(i)) ENDDO PROGRAM exam 병렬코드 REAL res(1000)!$omp PARALLEL DO DO i = 1, 1000 CALL do_huge_comp(res(i)) ENDDO!$OMP END PARALLEL DO

OpenMP 프로그래밍개요 (7/11) parallel do/for Fortran!$OMP PARALLEL DO DO i = 1, n a(i) = b(i) + c(i) ENDDO [!$OMP END PARALLEL DO] C #pragma omp parallel for for (i=1; i<=n; i++) a[i] = b[i] + c[i]; Optional MASTER thread!$omp PARALLEL DO # of threads=4!$omp END PARALLEL DO MASTER thread join again

OpenMP 프로그래밍개요 (8/11) parallel + do/for Fortran!$OMP PARALLEL!$OMP DO DO i = 1, n a(i) = b(i) + c(i) ENDDO [!$OMP END DO]!$OMP DO [!$OMP END DO]!$OMP END PARALLEL Optional C #pragma omp parallel { #pragma omp for for (i=1; i<=n; i++) { a[i] = b[i] + c[i] } #pragma omp for for( ){ } }

OpenMP 프로그래밍개요 (9/11) 데이터유효범위 Fortran PROGRAM hello_wrong INTEGER a,tid, OMP_GET_THREAD_NUM!$OMP PARALLEL tid = OMP_GET_THREAD_NUM() DO i = 1, 10000 a = i ENDDO PRINT *, I am, & OMP_GET_THREAD_NUM(), & TID =, TID!$OMP END PARALLEL END am 3, tid 3 am 0, tid am 1, tid I am = 2, tid = 1 /* hello_wrong */ #include <omp.h> main(){ int i, a, tid; #pragma omp parallel { tid = omp_get_thread_num(); for(i=0; i<10000; i++) a = i; printf ( I am %d, tid = %d\n, omp_get_thread_num(), tid); } } C

OpenMP 프로그래밍개요 (10/11) 데이터유효범위 Fortran PROGRAM hello_right INTEGER a,tid, & OMP_GET_THREAD_NUM!$OMP PARALLEL PRIVATE(tid) tid = OMP_GET_THREAD_NUM() DO i = 1, 10000 a = i ENDDO PRINT *, I am, & OMP_GET_THREAD_NUM(), & TID = tid!$omp END PARALLEL END am 3, tid 3 am 0, tid 0 am 1, tid 1 I am = 2, tid = 2 /* hello_right */ C #include <omp.h> main(){ } int i, a, tid; #pragma omp parallel private(tid) { } tid = omp_get_thread_num(); for(i=0; i<10000; i++) a = i; printf ( I am %d, tid = %d \n, tid); omp_get_thread_num(),

OpenMP 프로그래밍개요 (11/11) OpenMP 프로그램의컴파일과실행 컴파일과링크 Intel Fortran C ifort -openmp o ompprog ompprog.f icc -openmp o ompprog ompprog.c 실행./ompprog

주요지시어 병렬영역지시어 parallel 작업분할지시어 do/for sections single 결합된병렬작업분할지시어 parallel do/for parallel sections

병렬영역 (1/4) Fortran 문법!$OMP PARALLEL shared(var1, var2, ) private(var1, var2, ) firstprivate(var1, var2, ) reduction(operator intrinsic:var1, var2, ) copyin(var1, var2, ) if(expression) default(private shared none) a structured block of code!$omp END PARALLEL & & & & & & &

병렬영역 (2/4) #pragma omp C parallel 문법 \ shared(var1, var2, ) \ private(var1, var2, ) \ firstprivate(var1, var2, ) \ { } reduction(operator intrinsic:var1, var2, ) \ copyin(var1, var2, ) \ if(expression) \ default(shared none) a structured block of code

병렬영역 (3/4) 생성스레드개수설정 환경변수 ( 커맨드라인 ) : export OMP_NUM_THREADS = 32 라이브러리호출 ( 코드 ) : CALL omp_set_num_threads(32) SPMD 스타일 : 병렬영역을각스레드에복제해실행 FORK - JOIN : 병렬영역의끝에서동기화 If(myid==0)... If(myid==1)... If(myid==2)...... ( ) (Thread 0) (Thread 2) (Thread 1) (implied barrier)

병렬영역 (4/4) 스레드 ID 사용 : 0( 마스터스레드 ) ~[ # of threads 1 ] omp_get_thread_num() Fortran!$OMP PARALLEL private(myid) myid = omp_get_thread_num() IF(myid==0) THEN ELSE do_something() do_something(myid) ENDIF!$OMP END PARALLEL #pragma omp parallel private(myid) { myid = omp_get_thread_num(); if(myid==0) do_something(); else do_something(myid); } C

Example: PI 1 4 ò 1+ x 0 2 dx dx x = tanq 2 = sec q dq f ( x 1 ) f ( x 2 ) p Þ ò 4 0 1+ 4 sec 2 tan q p Þ ò 4 2 1 4 cos q cos Þ p ò 4 4 dq = p 0 0 2 2 q dq dq q 1 n... f ( x n ) 1 x2 = (2-0.5) 1 n x1 = (1-0.5) n 1 x n = ( n - 0.5) n

Example: PI Fortran PARAMETER (NUM_STEPS=1000000) SUM = 0.0 STEP = 1.0/REAL(NUM_STEPS) DO I = 1, NUM_STEPS X=(I-0.5)*STEP SUM = SUM + 4.0/(1.0+X*X) ENDDO PI=STEP*SUM static long num_steps = 1000000; double step; void main () { int i; double x, pi, sum = 0.0; step = 1.0/(double) num_steps; for (i=1;i<= num_steps; i++){ x = (i-0.5)*step; sum = sum + 4.0/(1.0+x*x); } pi = step * sum; } C

Parallel: Fortran!$OMP PARALLEL PRIVATE(ID,X) ID = OMP_GET_THREAD_NUM() SUM(ID)=0.0 DO I = ID, NUM_STEPS-1, NUM_THREADS; X = (I+0.5)*STEP; SUM(ID) = SUM(ID)+ 4.0/(1.0+X*X); ENDDO!$OMP END PARALLEL PI=0.0 DO I=0, NUM_THREADS-1 PI = PI + SUM(I)*STEP ENDDO

Parallel: C #pragma omp parallel private(id,x) { id = omp_get_thread_num(); sum[id]=0.0; for (i=id; i< num_steps; i=i+num_threads){ x = (i+0.5)*step; sum[id] += 4.0/(1.0+x*x); } } for(i=0, pi=0.0;i<num_threads;i++) pi += sum[i] * step;

작업분할구문 (1/2) do/for sections single 병렬영역내부에삽입하여작업할당에이용 새로운스레드생성없이기존스레드에관련작업실행분배 구문의시작점 : 스레드사이의동기화없음 먼저접근하는스레드에우선적작업할당 구문의끝점 : 동기화 ( 암시적장벽 ) 작업이먼저끝나도다른작업의완료까지대기 대기없이다른작업을실행하려면 nowait clause 사용

작업분할구문 (2/2) Master thread Master thread Master thread F O R K F O R K F O R K DO / for loop team SECTIONS team SINGLE J O I N J O I N J O I N Master thread Master thread Master thread do/for sections single

작업분할구문 : DO/for (1/3) 바로뒤에오는루프의반복실행을스레드에분배 동기화 : 루프끝에암시적장벽 기다리지않으려면 nowait clause 사용 Fortran!$OMP PARALLEL shared(a,b) & #pragma omp parallel \ private(j)!$omp DO DO j = 1, N a(j) = a(j) + b(j) ENDDO [!$OMP END DO [nowait]]!$omp END PARALLEL { } C shared(a,b) private(j) #pragma omp for for (j=0;j<n; j++) a[j] = a[j] + b[j];

작업분할구문 : DO/for (2/3) Fortran : DO!$OMP DO [clause [,] [clause ]] DO loop [!$OMP END DO [nowait]] 사용 clause private(var1, var2, ) shared(var1, var2, ) firstprivate(var1, var2, ) lastprivate(var1, var2, ) reduction(operator intrinsic:var1, var2, ) schedule(type [,chunk]) ordered

작업분할구문 : DO/for (3/3) C : for #pragma omp for [clause [clause ]] for loop 사용 clause private(var1, var2, ) shared(var1, var2, ) firstprivate(var1, var2, ) lastprivate(var1, var2, ) reduction(operator intrinsic:var1, var2, ) schedule(type [,chunk]) ordered nowait

DO/for: Fortran!$OMP PARALLEL PRIVATE(ID) ID = OMP_GET_THREAD_NUM() SUM(ID)=0.0!$OMP DO PRIVATE(X) DO I = 0, NUM_STEPS-1 X = (I+0.5)*STEP SUM(ID) = SUM(ID) + 4.0/(1.0+X*X) ENDDO!$OMP END DO!$OMP END PARALLEL PI=0.0 DO I=0, NUM_THREADS-1 PI = PI + SUM(I)*STEP ENDDO

Do/for: C #pragma omp parallel private(id) { id = omp_get_thread_num(); sum[id] = 0.0; #pragma omp for private(x) for (i=0; i<num_steps; i++){ x = (i+0.5)*step; sum[id] += 4.0/(1.0+x*x); } } for(i=0, pi=0.0; i<num_threads; i++) pi += sum[i] * step;

작업분할구문 : sections (1/3) 독립된여러개작업을각스레드에분산실행 Functional decomposition 동기화 : sections 구문끝에암시적장벽 기다리지않으려면 nowait clause 사용!$OMP PARALLEL!$OMP SECTIONS!$OMP SECTION Fortran CALL computexpart()!$omp SECTION CALL computeypart()!$omp END SECTIONS [nowait]!$omp END PARALLEL C #pragma omp parallel { #pragma omp sections { #pragma omp section computexpart(); #pragma omp section computeypart(); } }

작업분할구문 : sections (2/3) Fortran!$OMP SECTIONS [clause [,] [clause ]] [!$OMP SECTION] structured code block [!$OMP SECTION another structured code block [!$OMP SECTION ]]!$OMP END SECTIONS [nowait] 사용 clause private(var1, var2, ) firstprivate(var1, var2, ) lastprivate(var1, var2, ) reduction(operator intrinsic:var1, var2, )

작업분할구문 : sections (3/3) C #pragma omp sections [clause [clause ]] { } [#pragma omp section] structured code block [#pragma omp section another structured code block ] 사용 clause private(var1, var2, ) firstprivate(var1, var2, ) lastprivate(var1, var2, ) reduction(operator intrinsic:var1, var2, ) nowait

sections : Fortran!$OMP PARALLEL PRIVATE(ID) ID = OMP_GET_THREAD_NUM() SUM(ID)=0.0!$OMP SECTIONS PRIVATE(X)!$OMP SECTION DO I = 0, (NUM_STEPS-1)/2 X = (I+.5)*STEP SUM(ID)= SUM(ID) + 4.0/(1.0+X*X) ENDDO!$OMP SECTION DO I = (NUM_STEPS-1)/2+1, NUM_STEPS-1 X = (I+.5)*STEP SUM(ID)= SUM(ID) + 4.0/(1.0+X*X) ENDDO!$OMP END SECTIONS

sections: C #pragma omp parallel private(id) { id = omp_get_thread_num(); sum[id]=0.0; #pragma omp sections private(x) { #pragma omp section for (i=0; i< num_steps/2; i++){ x = (i+0.5)*step; sum[id] += 4.0/(1.0+x*x); } #pragma omp section for (i= num_steps/2+1; i< num_steps; i++){ x = (i+0.5)*step; sum[id] += 4.0/(1.0+x*x); } } }

작업분할구문 : single (1/3) 병렬영역내부에서하나의스레드만이용해작업수행 single 지시어에가장먼저접근한스레드에작업할당 동기화 : single 구문끝에암시적장벽오직하나의 section 을가지는 sections 구문과동일 병렬영역내에서의입 / 출력수행에주로사용 Fortran!$OMP PARALLEL!$OMP SINGLE write the result!$omp END SINGLE [nowait]!$omp END PARALLEL C #pragma omp parallel { #pragma omp single write the result }

작업분할구문 : single (2/3) Fortran!$OMP SINGLE [clause [,] [clause ]] structured block!$omp END SINGLE [nowait] 사용 clause private(var1, var2, ) firstprivate(var1, var2, )

작업분할구문 : single (3/3) C #pragma omp single [clause [clause ]] structured block 사용 clause private(var1, var2, ) firstprivate(var1, var2, ) nowait

주요 Clauses private(var1, var2, ) shared(var1, var2, ) default(shared private none) firstprivate(var1, var2, ) lastprivate(var1, var2, ) reduction(operator intrinsic:var1, var2, ) schedule(type [,chunk])

데이터유효범위지정 Clause 명시적인데이터유효범위지정 clause Private Shared Default Firstprivate Lastprivate Reduction

기본데이터유효범위 유효범위가지정되지않은변수는기본적으로공유됨 서브루틴내의병렬영역에서사용되는자동변수는 shared 동적할당변수는 shared Default Private 루프인덱스 Fortran: 병렬영역의정적범위에서순차루프인덱스도 private C/C++: 정적범위에서순차루프인덱스는기본 shared! 병렬영역에서호출되는서브루틴의지역변수 (but, save (static) 변수는 shared) C/C++: value parameter 병렬영역의정적범위에서선언된자동변수

clause : private private(var1, var2, ) 지정된변수를스레드끼리공유하는것방지 private 변수는병렬영역내에서만정의됨 병렬영역밖에서초기화할수없음 (à firstprivate) 병렬영역이끝나면서사라짐 (à lastprivate) private 선언을고려해야하는변수 병렬영역내에서값을할당받는변수!$OMP PARALLEL shared(a) private(myid, x) myid = OMP_GET_THREAD_NUM() x = work(myid) IF (x<1.0) THEN a(myid) = x ENDIF!$OMP END PARALLEL

clause : shared, default (1/2) shared(var1, var2, ) 지정된변수를모든스레드가공유하도록함 default (private shared none) private 또는 shared 로선언되지않은변수의기본적 인유효범위지정 parallel do(for) 구문 : 선언과무관하게루프인덱스는항상 default 선언과무관하게루프인덱스는항상 private default(none): 모든변수는 shared 또는 private 으로선언되어야함 C : default(shared none)

clause : shared, default (2/2)!$OMP PARALLEL shared(a) private(myid, x) myid = OMP_GET_THREAD_NUM() x = work(myid) IF (x<1.0) THEN a(myid) = x ENDIF!$OMP END PARALLEL!$OMP PARALLEL default(private) shared(a) myid = OMP_GET_THREAD_NUM() x = work[myid] IF (x<1.0) THEN a[myid] = x ENDIF!$OMP END PARALLEL

clause : firstprivate (1/2) firstprivate(var1, var2, ) private 변수처럼각스레드에개별적으로변수생성 각스레드마다순차영역에서가져온값으로초기화

clause : firstprivate (2/2)!$OMP PARALLEL!$OMP DO PRIVATE (C) DO J=1,M DO I=2,N-1 C(I)=SQRT(1.0+B(I,J)**2) ENDDO DO I=1,N A(I,J)=SQRT(B(I,J)**2+C(I)**2) ENDDO ENDDO!$OMP END PARALLEL!$OMP PARALLEL!$OMP DO FIRSTPRIVATE (C) DO J=1,M DO I=2,N-1 C(I)=SQRT(1.0+B(I,J)**2) ENDDO DO I=1,N A(I,J)=SQRT(B(I,J)**2+C(I)**2) ENDDO ENDDO!$OMP END PARALLEL C(1), C(N)??

clause : lastprivate (1/2) lastprivate(var1, var2, ) private 변수처럼각스레드에개별적으로변수생성 순차실행에서마지막계산에해당되는값즉, 마지막반복실행의값을마스터스레드에게넘겨줌

clause : lastprivate (2/2)!$OMP PARALLEL!$OMP DO FIRSTPRIVATE (C) DO J=1,M DO I=2,N-1 C(I)=SQRT(1.0+B(I,J)**2) ENDDO DO I=1,N A(I,J)=SQRT(B(I,J)**2+C(I)**2) ENDDO ENDDO IF(J.EQ. M+1) THEN DO I=1,N X(I) = C(I) ENDDO ENDIF!$OMP END PARALLEL!$OMP PARALLEL!$OMP DO FIRSTPRIVATE (C) &!$ LASTPRIVATE(J, C) DO J=1,M DO I=2,N-1 C(I)=SQRT(1.0+B(I,J)**2) ENDDO DO I=1,N A(I,J)=SQRT(B(I,J)**2+C(I)**2) ENDDO ENDDO IF(J.EQ. M+1) THEN DO I=1,N X(I) = C(I) ENDDO ENDIF!$OMP END PARALLEL

clause : reduction (1/4) reduction(operator intrinsic:var1, var2, ) reduction 변수는 shared 배열가능 (Fortran only): deferred shape, assumed shape array 사용불가 C 는 scalar 변수만가능 각스레드에복제돼연산에따라다른값으로초기화되고 ( 표참조 ) 병렬연산수행 다중스레드에서병렬로수행된계산결과를환산해최종 결과를마스터스레드로내놓음

clause : reduction (2/4)!$OMP DO reduction(+:sum) DO i = 1, 100 sum = sum + x(i) ENDDO Thread 0 Thread 1 sum0 = 0 DO i = 1, 50 sum0 = sum0 + x(i) ENDDO sum1 = 0 DO i = 51, 100 sum1 = sum1 + x(i) ENDDO sum = sum0 + sum1

clause : reduction (3/4) Reduction Operators : Fortran Operator Data Types 초기값 + * -.AND..OR. integer, floating point (complex or real) integer, floating point (complex or real) integer, floating point (complex or real) logical logical 0 1 0.TRUE..FALSE..EQV. logical.true..neqv. logical.false. MAX integer, floating point (real only) 가능한최소값 MIN integer, floating point (real only) 가능한최대값 IAND integer all bits on IOR integer 0 IEOR integer 0

clause : reduction (4/4) Reduction Operators : C Operator Data Types 초기값 + * - & integer, floating point integer, floating point integer, floating point integer 0 1 0 all bits on integer 0 ^ integer 0 && integer 1 integer 0

reduction: Fortran!$OMP PARALLEL DO REDUCTION(+:SUM) PRIVATE(X) DO I = 1, NUM_STEPS X = (I-0.5)*STEP SUM = SUM + 4.0/(1.0+X*X) ENDDO!$OMP END PARALLEL DO PI = SUM*STEP

reduction: C #pragma omp parallel for reduction(+:sum) private(x) for (i=1;i<= num_steps; i++){ x = (i-0.5)*step; sum = sum + 4.0/(1.0+x*x); } pi = step * sum;

지시어와 clauses : 요약 (1/2) 지시어 Clause parallel do/for sections single parallel parallel do/for sections if private shared default firstprivate lastprivate reduction copyin schedule ordered nowait

지시어와 clauses : 요약 (2/2) 다음지시어들은 clause 를사용하지않는다. master critical barrier atomic ordered threadprivate flush

MPI 를이용한병렬화

메시지패싱 (1/2) 프로세스들간에데이터를공유하기위해데이터 ( 메시지 ) 를송 수신하여통신하는방식 병렬화를위한작업할당, 데이터분배, 통신의운용등모든것을프로그래머가담당 : 어렵지만유용성좋음 (Very Flexible) 한프로세스메모리의데이터를다른프로세스의메모리로복사하는방식으로메시지전달 시스템버퍼를이용한비동기 (asynchronous) 통신가능 메시지패싱라이브러리 : MPI, PVM

메시지패싱 (2/2) Processor 1 Processor 2 Process a Application send DATA Process b Application receive DATA system buffer DATA system buffer DATA

MPI 란무엇인가? 분산메모리환경에서메시지패싱병렬컴퓨팅을위해표준화된라이브러리규약 Message Passing Interface 데이터통신을위한함수 ( 서브루틴 ) 들의라이브러리 MPI-1 표준마련 (MPI Forum) : 1994년 MPI-2 : 1997년

MPI 프로그램의기본구조 (1/3) include MPI header file variable declarations initialize the MPI environment do computation and MPI communication calls close MPI environment

MPI 프로그램의기본구조 (2/3) PROGRAM skeleton INCLUDE mpif.h INTEGER ierr, rank, size CALL MPI_INIT(ierr) CALL MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) CALL MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr)! your code here CALL MPI_FINALIZE(ierr) END

MPI 프로그램의기본구조 (3/3) /* program skeleton*/ #include mpi.h void main(int argc, char *argv[]){ int rank, size; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); /* your code here */ } MPI_Finalize();

MPI 헤더파일 헤더파일삽입 Fortran INCLUDE mpif.h C #include mpi.h MPI 서브루틴과함수의프로토타입선언 매크로, MPI 관련인수, 데이터타입정의 /applic/mpi/[mpi]/[compile]/include

MPI 루틴의호출과리턴값 (1/2) MPI 루틴의호출 Fortran Format Example Error code CALL MPI_XXXXX(parameter,,ierr) CALL MPI_INIT(ierr) Returned as ierr parameter, MPI_SUCCESS if successful Format Example Error code C err = MPI_Xxxxx(parameter, ); MPI_Xxxxx(parameter, ); err = MPI_Init(&argc, &argv); Returned as err, MPI_SUCCESS if successful

MPI 루틴의호출과리턴값 (2/2) MPI 루틴의리턴값 호출된 MPI 루틴의성공여부를알려주는에러코드리턴 성공적으로호출되었으면정수형상수 MPI_SUCCESS 리턴 MPI_SUCCESS는헤더파일에선언되어있음 모든 Fortran 서브루틴은마지막인수가에러코드 Fortran C INTEGER ierr CALL MPI_INIT(ierr) IF(ierr.EQ. MPI_SUCCESS) THEN ENDIF int err; err = MPI_Init(&argc, &argv); if (err == MPI_SUCCESS){ }

MPI 초기화 Fortran CALL MPI_INIT(ierr) C int MPI_Init(&argc, &argv) MPI 환경초기화 MPI 루틴중가장먼저오직한번반드시호출되어야함

커뮤니케이터 (1/3) 서로통신가능한프로세스집합을나타냄같은커뮤니케이터를가지는프로세스들끼리만통신가능모든 MPI 통신루틴에는커뮤니케이터인수가포함 MPI_COMM_WORLD 프로그램실행시정해진사용가능한모든프로세스를포함하는커뮤니케이터 MPI_Init이호출될때정의됨

커뮤니케이터 (2/3) 프로세스랭크 같은커뮤니케이터에속한프로세스의식별번호 프로세스가 n 개있으면 0 부터 n-1 까지번호할당 메시지의송신자와수신자를나타내기위해사용 프로세스랭크가져오기 Fortran C CALL MPI_COMM_RANK(comm, rank, ierr) MPI_Comm_rank(MPI_Comm comm, int *rank); 커뮤니케이터 comm 에서이루틴을호출한프로세스의프로세스랭크출력

커뮤니케이터 (3/3) 커뮤니케이터사이즈 커뮤니케이터에포함된프로세스들의총개수 커뮤니케이터사이즈가져오기 Fortran C CALL MPI_COMM_SIZE(comm, size, ierr) MPI_Comm_size(MPI_Comm comm, int *size); 루틴을호출되면커뮤니케이터 comm 의사이즈를인수 size 를통해리턴

MPI 프로그램종료 Fortran CALL MPI_FINALIZE(ierr) C int MPI_Finalize(); 모든 MPI 자료구조정리 모든프로세스들에서마지막으로한번호출되어야함 프로세스를종료시키는것은아님

MPI 메시지의구성 데이터 + 봉투 데이터 ( 버퍼, 개수, 데이터타입 ) 버퍼 : 수신 ( 송신 ) 데이터의변수명 개수 : 수신 ( 송신 ) 데이터의개수 데이터타입 : 수신 ( 송신 ) 데이터의데이터타입 봉투 ( 수신자 ( 송신자 ), 꼬리표, 커뮤니케이터 ) 수신자 ( 송신자 ) : 수신 ( 송신 ) 프로세스랭크 꼬리표 : 수신 ( 송신 ) 데이터를나타내는고유한정수 커뮤니케이터 : 송신, 수신프로세스들이포함된프로세스그룹

송신과수신 점대점통신 Blocking Communication Non-blocking Communication 집합통신 Broadcast Scatter Gather Reduce

점대점통신 Communicator 5 2 0 1 source 3 4 destination 두프로세스사이의통신송신프로세스는수신프로세스로메시지를보냄수신프로세스는메시지를받음통신은커뮤니케이터내에서이루어짐프로세스랭크를이용해송신 / 수신프로세스를확인

블록킹통신 Fortran MPI_SEND (buf, count, datatype, dest, tag, comm,ierr) MPI_RECV (buf, count, datatype, source, tag, comm, status, ierr) C MPI_Send (&buf, count, datatype, dest, tag, comm) MPI_Recv (&buf, count, datatype, source, tag, comm, &status)

블록킹송신 C MPI_Send(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm) Fortran MPI_SEND(buf, count, datatype, dest, tag, comm, ierr) (CHOICE) buf : 송신버퍼의시작주소 (IN) INTEGER count : 송신될원소개수 (IN) INTEGER datatype : 각원소의 MPI 데이터타입 ( 핸들 ) (IN) INTEGER dest : 수신프로세스의랭크 (IN) 통신이불필요하면 MPI_PROC_NULL INTEGER tag : 메시지꼬리표 (IN) INTEGER comm : MPI 커뮤니케이터 ( 핸들 ) (IN) MPI_SEND(a, 50, MPI_REAL, 5, 1, MPI_COMM_WORLD, ierr)

블록킹수신 C Fortran MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status) MPI_RECV(buf, count, datatype, source, tag, comm, status, ierr) (CHOICE) buf : 수신버퍼의시작주소 (OUT) INTEGER count : 수신될원소개수 (IN) INTEGER datatype : 각원소의 MPI 데이터타입 ( 핸들 ) (IN) INTEGER source : 송신프로세스의랭크 (IN) 통신이불필요하면 MPI_PROC_NULL INTEGER tag : 메시지꼬리표 (IN) INTEGER comm : MPI 커뮤니케이터 ( 핸들 ) (IN) INTEGER status(mpi_status_size) : 수신된메시지의정보저장 (OUT) MPI_RECV(a,50,MPI_REAL,0,1,MPI_COMM_WORLD,status,ierr)

논 - 블록킹통신 Fortran C MPI_ISEND (buf,count,datatype,dest,tag,comm,request,ierr) MPI_IRECV (buf,count,datatype,source,tag,comm,request,ierr) MPI_WAIT (request,status,ierr) MPI_Isend (&buf,count,datatype,dest,tag,comm,&request) MPI_Irecv (&buf,count,datatype,source,tag,comm,&request) MPI_Wait (&request,&status)

집합통신 P3 P2 P1 P0 A A A A A broadcast data P3 P2 P1 P0 D C B A reduce A*B*C*D P3 P2 P1 P0 D C B A D C B A scatter P3 P2 P1 P0 D C B A all reduce A*B*C*D A*B*C*D A*B*C*D A*B*C*D gather *:some operator *:some operator P3 P2 P1 P0 D C B A D C B A D C B A D C B A D C B A allgather P3 P2 P1 P0 D C B A scan A*B*C*D A*B*C A*B A *:some operator P3 P2 P1 P0 D3 D2 D1 D0 C3 C2 C1 C0 B3 B2 B1 B0 A3 A2 A1 A0 D3 C3 B3 A3 D2 C2 B2 A2 D1 C1 B1 A1 D0 C0 B0 A0 alltoall reduce scatter A3*B3*C3*D3 A2*B2*C2*D2 A1*B1*C1*D1 A0*B0*C0*D0 *:some operator P3 P2 P1 P0 D3 D2 D1 D0 C3 C2 C1 C0 B3 B2 B1 B0 A3 A2 A1 A0

MPI 서브루틴들 Type 서브루틴개수 ᆞPoint-to-Point MPI_SEND, MPI_RECV, MPI_WAIT, 35 ᆞCollective Communication MPI_BCAST, MPI_GATHER, MPI_REDUCE, 30 ᆞDerived Data type MPI_TYPE_CONTIGUOUS, MPI_TYPE_COMMIT, 21 ᆞTopology MPI_CART_CREATE, MPI_GRAPH_CREATE, 16 ᆞCommunicator MPI_COMM_SIZE, MPI_COMM_RANK, 17 ᆞProcess Group MPI_GROUP_SIZE, MPI_GROUP_RANK, 13 ᆞEnvironment Management MPI_INIT, MPI_FINALIZE, MPI_ABORT, 18 ᆞFile MPI_FILE_OPEN, MPI_FILE_READ_AT, 19 ᆞInformation MPI_INFO_GET, MPI_INFO_SET, 9 ᆞIBM Exntension MPE_IBCAST, MPE_IGATHER, 14

Example : PI 계산 (1/6) 병렬코드 : Fortran PROGRAM pi_cal INCLUDE mpif.h INTEGER ierr, nprocs, myrank,tag INTEGER status(mpi_status_size) INTEGER seed, tpoints, in_circle DOUBLE PRECISION pi, x, y, r, recv, RAND tpoints = 10000000 CALL MPI_INIT(ierr) CALL MPI_COMM_SIZE(MPI_COMM_WORLD,nprocs,ierr) CALL MPI_COMM_RANK(MPI_COMM_WORLD,myrank,ierr)

Example : PI 계산 (2/6) in_circle = 0 seed=5 CALL SRAND(seed*myrank) DO j = myrank+1,tpoints,nprocs x = RAND()-0.5 y = RAND()-0.5 r = SQRT(x*x + y*y) IF (r<0.5) THEN in_circle = in_circle + 1 ENDIF ENDDO pi = 4.0*in_circle/tpoints

Example : PI 계산 (3/6) IF(myrank /= 0) THEN CALL MPI_SEND(pi, 1, MPI_DOUBLE_PRECISION, 0, 1, & ENDIF MPI_COMM_WORLD, ierr) IF(myrank==0) THEN ENDIF DO j = 1, nprocs-1 ENDDO CALL MPI_RECV(recv, 1, MPI_DOUBLE_PRECISION, j, 1, & pi = pi + recv PRINT *, ' pi = ', pi CALL MPI_FINALIZE(ierr) END MPI_COMM_WORLD, status, ierr)

Example : PI 계산 (4/6) 병렬코드 : C #include <stdio.h> #include <stdlib.h> #include mpi.h #include <math.h> main(int argc, char *argv[]){ int j, nprocs, myrank,tag; MPI_Status status; int tpoints, in_circle; double pi, seed, x, y, r, recv; tpoints = 1000000; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD,&nprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myrank);

Example : PI 계산 (5/6) in_circle = 0; seed=0.5; srand(seed*myrank); for(j=myrank; j<tpoints; j+=nprocs){ x = (double)rand()/rand_max - 0.5; y = (double)rand()/rand_max - 0.5; r = sqrt(x*x + y*y); if (r<=0.5) in_circle = in_circle + 1; } pi = 4.0*in_circle/tpoints;

Example : PI 계산 (6/6) if(myrank!= 0) MPI_Send(&pi,1,MPI_DOUBLE,0,1,MPI_COMM_WORLD); } if(myrank==0){ for(j=1; j<=nprocs-1; j++){ MPI_Recv(&recv, 1, MPI_DOUBLE, j, 1, MPI_COMM_WORLD, &status); pi = pi + recv; } printf( pi = %f\n, pi); } MPI_Finalize();