2011-01-22 4 views
15

여러 스레드 (또는 프로세스)를 동시에 생성하는 경우 물리 개의 프로세서 또는 논리적 인 프로세서의 수만큼 스폰하는 것이 더 좋습니다 (작업이 CPU 바운드라고 가정)? 아니면 중간에 뭔가를하는 것이 더 낫습니다 (말하자면 3 개의 스레드)?이중 코어 하이퍼 스레딩 : 4 개의 스레드 또는 3 또는 2를 사용해야합니까?

성능은 실행되는 명령의 종류 (예 : 비 로컬 메모리 액세스가 캐시 적중과 다른 점)에 따라 달라 집니까? 그렇다면 어떤 경우에 하이퍼 스레딩을 이용하는 것이 더 낫습니다.


업데이트 :

내가 부탁 해요 이유는 당신이 가상 프로세서의 수만큼 작업이있는 경우, 동일한 물리적 코어에 작업을 때로는 약간의 CPU를 굶어 수있는 곳 읽은 기억이다 자원을 확보하고 필요한만큼 많은 자원을 확보하지 못하게하여 성능을 저하시킬 수 있습니다. 그래서 가상 코어만큼 많은 스레드를 갖는 것이 좋은 생각인지 궁금합니다.

답변

5

성능은 다양한 요인에 달려 있습니다. 대부분의 작업은 엄격하게 CPU 바운드가 아닙니다. 모든 데이터가 메모리에 있어도 일반적으로 프로세서 캐시에 내장되어 있지 않기 때문입니다. 메모리 액세스 패턴이 주어진 '병렬'프로세스의 성능 프로파일을 크게 바꿀 수있는 예제 (예 : this one)를 보았습니다.

간단히 말해서 모든 상황에 대한 완벽한 숫자는 없습니다.

+0

+1 그 링크는 매우 유익합니다; 감사! – Mehrdad

2

하이퍼 스레딩이 성능을 최대 30 %까지 높일 수 있다는 정보를 기억합니다. 일반적으로 4 개의 코어로 취급하는 것이 좋습니다. 물론 일부 특정 상황에서 (예를 들어, 각 코어에 바인딩 같은 장기 실행 작업을 가짐) 일부 코어는 단지 논리적 인 사람은 하이퍼 스레딩 자체에 대한

대한 추가 정보를 원하시면 것을 고려하여 더 나은 처리를 나눌 수 here

+0

+1 재미있는 ... 나는 HT 다른 인텔 문서를 읽어 싶지만,이 하나의 다른과 더 많은 정보를 가지고; 감사! – Mehrdad

+0

현재 링크가 404입니다. – user643011

4

하이퍼 스레딩이 활성화 된 상태에서 코어 당 2 개의 스레드를 실행하여 성능이 향상 될 가능성이 매우 높습니다. 이라는 작업은 전체적으로 CPU 바운드가되도록으로 나타나고 HyperThreading은 가끔 인터럽트 나 컨텍스트 전환에서 몇 가지 "추가"사이클을 추출 할 수 있습니다.

반면에 Turbo Boost가있는 코어 iX 프로세서를 사용하면 실제로 CPU 당 하나의 스레드를 실행하여 CPU가 오버 클럭을하도록 유도 할 수 있습니다.

우리는 일일에 여러 가지 계산을 수행하는 전체 CPU에서 많은 코어 서버를 일상적으로 실행합니다. 잠시 뒤로 HT의 유무에 따른 성능 차이를 측정했습니다. 우리는 평균적으로 HyperThreading을 사용하고 동시에 두 배의 작업을 실행하는 것으로 나타났습니다. HyperThreading이없는 경우보다 동일한 양의 작업을 약 10 % 더 빨리 완료 할 수있었습니다.

코어가 2 × 코어라고 가정하지만 결론은 다음과 같습니다.

+0

+1 터보 부스트 기능을 지적 해 주셔서 감사합니다 ... 내 자신의 CPU에서 가지고 있지만 방정식의 일부분에 영향을 미칠 수있는 방법을 생각한 적이 없었습니다. – Mehrdad

+1

HyperThreading을 사용하여 성능이 향상되는지 여부는 캐시 크기가 절반으로 줄어든 것과 관련이 있습니다. 캐시 적중률이 충분히 높으면 캐시 크기 손실이 취소되지 않습니다 (또는 최악의 경우) 두 개의 하드웨어 스레드가 필요합니다. –

2

하이퍼 스레딩을 사용하여 동일한 코어에서 두 개의 스레드를 실행하면 두 스레드가 비슷한 메모리 액세스 패턴을 가지고 있지만 분리 된 데이터 구조에 액세스 할 때 캐시의 절반을 차지하는 두 개의 별도 코어에서 실행하는 것과 거의 동일합니다. 메모리 액세스 패턴이 캐시의 절반이 스 래싱을 방지하기에 충분하면 성능이 좋을 수 있습니다.캐시를 반으로 줄이면 스 래싱이 발생하는 메모리 액세스 패턴의 경우 10 배의 성능 저하가 발생할 수 있습니다 (하이퍼 스레딩을 사용하지 않으면 성능 저하가 훨씬 클 것임).

