멀티 쓰레딩에 대한 ...
최적화를 하게 되면 멀티 쓰레딩 작업은 항상 하게 된다. GPU는 그 근간부터 그렇고, CPU도 많은 싱글 쓰레드 기반의 시스템에서도 결국엔 멀티 쓰레드를 이용할 수 밖에 없게 된다. 사실 많은 게임들이 여러 이유로 다른 코어들을 쉽게 활용할 수 없기도 하다.
잘못된 멀티 쓰레딩 작업을 보면 보통 어떠한 작업을 분산해서 처리하는 것에 집중하는 경우가 많다. 그렇게 하는 것이 당연해 보이기도 하지만 실제로는 분산 처리는 목적일 뿐이고 근본적으로 어렵고 핵심적인 부분은 그것이 아니다. 핵심은 공유 자원의 제거이다.
물론 공유 자원을 말 그대로 없앨 순 없고 대부분의 상황에서 이건 불가능하다. 좁게 보면 가능하고 넓게 보면 불가능하다. Map-reduce 형태를 예로 들자.
Map-reduce는 각 요소에 map 연산(operator)을 하고, 그 결과들을 한데 모아 줄여서(reduce) 결과를 도출하는 것이다. 대표적인 내적(inner/dot product)이다. 3차원 공간에서 A dot B는 각 요소를 곱하기(map) 하고 각 결과물을 모두 더해(reduce)하나의 수가 된다. N 차원으로 일반화를 시키면 R = \sum^{N}{i=1} A_i * B_i = \sum^{N}{i=1} C_i, C_i = A_i * B_i
여기서 A_i 는 A_{i+1}과 독립적이다. 공유하는 자원이 없다. 여러 A_i 가 모여 A를 구성할 뿐이지 각 A_i들은 서로 독립적이다. 이때 A_i * B_i 는 분산 처리를 할 수 있다.
반면, 모든 C_i(=A_i * B_i)를 다 더해서 R로 만드는 과정은 일반적으로 한번에 독립적으로 수행할 수 없다. 물론 많은 수의 덧셈을 분산 처리 하는 알고리즘은 여럿 있지만 이것을 단 한번에, 동시에 수행할 수는 없다는 의미다. 순차적으로 계산을 한다면 C_1 + C_2 를 계산해야 그 결과 값에 C_3을 더할 수 있다. 이것은 여러 덧셈이 서로 의존적이기 때문이다.