2011-12-01 2 views
1

제목이 약간 잘못되었지만 다소 혼란 스럽습니다.자바에서의 프로그램 성능은 스레드 변화에 따라 변동합니다.

나는 프로그램의 작업을 수행하기 위해 x 개의 스레드 수를 인스턴스화하는 인수 x를 취하는 java로 프로그램을 작성했습니다. 내가 실행중인 기계는 8 개의 코어/32 개의 스레드를 병렬로 처리 할 수 ​​있습니다 (각 코어에는 4 개의 하이퍼 스레드가 있음). 지난 8 개의 스레드 (예 : 22)를 실행했을 때, 스레드를 균등하게 실행하면 스레드가 23 개 스레드 (실제로 느림)를 실행할 때와 달리 프로그램이 더 빠르게 실행됩니다. 성능 차이는 둘 사이의 약 10 %입니다. 왜 이럴 수 있니? 쓰레드 오버 헤드는 실제로이 점을 고려하지 않았고, < 개의 32 쓰레드를 실행하는 한, 쓰레드의 수를 증가시킬 때만 더 빨라야한다고 생각합니다.

프로그램이 무엇을하는지 아이디어를주기 위해 프로그램은 1000 * 1000 배열을 가져오고 각 스레드는 업데이트 할 배열의 일부를 할당받습니다 (반올림/남은 부분은 마지막 스레드에 인스턴스화됩니다) .

홀수/짝수 스레드의 성능 차이에 대한 이유가 있습니까? 내가 상상할 수

답변

2

두 가지 이유 :

  1. 당신의 코어/스레드의 메모리 액세스를 동기화 할 필요가있다. 결국 CPU 코어 캐시 등이 무효화되어 성능이 저하됩니다. 그들에게 정말로 분리 된 작업을 해보고, 같은 배열로 작업하지 못하게하십시오. 참고 : 메모리는 개별 바이트로 관리되지 않습니다.

  2. 하이퍼 스레딩 CPU는 종종 완전한 성능을 갖지 않습니다. 예를 들어 부동 소수점 단위를 공유해야 할 수도 있습니다. 예를 들어, 한 스레드는 정수 - 무거운 수학이고 다른 스레드는 무겁다. 그러나 아마

불과 2 추측 ... 다시 기다리고, 컨텍스트 스위칭, 대기중인 다른 스레드를 신호, 다시 컨텍스트 스위칭 의미 네 개의 스레드 부동 소수점 유닛을 필요로하는 각 데. 예를 들어, 사용중인 실제 CPU, 파티션 구성표 및 계산 작업에 대한 자세한 힌트를 제공해야합니다.

+0

항목 1과 관련하여이 동작은 운영 체제에 따라 다를 수 있습니다. 운영 체제는 이전에 사용했던 코어에서 휴면 스레드를 "깨우기"위해 시도 할 수있는 일부 예약 알고리즘을 가지고있어 캐시 누락을 줄입니다. 알고리즘에 따라 홀수를 사용할 때 잘못된 코어에서 스레드가 깨어날 확률을 높일 수 있습니다. 또한 단지 추측. – toto2