병렬 프로그래밍과 시스템 의존성

병렬 프로그래밍을 하면서 대부분 일단 배우는 것이 쓰레드를 잘 이용하는 방법부터 시작하여 하나하나 공부해 나갑니다. 저도 그런 수업을 들어왔고요. 그러다 여러 병렬 프로그래밍 환경을 살펴보면 은근 의존성을 겪게 됩니다.

실제로 프로그래밍을 병렬화 작업을 진행하려면 해당 라이브러리를 이용하여 작성하는 경우가 많은데, 이 라이브러리들이 시스템 의존적인 라이브러리가 있고 그렇지 않은 라이브러리가 있습니다. 대표적으로 엔비디아틔 쿠다(CUDA)와 같이 프로세서 제조사에서 지원하는 라이브러리를 이용해야 하는 경우도 있고, 라이브러리에서 좀 더 자율적으로 처리해주는 OpenCL, MPI와 같은 경우도 있습니다. 또한 인텔처럼 자사의 페러럴 스튜디오를 통한 병렬 프로그래밍을 좀 더 최적화하여 진행하도록 컴파일러도 제공합니다. 언어 레벨에서 지원하는 라이브러리도 늘고 있어서 병렬화 작업이 많이 친숙하게 다가오고 있는 것은 확실합니다.

일단 이런 식으로 살펴는 봤는데, 그럼 이것들의 경우에는 직접 제어하는 프로세서, 시스템에 얼마나 의존적일수록 좋은 것일까라는 생각을 해봅니다만…

가장 단순한 사고를 해본다면, 저수준의 병렬화를 쉽게 구현할 수 있다면 확실히 빠릅니다. 라이브러리 함수 콜(API 함수 사용)을 통해 진행되는 병렬화에 의존하지 말고 직접 pthread를 능숙하게 제어하는 쪽이 퍼포먼스는 확실히 빠르게 나옵니다. 단, 저수준의 병렬화를 진행한다는 것은 정말 어려운 작업입니다.

그러나, 그렇게 하더라도 병렬화 작업을 위한 멀티코어 혹은 매니코어 제조사에서 제공하는 최적화된 API 라이브러리를 이길 수는 없습니다. 엔비디아의 쿠다만 하더라도, 쿠다에 최적화된 코딩 스타일이 존재합니다. (쿠다 프로그램밍을 해보시면 이게 어떤 뜻인지 대충은 아실 겁니다.) 인텔의 경우에도 CPU의 병렬화만 진행하더라도 패러럴 스튜디오에서의 병렬 최적화 튜닝 기법을 이용하면 일반 프로그램에서 쓰레드 제어를 잘 하는 것보다 훨씬 빠른 병렬화가 가능합니다.

이런 식으로 본다면 시스템에 상당히 의존적인 부분이 크게 느껴질 겁니다. 하지만, 응용 프로그램을 개발하는 사람들의 입장에서 보면 자신이 혹은 사용자가 어떤 시스템을 이용할 지 모르는데 시스템 의존적인 병렬 프로그래밍을 할 수는 없습니다. 상각해 보죠. 자신이 프로그램을 개발해야 하는 입장에서라면..? 여러 곳에서 이용하고 싶기 때문에 의존성이 최대한 낮은 쪽을 이용해야 여러 플랫폼, 여러 시스템에 상관 없이 이용할 수 있을 것입니다. (JVM 상에서 멀티쓰레드 제어에 침흘리는 사람들이 이런 입장일 겁니다.)

하지만 실제로 의존성을 무시할 수는 없습니다. 의존성에 의한 퍼포먼스 증가는 무시할 수 없는 수준입니다. 과학 실험을 위한 프로그램들은 대다수가 특정한 HPC를 정해놓고 이용하기 때문에 의존적인 프로그램으로 실험을 하여도 아무 문제가 없습니다. 과거에 제가 개발했던 열역학 시뮴레이터도 그랬고요. 하지만 응용 프로그램을 개발하는 입장에서 병렬 프로그램을 이용해야 한다면 특정한 시스템에 의존성을 가져야 되는지 아닌지에 대해서는 여러모로 고민하게 될 거 같습니다만, OpenCL이나 MPI를 보다보면 어느 정도의 해답은 있을 것 같습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.