문제

쿼드 코어 Intel i7에서 다중 스레드 프로그램을 실행합니다.Runtime.getRuntime.availableProcessors()를 실행할 때 8을 얻고이 CPU에서 하이퍼 스레딩을 사용할 수 있음을 알고 있습니다.

그러나, 스레드를 생성 할 때, CPU 수준은 4 개의 스레드에 대해 100 % (i.e..e. 아닌)이며, 4 개의 스레드가 사용되지 않는다는 것을 의미합니다.Java에서 하이퍼 스레딩을 가능하게하는 방법이 있습니까?

도움이 되었습니까?

해결책

HyperThreading은 모든 최신 JVM이 기본 스레드를 사용한다는 사실에 의해 활성화되어 있으므로 OS / CPU 구성 설정입니다.

그러나 HyperThreading은 여분의 코어를 제공하지 않으며, 귀하가 가진 네 가지 CPU의 미세한 자리 잡은 시간대를 허용합니다. 즉, 하나의 스레드가 멈추는 동안 메모리의 페이지가 캐시로 비행 될 때까지 기다리면 다른 스레드가 CPU의 일부를 사용하여 사용할 수 있습니다. 복잡한 스케줄링 요구 사항으로 인해 CPU 코어의 크기에 약 10 %의 여분의 추가 기능을 추가하고 모든 응용 프로그램에 도움이되지 않습니다.

네 개의 스레드가있는 4 개의 CPU를 최대한 밖으로 Maxed하면 하이퍼 스레딩이 켜지거나 꺼짐으로 가능합니다. 그것은 단지 그 스레드가 많이 차단하지 않고 핫스프러를 실행하고 있음을 의미합니다.

Java가 4가 아닌 8 코어 CPU를보고하는 이유는 OS가 Java에게 8 개의 코어가있는 Java를 알려주기 때문입니다. OS는 OS가 8 핵심 CPU 인 것처럼 스레드를 예약하라는 것이 훨씬 간단한 OSE에 대한 하이퍼 스레딩 지원을 추가했습니다. OS는 이전과 같이 스레드 관리를 수행하고 하이퍼 스레드의 내부 작동의 대부분을 잊어 버리고 CPU가 CPU의 일부가 사용 가능한 경우 조립품의 로우 레벨 스케줄링을 관리 할 수있게합니다.

벤치 마크가 여기를 읽을 수 있습니다 / P>

다른 팁

다음 명령을 사용하십시오

$ lscpu
.

출력을 사용하여 실제 코어 수를 결정할 수 있으며 하이퍼 스레딩을 사용하도록 설정했는지 여부를 확인하십시오.

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                32
On-line CPU(s) list:   0-31
Thread(s) per core:    2
Core(s) per socket:    8
Socket(s):             2
NUMA node(s):          2
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 45
Stepping:              7
CPU MHz:               2399.995
BogoMIPS:              4799.35
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              20480K
NUMA node0 CPU(s):     0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30
NUMA node1 CPU(s):     1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31
.

달성 할 수있는 실제 병렬 처리는 (소켓 당 코어) X (코어 당 스레드)입니다.프로세서가 하이퍼 스레드인지 확인하려면 핵심 매개 변수 당 스레드를 사용할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top