Ryzen에서 multithreading

pthread 또는 openmpi 같은 것으로 Ryzen 위에서 병렬 작업을 시켜보면 실제로 thread 수를 32개로 할 수 있다고 하더라도 core 수가 16이라고 하면 16일 때의 효율이 가장 좋다. 32로 하면 성능이 절반으로 떨어지면 그나마 다행인데 그것보다 더 아래로 떨어진다.

일반적으로 CPU가 보장하는 thread수의 일을 시키면 각각의 thread의 효율은 100%가 되지 싶은데 Ryzen에서 일을 시켜보면 그건 아니다 싶다.

동일한 일을 시킨다고 보면 core수만큼 일을 시킬 때의 효율이 가장 좋은데, 이 때 효율을 100이라고 보면 그 두 배수의 thread로 일을 벌리면 각각의 thread에서 효율은 50으로 떨어지는 게 아니라 그 이하로 떨어진다.

즉, 16일 때 100%의 효율이 나온다고 하면 32로 하면 40%도 안나온다.

다시 말하자면 일의 총량이 100이라고 할 때

코어수 만큼 병렬로 일을 시킬 때 개개 process의 효율이 100% 발휘되어서 5분에 마칠 수 있다고 하면 thread 수만큼 일을 시키면 효율이 100%이 되어서 2.5분에 끝나겠지 싶지만, 효율이 50%로 아래로 떨어지는 결과를 보게 된다. 그래서 마찬가지로 5분에는 일이 끝나겠지 싶지만 실제로는 7분 정도가 지나서야 일이 끝나는 것을 보게 된다.

효율을 끝까지 올려야지 해서 쓸 수 있는 thread를 다 끌어다 써야지 하지만 그게 그렇게 되지 않고 더구나 기계가 심하게 고생해서 알게 모르게 빠르게 열화되는 측면도 있어서 그냥 16으로 쓰는 것이 여러 가지로 이득이다. 또 일을 시키는 동안 발생하는 다른 process들이 치고 들어오기 힘들어져서 효율은 더 떨어진다.

thread 수는 쉽게 말해 뻥카인거다. 왜 이렇게 다들 아는 걸 혼자 모르고 살았냐면 그저 순진했기 때문이라고 할 밖에. Ryzen에서 이 현상은 더 두드러진다고 하는데, 그러나보다 할 뿐.