쓰레드 개수가 증가할수록 명시적으로 제어하면 다루기가 매우 어려워집니다. 따라서 쓰레드의 생성과 관리를 프로그래머가 아닌 컴파일러 혹은 런타임 라이브러리로 다루는 방법이 등장하였습니다. 5가지 방법이 존재합니다.
쓰레드를 생성하는 것도 오버헤드가 꽤 많이 발생합니다. 따라서 쓰레드를 미리 생성해두어 쓰레드 풀에서 대기 상태로 있다가 작업이 배정되면 실행, 실행이 끝나면 리소스 해제 후 다시 풀에 들어가 대기하는 방식입니다.
메인 쓰레드에서 fork 를 진행하여 작업을 실행한 후 종료하면 join 으로 다시 메인 쓰레드 하나로 돌아오는 방법입니다.
시스템 콜의 fork() 와 똑같습니다! 단지 join 으로 원래의 메인 쓰레드로 돌아간다는 점만 빼면 말이죠
약간 divide-and-conqure 방식 같은 느낌입니다.
shared-memory 환경에서 병렬 프로그래밍을 지원합니다. 전처리를 통해 컴파일러에게 지시하는 느낌입니다.
#pragma omp parallel
: 코어의 개수만큼 쓰레드 생성#pragma omp parallel for
: 병렬로 루프 수행예를 들면
이렇게 해서 전처리 내부 구문을 코어의 개수만큼 병렬로 처리할 수 있습니다.
애플의 macOs, iOS 에서 사용하는 기술입니다. OpenMP 방식이랑 거의 똑같습니다! 단지 전처리 방식만 좀 달라질 뿐입니다. 예를 들어 ^{ printf("aaa"); }
와 같이 ^{}
를 통해 명시합니다.
for (int i = 0; i < n; i++) {
apply(v[i]);
}
이런 코드를
parallel_for (size_t(0), n, [=](size_t i) {apply(v[i]);});
이렇게 바꾸어 병렬 처리를 할 수 있습니다.