어떤 대량 작업 처리를 할 때
스레드 수를 코어 숫자까지 올리면 거의 비례해서 처리 속도가 향상되는 걸 확인할 수 있는데
책에는 스레드 수가 코어 숫자를 넘어가면 경합? 레이스 컨디션? 이런 게 발생해서 처리 속도가 오히려 떨어진다고 하는데
실제로 프로그램 짜 보면 코어 숫자+1개까지는(6코어면 7스레드) 처리속도가 향상되는데 이거는 왜 그런거임?
8스레드부터는 처리 속도 떨어지는거도 확인했는데, 왜 굳이 7스레드를 해야 최적 속도가 나오는지 궁금함..
제너럴하게 따질 때 N+1이 낫냐 N이 낫냐는 옛날부터 논란이 있던데 상황따라 다르더라 IO 작업이 많으면 N+1 (혹은 그 이상일 때도 있을수도)이 더 빠를 때가 많은 듯
ㅇㅎ 결국 테스트 해봐야 되는거네여 ㄱㅅㄱㅅ
니가 말하는 코어가 논리코어냐 물리코어냐가 일단 중요하고, SMT 켰냐 껐냐가 중요하다. 인텔 칩 기준으로는 물리코어 6개에 논리코어 12개 이런식으로 2배인 경우가 많다. 보통 논리코어보다 쓰레드를 많이 만드는걸 oversubscription 이라고 부르는데, 본인이 짠 병렬 코드가 메모리 사용이 비효율적이면 - return 0;
latency hiding 효과로 성능 향상이 있을 수는 있다. 근데 일단 논리코어 갯수가 6개 맞는지부터 확인해라 - return 0;
테스트는 i5-4460이랑 RYZEN 3500X에서 System.availableProcessors() 호출해서 해봤음
무조건 코어 당 스레드 하나씩 배분된다는 보장은 없어서 어떤 코어가 어느정도의 부하를 받고 있는지에 따른 변수도 있을거임
일반적인 상황은 위에사람들이 잘 설명해줬고 hyper-threading 끄고, 프로세스랑 일반 os 가 사용하는 코어 분리, IRQ/process affinity등의 설정을 튜닝하고 다시 돌려보면 N, N+1, N*2 같은 비교에서 또 다른 결과를 얻을수도 있음
다른 프로세스들도 돌고 있으니까 쓰레드 많이 만들면 점유율이 더 높아지겠지