병렬 컴퓨팅

병렬 컴퓨팅 (Parallel Computing)

Julia는 동시성(concurrency)과 병렬(parallel) 프로그래밍을 위한 네 가지 범주를 지원해요. 하나하나 어떤 상황에서 쓰면 좋은지 짚어볼게요.

출처: Julia 공식 매뉴얼 · Parallel Computing

본문

Julia가 지원하는 동시·병렬 프로그래밍의 네 범주는 이러해요.

  1. 비동기 "태스크(Task)", 혹은 코루틴(coroutine) Julia의 Task는 계산을 잠시 멈췄다가(suspend) 다시 재개(resume)할 수 있게 해줘요. I/O, 이벤트 처리, 생산자-소비자(producer–consumer) 같은 패턴에 잘 어울리죠. Task는 waitfetch 같은 연산으로 동기화하고, Channel을 통해 서로 통신해요. 태스크 자체는 엄밀히 말해 병렬 컴퓨팅이 아니지만, Julia는 Task를 여러 스레드에 스케줄링할 수 있게 해줘요.

  2. 멀티스레딩(Multi-threading) Julia의 멀티스레딩은 메모리를 공유하면서 Task를 둘 이상의 스레드나 CPU 코어에 동시에 스케줄링하는 능력이에요. 개인 PC나 한 대의 대형 멀티코어 서버에서 병렬성을 얻는 가장 쉬운 방법이죠. Julia의 멀티스레딩은 **합성 가능(composable)**해요. 어떤 멀티스레드 함수가 또 다른 멀티스레드 함수를 호출하면, Julia는 과잉예약(oversubscribing) 없이 모든 스레드를 사용 가능한 자원에 전역적으로 스케줄링해요.

  3. 분산 컴퓨팅(Distributed computing) 분산 컴퓨팅은 각각 별도의 메모리 공간을 가진 여러 Julia 프로세스를 실행하는 방식이에요. 프로세스들은 같은 컴퓨터에 있을 수도, 여러 컴퓨터에 나뉘어 있을 수도 있어요. Distributed 표준 라이브러리가 Julia 함수의 원격 실행 기능을 제공하고, 이 기본 구성 요소를 바탕으로 다양한 분산 컴퓨팅 추상화를 만들 수 있어요. DistributedArrays.jl 같은 패키지가 그런 추상화의 예시고, 반대로 MPI.jl이나 Elemental.jl 같은 패키지는 기존 MPI 생태계의 라이브러리에 접근할 수 있게 해줘요.

  4. GPU 컴퓨팅 Julia GPU 컴파일러는 Julia 코드를 GPU에서 네이티브하게 실행할 수 있게 해줘요. GPU를 겨냥한 Julia 패키지 생태계도 풍부한데, JuliaGPU.org 웹사이트에서 지원하는 GPU 목록, 관련 패키지와 문서를 확인할 수 있어요.

더 알아보기

  • Networking and Streams (이전 장)
  • Asynchronous Programming (다음 장)
  • 병렬 컴퓨팅에 대한 자세한 내용은 Julia 매뉴얼의 각 주제별 문서 참고