open MP
on
Open MP 이거 생각보다 쓰기 쉽진 않은 것 같다. 눈으로 보기에 매우 평이해보이는 code를 open mp로 병렬 구동하더라도 늘상 빨라지진 않는다. 아무래도 이러 저러한 제한이 붙는지 생각보다 많이 빨라지지 않는 걸 넘어서 오히려 더 오랜 시간이 걸리기도 했으니 말이다.
그냥 아예 무식하게 한가지 일을 병렬화 하지 말고 그냥 여러 개의 일을 동시에 벌이는 것이 어찌보면 상책일 수 있어 보인다.
Open MP는 mpi와는 달리 동일 프로세서(동일 머신)에서 thread를 많이 벌려서 병렬처리를 하는 것인데, 사실 thread로 일을 벌려서 처리하는 것이 훨씬 더 빠른 결과를 얻는다. 그것은 코드 작성자가 무엇이 독립적인 인자이고 아닌지를 잘 구분할 수 있어서 thread와 thread를 customized parallel processing을 할 수 있기 때문인 것인데, 사실 open mp도 사용할 수 있는 옵션이 많이 있어서 이 또한 학습해야 하는 것이니까, 그럴 노력이라면 차라리 thread를 잘 쓰는 것이 더 이득이 아닐까 하는 생각을 해본다.
겉보기에 간편해 보이는, 그러나 실제로는 잘되게 만들기가 오히려 더 쉽지 않아서 시간만 까먹는 open MP에 의존할 이유는 없어보인다. 지금 버전이 4.5까지 나온 것 같은데 내 눈엔 빛좋은 개살구로 보인다.
사실 응용 프로그램 한 두 개 잠깐 돌려야 하는 경우는 오히려 이런 수고를 들이는 것이 시간 낭비일 수 있는데, 매일 같이 돌려야 하거나 한번 돌면 여러 날 장시간 돌아야 되는 경우는 무슨 노력이 들든 무조건 병렬로 돌리는 것이 남는 장사다. 누군가 잘 만들어준 툴을 쓰는 입장에서는 생각할 필요도 없겠지만 손수 전부 다 만들어서 처리해야 하는 경우에는 요새 같이 수십개 thread를 동시에 방해 받지 안게 띄울 수 있는 머신들이 저렴한 가격에 나오고 있고 하다 못해 병렬로 사용할 수 있는 컴퓨터 자원을 리모트로 임대해서 쓸 수 있는 상황에서는 병렬화를 잘하면 그 자체가 돈이 되는 것이니 (내 돈이 아닌 회사 돈이라는 게 문제지만) 말이다.
C++11부터 pthread가 아닌 thread라는 class를 쓸 수 있게 되었다. 사용할 수 있는 core의 개수도 쉽게 구할 수 있고 thread를 생성하는 것도 너무나 간단해졌다. open mp 추구하는 방향이 좋긴 한데, 이게 만병통치약도 아니고 원터치로 할 수 있는 것도 아니라 연구가 필요한 반면 thread class를 쓰는 방법은 너무 간단하다. 아쉽게도 N개 thread를 벌렸다고 해서 속도가 N배 빨라지진 않지만 역시 이 방법 만한 것은 없다고 본다.
물론 시켜야 할 일이 N개가 있다면 그냥 N개를 별개의 프로세스로 벌이면 대략 N배의 속도가 얻어지긴 한다. 한 가지 일을 N배 속도로 해내진 못하니까. 그러나 일이 N개로 독립된 일이 아니면 이만큼의 효율을 얻을 수는 없다.
이로써 Open MP는 안녕하고 OpenCL로 건너가볼까 한다.