한편, 하이퍼 스레딩이 큰 승리를 거둘 수있는 몇 가지 상황이 있습니다. 많은 스레드가 모두 잠금없는 데이터 구조를 사용하여 동일한 공유 데이터를 읽고 쓰고 있고 모든 스레드가 데이터의 일관된 뷰를보아야하는 경우 분리 된 프로세서에서 스레드를 실행하려고하면 한 번에 하나의 프로세서 만이 스 래싱을 일으킬 수 있습니다. 주어진 캐시 라인에 대한 읽기 - 쓰기 액세스 권한을가집니다. 두 개의 코어에서 이러한 스레드를 실행하는 것은 한 번에 하나씩 만 실행하는 것보다 오래 걸릴 수 있습니다. 그러나 단일 코어에서 여러 스레드가 데이터에 액세스 할 때 이러한 캐시 조정은 필요하지 않습니다. 이러한 경우 하이퍼 스레딩은 큰 이점이 될 수 있습니다.

유감스럽게도 일부 스레드는 가능한 경우 코어를 공유해야하지만 다른 스레드는 가능한 경우 별도로 실행해야한다는 "힌트"를 스케줄러에 제공하는 방법을 알지 못합니다.

+0

스레드에 대한 프로세서 선호도를 설정할 수 있습니다. 이는 힌트보다 좋습니다. –

+2

@ChrisO : 그렇습니다. 그러나 실제 "힌팅"메커니즘은 "가능한 경우 스레드 X가 스레드 Y와 동일한 코어를 공유해야합니다"라고 말할 수 있으며, 스케줄러가 어떤 코어에서 어느 코어를 공유할지 결정할 수 있습니다 순간. – supercat

+0

예, 이제 알겠지만 힌트는 실제로 하드 코드 된 코어 #보다 낫습니다. –

0

다른 모든 답변은 이미 많은 훌륭한 정보를 제공합니다. 그러나 고려해야 할 또 하나의 요점은 SIMD 유닛이 동일한 다이상의 논리적 코어간에 공유된다는 점입니다. 따라서 SSE 코드로 스레드를 실행하는 경우 4 개의 논리 코어 모두에서 실행하거나 두 개의 스레드가 있다고 가정합니다 (두 개의 칩이 있다고 가정). 이 이상한 경우 앱으로 프로필하는 것이 가장 좋습니다.

1

HT는 여분의 가상 코어를 사용하는 대부분이cpu 작업에 대해 약 10-30 %의 부스트를 허용합니다. 이러한 작업은 사용자 지정 어셈블리가 아닌 한 CPU 바운드로 보일 수 있지만 일반적으로 RAM과 로컬 캐시 간의 IO 대기로 어려움을 겪습니다. 이렇게하면 물리적 HT 가능 코어에서 실행중인 하나의 스레드가 작동하고 다른 스레드는 IO를 기다리고 있습니다. 그러나 두 스레드가 같은 캐시/버스를 공유하므로 자원이 적어 IO를 기다리는 동안 두 스레드가 일시 중지 될 수있는 단점이 있습니다.

마지막 경우 단일 스레드를 실행하면 일부 응용 프로그램에서 매우 심각한 캐시 쓰 래싱없이 단일 스레드를 실행하기위한 최대 동시 이론 처리 능력이 10-30 %까지 감소합니다.

사용할 코어를 선택하는 것은 실행할 스레드 수를 선택하는 것만 큼 중요합니다. 각 스레드가 대략 동일한 기간 동안 CPU- 바운드이면 대부분 다른 리소스를 사용하는 스레드가 서로 다른 물리적 코어에서 자신을 발견하고 공통 리소스를 사용하는 스레드가 동일한 물리적 코어 (다른 가상 코어)로 그룹화되도록 선호도를 설정하는 것이 가장 좋습니다 여분의 IO 대기없이 동일한 캐시에서 공통 자원을 사용할 수 있습니다.

각 프로그램마다 CPU 사용 특성이 다르므로 캐시 스 래싱이 주요 속도 저하 일 수도 있고 그렇지 않을 수도 있습니다. 일반적으로 프로파일 링하지 않고 이상적인 스레드 수를 결정하는 것은 불가능합니다. 마지막으로주의해야 할 점은 OS/커널 또한 일부 CPU 및 캐시 공간을 필요로한다는 것입니다. 캐시/CPU 리소스를 공유하지 않도록 CPU 바인딩 스레드에서 실시간 대기 시간이 필요한 경우 일반적으로 단일 (물리적) 코어를 OS 용으로 유지하는 것이 이상적입니다. 스레드가 종종 IO를 기다리고 캐시 스 래싱이 문제가되지 않거나 응용 프로그램 용으로 특별히 고안된 실시간 OS를 실행하는 경우이 마지막 단계를 건너 뛸 수 있습니다.

http://en.wikipedia.org/wiki/Thrashing_(computer_science) http://en.wikipedia.org/wiki/Processor_affinity