요즘 CPU core의 개수가 늘어감에 따라 parallel programming이 활성화되고 있다. 수업시간에 잠깐 다룬 강의노트 p.13의 방법에 대해 보다 자세히 조사하여 설명하시오.
이 방법에 대해 조사하기 전에 parallel programming에 대해 이해해 보도록 한다.
parallelism(병렬성)이라는 단어는 concurrency(동시성)과 비교하면서 설명하면 이해하기 쉽다.
이는 컴퓨터공학과 학생의 기본적인 상식일만큼 매우 중요한 단어이다!
1. Concurrency vs Parallelism
- Concurrency(동시성)
- cpu 코어 하나가 timesharing으로 context switching 하면 프로그램이 동시에 수행되는 것처럼 보이는 것
- Parallelism(병렬성)
- cpu 코어 여러 개에서 여러 작업을 수행하는 것
2. Thread & concurrency
스레드는 process내의 실행 path로 cpu 이용의 기본 단위이다. 스레드는 cpu 하나에서 thread 여러 개가 동시에 수행된다면 concurrency 하게 동작한다고 한다.
스레드는 다중 코어 시스템에서 처리 능력을 향상하도록 설계될 수 있다.
이러한 응용은 다중 계산 코어를 사용하여 많은 cpu 작업을 병렬로 처리할 수 있다.
3. Thread & Parrallelism
최근 Multicore/Multiprocessor가 발전하게 되면서 multicore programming, parrellel programming이 활성화되고 있다.
Multicore programming이란 여러 개의 core가 cpu chip에 구성된 것 즉, 여러 개의 CPU코어가 시스템에 사용되는 것이다.
즉 이것은 parrallel programming이라고 할 수 있다.
토의 주제로 돌아가보자. 강의자료 p.13페이지에서는 data paralleism과 task parallelism에 대해 비교하고 있다.
4. parrallel programming
parrallel programming의 유형에는 크게 두 가지 Data, Task parallelism이 있다.
- Data parallelism(데이터 병렬 실행) : 같은 Task를 data의 부분집합으로 나눠서 여러 개의 core를 한꺼번에 돌려 동일한 연산을 진행하는 방법, 여러 개의 코어가 동일한 작업을 동시에 실행하는 것
- ex) 1, 2,...., N까지 수에 대하여 제곱을 구할 때, 여러 개의 processor가 N/P 개씩 맡아 제곱을 구함
- 동기 연산을 함
- 모든 데이터 집합에서 작동하는 실행 스레드가 하나만 있으므로 속도가 더 빨라진다.
- 병렬화의 양은 입력 크기(=data의 크기)에 비례
- 처리해야 할 data가 매우 많을 때 사용된다
- 멀티프로세서 시스템의 최적 로드밸런스를 위해 설계되었다.
- 종류
- SIMD(Single Instruction, Multiple Data) : 다수의 데이터 처리를 동일한 명령어로 처리
- SPMD (Single Program, Multiple Data) : 다수의 데이터를 동일한 프로그램 or 커널 or 함수로 처리, 벡터 연산이 이에 해당함
- 대부분의 GPU kernel (OpenCL ND-range, CUDA Grid)
Data parallelism은 딥러닝 분산학습 방법 중 하나이다.
딥러닝, 인공지능 분야에서는 여러 개의 신경망 계층 또는 이미지처럼 대규모의 데이터세트를 다루기 때문에 GPU 기반 시스템을 사용한다.
딥러닝 모델 학습 시 대규모 데이터 때문에 여러 GPU에 나누어 연산하는 분산학습이 이루어진다.
학습해야 할 데이터가 많은 상황에서 학습 속도를 높이기 위해 나온 방법이라 할 수 있다.
예를 들어 하나의 GPU가 1개의 data를 학습하는데 1분이 걸린다고 하면 1000개의 데이터를 학습하는 데는 1000분이 걸릴 것이다.
하지만 100개의 데이터씩 10개의 GPU에 나누어 학습시킨다면 100분이 걸릴 것이다.
- Task parallelism (태스크 병렬 실행): 태스크(스레드)를 여러 개의 코어에 분배하여 여러 개의 코어가 각 task를 병렬로 처리하는 것, 여러 개의 코어가 서로 다른 작업을 동시에 실행하는 것
- ex) 여러 개의 processor가 func1(), func2(),..., funcN()을 맡아 처리하는 것
- 비동기 연산을 함
- 여러 개의 스레드 또는 프로세스가 서로 다른 작업을 동시에 진행하기 때문에 속도 향상이 적음
- 병렬화의 양은 수행되는 독립 task 수에 비례
- 로드 밸런싱은 하드웨어의 가용성과 정적 및 동적 스케줄링과 같은 스케줄링 알고리즘에 따라 달라진다.
- 종류
- Pthreads(POSIX thread) : unix 표준 thread 생성 system call
- 딥러닝의 Model parallelism
Model parallelism은 Model size가 너무 커서 하나의 GPU 메모리에 다 들어가지 않는 경우 여러 GPU에 모델 parameter를 나누어 연산하는 것을 말한다. 즉, 여러 개의 GPU가 모델의 서로 다른 작업을 동시에 실행하는 구조로 볼 수 있다.
동기(Synchronous) vs 비동기 (Asynchronous)
동기 방식이란 메서드의 리턴과 결과를 전달받는 시간이 일치하는 명령 실행 방식으로 한 함수가 끝나는 시간과 바로 다음 함수가 시작하는 시간이 같다.
비동기 방식이란 여러 개의 처리(task)가 함께 실행되는 방식으로 동기 방식에 비해 단위시간당 많은 작업을 처리할 수 있다.(CPU나 메모리를 많이 사용하는 작업을 비동기로 처리하면 과부하가 걸릴 수 있고 프로그램의 복잡도가 증가한다)
'운영체제' 카테고리의 다른 글
[7주차 토의 주제] Synchronization tools in Java (0) | 2023.04.15 |
---|---|
[6주차 토의 주제] <article review> CFS Linux (0) | 2023.04.08 |