16. 대중적인 API이니만큼 다양한 개발환경에서 지원됨
VSCC, Clang/LLVM, GCC, ICC/ICPC 등 다양한 컴파일러에 표준으로 선택
대개 –fopenmp 옵션이나(gcc, clang) –openmp(icc/icpc)
/openmp(VSCC) –framework OpenMP(OS X clang)로 컴파일 가능
OpenMP 의 장점3
33. Code
source.c:
#include <stdio.h>
#include <omp.h>
int main(int argc, char* argv[])
{
#pragma omp parallel
{
printf("Hello, World! From thread %dn“, omp_get_thread_num());
}
return 0;
}
변수 출력부 확인
변수 확인
중간 추론: 동일한 함수가 다른 값을 반환
43. 어떤 종류의 명령을
어떤 종류의 데이터에 대해 수행하는가
플린 분류에서 아키텍쳐는 크게 4가지로 분류
44. Single / Multi: 수(단수/복수)
Instruction / Data: 무엇에 대해(작업, 데이터)
결합해서 약어를 만들어 봅시다
45. SISD: 한 종류의 데이터에 대해 단일한 연산을 수행함(병렬과는 관계 없음)
SIMD: 여러 데이터에 대해 단일한 연산을 수행함(데이터를 분배)
MISD: 동일 데이터에 대해 다양한 연산을 수행함(작업을 분배)
MIMD: 여러 종류의 데이터에 대해 다양한 연산을 수행함(동시에 분배)
47. SISD: 한 종류의 데이터에 대해 단일한 연산을 수행함(병렬과는 관계 없음)
SIMD: 여러 데이터에 대해 단일한 연산을 수행함(데이터를 분배)
MISD: 동일 데이터에 대해 다양한 연산을 수행함(작업을 분배)
MIMD: 여러 종류의 데이터에 대해 다양한 연산을 수행함(동시에 분배)
48. 이는 컴퓨터 구조와,
연산이 실제로 하드웨어에 배분되는 모델을 생각하면
쉽게 이해할 수 있다.
가장 대중적인 모델 SIMD
59. 프로세스가 특정 지점에서 동시에 여러 스레드를 실행하며 코드가 분기
각각의 스레드가 끝나면 다시 메인 쓰레드가 프로세스의 흐름을 모은다
Fork-Join 모델
60. OpenMP는 pragma omp 절을 쓰레드로 인식
하드웨어가 최대로 수용 가능한 쓰레드 수, 혹은 환경변수를 인식해 쓰레드 생성
각 쓰레드는 고유 index를 가짐 이것이 omp_get_thread_num이 반환하는 값
소프트웨어 모델(스레드)를 하드웨어에 분배
61. 쓰레드를 만들어 둔다 해도 한번에 얼마나 실행 가능한지 알 수 없음
그렇다고 실행 가능시점까지 그냥 대기하면 성능제약 까다로운 부분은 느려짐
성능이 중요한 작업에서는 하드웨어만 봐도 성능 예측 가능한 SIMD가 안전
코드는 하나인데 실행하는 머신은 천차만별
69. Process Thread
만일 순서 의존성이 존재한다면…
Thread Thread Thread
Thread
Thread
Thread
시간상의 이점 없음
70. 쓰레드 작업 선행 오버헤드가 먼저 끝난 것을 그냥 먼저 실행
어떤 시점에 누가 먼저 끝날지도 알 수 없고, 수행시간도 매번 차이가 남
공학에서 이렇듯 통제 불가능한 상황에 의해 결과가 달라지는 것을
race condition이라 함
거기다 각 객체 실행 시점은 조금씩 차이남
71. 컴퓨팅은 데이터와 동작 / 단일과 다중에 따라 4가지로 분류
가장 대중적인 병렬 모델은 SIMD
OpenMP는 Fork-Join 모델을 따름
병렬화 되어야 하는 작업은 순서 의존성이 없어야 한다
오늘의 내용정리: