UPnL Workshop: Introduction to Concurrent Programming

9회차의 UPnL 워크샵 발표 자료. 처음으로 Apple Keynote를 써봤는데, 대학원 2년 동안 빡쎄게 썼던 MS 파워포인트보다/OOo Impress보다 나름대로 인터페이스도 편하고 템플릿도 적당한듯하고, 전체적으로 괜찮았다 — 템플릿에서 고른 해상도가 와이드 모니터 기준으로되서 4:3 해상도였던 프로젝터에서 좀 꽝이었던 것만 빼면 Orz

발표한 주제는 Concurrent programming에 대한 간략한 소개.

프리젠테이션 내용을 간략히 설명하자면, 이쪽 문제들 중에 가장 간단한 것 — data-parallelism을 써먹을 수 있는 것 — 을 골라서 예제로 썼다. 2D 이미지에서 median filter를 적용시키는 문제를 설명했는데, “이런 과정으로 구현했다“는 것을 보였다.

  1. 미리 k개의 스레드를 생성한다 (k = CPU core 수)
  2. 필터를 적용할 범위를 찾아서 수평으로 k개의 sub image로 쪼갠다 (height을 k등분)
  3. 서브 이미지를 k 개의 스레드에게 전달하고 처리하게 한다1
  4. 처리된 이미지를 병합한다 — 사실 병합이고 자시고할 것 없이 출력 버퍼에서 offset만 잘 잡아주면된다

즉, 이미지를 이렇게 쪼갠다. (core수가 4개일 때 기준으로)

Splitted sub images

그리고 나서 각각을 개별 core에서 필터링 한다. ((사용한 필터가 median filter라 여기에선 잘 안보일 것 같아서 화면은 pixelize 필터를 돌린걸로 대체했다.))

Concurrent Filtering of Sub-image

진행 중일 때는 이렇게 된다. 그리고 모든 처리가 끝나고, 처리 종료가 메인 스레드에 signaling 되면 최종 처리된 이미지를 표시해주면 끝. 물론 필터 자체가 이렇게 local한 영역만 보는게 아니라면 문제가 복잡해지지만 입력/출력 버퍼가 구분되고, 필터가 일부 영역(local)만 보는 경우엔 매우 쉽게 동시처리 할 수 있다.

설명을 하고, 간단히 시연했다 — 5000 by 3000이미지를 써서 Dual Core에서 7.1s vs. 3.9s 정도로 83%쯤 빨라졌다. 관심있는 후배가 많았으면 좋겠다(…).


  1. 예전에 작성한 C++ closure를 유용히 써먹었다. 개별 코어에서 수행할 작업을 하나의 Closure로 만들어서 전달하게해서, Worker thread에 작업을 전달하는 방법을 단일화했다. 즉, 스레드에 넘길 작업 종류가 증가해도, 인터페이스는 Closure를 여러개 전달하는 인터페이스 하나면 족하다. ↩︎