왜 단일 스레드가 CPU에 퍼져 있습니까?


24

스케줄러가 CPU를 유지하지 않고 CPU간에 지속적으로 앱을 이동하는 이유가 궁금합니다. 100 %에서 1 개가 아닌 25 %에서 4 개의 코어를 갖는 것은 약간 어리석은 것처럼 보입니다.

그것은 열과 관련이 있습니까, 아니면 어떻게 든 더 효율적입니까? 다른 OS는 다르게 작동합니까?

심층적 인 내용에 대한 통찰력이나 링크가 좋을 것입니다. (내 자신을 많이 찾을 수 없습니다.)

최신 정보:

"확산"이라는 말은 한 번에 여러 CPU에서 실행되는 것이 아니라 초당 여러 번 다른 CPU로 이동하여 확산되는 것처럼 보이는 효과를 의미합니다.


3
"아무 것도 실행되지 않는"경우에도 항상 CPU와 경쟁하는 시스템 스레드가 있습니다. 예를 들어, O / S에는 재생 메모리 페이지를 제로화하는 스레드가 있으므로 메모리가 필요할 때 일부 페이지를 준비 할 수 있습니다. 스레드가 다시 실행되면이 스레드 중 하나에서 사용중인 CPU를 사용 중일 수 있습니다. OS는 어떻게해야합니까? 기다리거나 새 CPU로 이동 하시겠습니까? 그것이 무엇이든간에, 어떤 경우에는 바람직하지 않은 행동으로 끝납니다.
Tony Lee

곰 바입니다. LBP가 아닌 SMB :)
Macke

내 "답변"에서, 나는 당신이 묘사 한대로 정확하게 행동하는 단일 스레드 프로그램을 보여주었습니다.
Evan Rosica

답변:


8

나는 wierob그 요점을 상당히 잘 묘사 했다고 생각 합니다.
여기입니다 오래된 기사 논의 processor affinity쿼드 코어로 설정을 QX6800은 .
링크는 해당 기사의 두 번째 페이지를 가리 킵니다.

프로세스 선호도를 코어에 강요하지 않으면 성능이 저하 됩니까?

  • Windows 스케줄러 는 캐시와
    의 스 래싱을 피하기 위해 이러한 선호도를 결정해야 하지만 프로세서 설계 자체도 그러한 사항을 고려합니다.
  • 인텔 QX6800 쿼드 코어 (이 답변의 앞부분에서 언급 했으므로)
    에는 4 개의 코어에서 8MB L3캐시가 공유 됩니다.

시스템에서이 하나의 단일 스레드 프로세스 만 실행하도록 선택했을 수 있지만 OS 자체에는 몇 가지 다른 작업이 실행 중이며 예약해야합니다. 스케줄러는 사용 가능한 프로세서 풀 (또는 코어)에서이 모든 활동의 균형을 유지합니다.


앞으로 Nehalem 아키텍처와 NUMA를 사용 하면
여러 소켓의 프로세서 가 액세스 스 래시를 더 잘 해결할 수 있습니다.
다음은 NUMAArsTechnica 페이지에서 가져온 빠른 그림입니다 .

여기에 이미지 설명을 입력하십시오

네 할렘이 i7당신에게 관심이 있다면 , 이 답변에 더 많은 링크가 있습니다.


"네 할렘 아키텍처와 NUMA를 사용하면 여러 소켓에 걸친 프로세서도 액세스 스래쉬를 더 잘 처리 할 수있을 것"이라고 생각합니다. ? 내가 알다시피, NUMA는 메모리를 훨씬 더 로컬 및 특정 프로세서 관련으로 만들어 쓰레기 처리 효과를 악화시킵니다.
롤랜드 Pihlakas

@RolandPihlakas는이 답변 이후 오랜 시간이 지났지 만 arstechnica 기사와 이러한 요점을 살펴보면 새로운 플랫폼이 더 나은 메모리 연결을 가질 수있는 기능과 소프트웨어를 활용할 수있는 기능을 설명하고 있다고 생각합니다 ( 그 당시의 다중 소켓 구성, 즉 Nehalem 이전).
nik

6

스케줄러는 "무료"코어 / CPU에서 실행할 준비가 된 다음 스레드를 실행합니다.

Windows 작업 관리자를 통해 프로세스를 특정 CPU에 할당 할 수 있습니다.

25 %에 4 개의 코어가 있다는 것은 4 개의 스레드가 동시에 실행됨을 의미합니다. 반면 x %의 코어 하나는 스레드가 하나만 실행됨을 의미합니다. 따라서 어떤 경우에는 전자가 더 효율적입니다.

그러나 실행 중에 CPU 캐시는 스레드가 액세스하는 데이터로 채워집니다. 따라서 스레드가 다른 CPU에서 실행되면 더 많은 캐시 누락이 발생하며 데이터가이 CPU의 캐시에 없기 때문에 비용이 많이 듭니다.

스레드는 무엇을합니까? 스레드가 매우 짧은 시간 동안 "휴면"되면 이전에 실행 된 코어가 다른 위협에 의해 점유되어 스레드가 다음 사용 가능한 코어에서 실행됩니다. 프로세스에서 사용할 코어를 하나만 지정하면 어떻게됩니까 (예 : 작업 관리자)?


3
afaik Windows 스케줄러는 해당 문제를 피하기 위해 동일한 CPU / 코어에 스레드를 유지하는 꽤 좋은 작업을 수행합니다.
Paxxi

@ Pär : 내 스레드가 실제로 각 코어에서 실행되는 것 같습니다.
Macke

그래, 아마 내 스레드를 부딪히는 OS 프로세서 일 것입니다. 두 가지 답변을받는 방법? :)
Macke

내 경험에 따르면 @ PärBjörklund 적어도 Windows XP는 그렇지 않습니다. "캐시 수신 거부"문제는 Vista 이상에서 수정 된 것
같습니다

1
"4 개의 코어가 25 %에 있다는 것은 4 개의 스레드가 동시에 실행됨을 의미합니다." 아니요, 하나의 스레드가 실행되고 하나의 코어에서 비트가 실행 된 다음 다른 스레드가 실행됨을 의미합니다. 작업 관리자가 평균 사용량을 표시 할 때 각 코어에 대해 25 % (4 코어 시스템에서는 2 코어에서는 50 %로 표시)가 표시됩니다. 이는 코어가 1/4의 시간을 완전히 활용하고 시간이 지남에 따라 유휴 상태임을 의미합니다.
David Balažic

0

그렇지 않습니다. 하나의 스레드는 하나의 프로세서에서만 실행할 수 있습니다. 그러나 일부 프로세스 에는 여러 스레드가 있으며이 스레드는 확장 될 수 있습니다.

추론, 믿거 나 말거나, 그것이 어떻게 보이는지 고려하지 마십시오. 시스템은 언제 스파이크 할 것인지 알 수 없기 때문에 스레드를 분산 시키려고합니다.


1
추가 된 설명을 참조하십시오. 이것은 전체 스로틀에서 실행되는 하나의 스레드이며, 시간이 지남에 따라 각 코어 (앞에서)가 25 % 바쁘도록 빠르게 움직입니다. (다른 모든 프로세스 / 스레드가 무시할 만하다 있습니다)
Macke

0

OS는 CPU 코어에서 스레드를 빠르게 마이그레이션합니다 (초당 몇 번). 항상 동일한 코어에서 실행하는 것이 더 효율적입니다. 이 작업은 작업 관리자의 "호환 설정"상황에 맞는 메뉴 항목으로 시행 할 수 있습니다.

일반적으로 (일반적인 가정용) 차이는 몇 퍼센트 범위에 있습니다.

"25 % 사용량으로 각각 4 개의 코어"는 작업 관리자가 평균 사용량을 보여 주듯이 각 코어가 1/4의 시간을 완전히 활용하고 나머지 시간을 비운다는 것을 의미합니다.

설명은 Windows 용이지만 다른 운영 체제에서도 유사합니다.


-1

누군가가 여전히 이것을 읽고 있다면, 나는 이것도 알아 차렸고 그것이 단지 우연이 아닌지 확인하기 위해 몇 가지 테스트를 수행했습니다. 그렇지 않다는 것이 밝혀졌습니다! 여러 가지 이유로 단일 스레드를 모든 코어에 분산시키는 것이 더 효율적이라고 생각합니다.

  1. 모든 코어에 하나의 스레드를 펼치면 전력 소비가 줄어 듭니다. 대부분의 프로세서는 부하에 따라 주파수와 더 중요한 전압을 낮추므로, 예를 들어 Core 2 Quad는 하나의 코어를 사용하지 않고 4 개의 코어 전체에 하나의 스레드를 분산시켜 훨씬 적은 전력을 소비하고 적은 열을 생성합니다. 단 하나의 전압 레귤레이터 * 만 있기 때문에 모든 코어에서 전압이 증가하게됩니다.
  2. 스레드가 항상 최대 / 일정한 속도로 실행되도록합니다. 스레드가 갑자기 더 많은 처리 성능을 요구하면 하나의 코어가 오버로드되어 실행이 지연 될 수 있습니다. 코어 전체에 퍼지게함으로써 지연과 지연없이 갑작스런 스파이크가 매끄럽게 처리됩니다.

또한 위의 두 가지 관찰로 인해 Turbo Boost와 IDA가 효과적이지 않다고 믿었습니다. 이전 운영 체제에서는 유용 할 수 있지만 Linux 및 Windows 7은 모든 코어에 모든 것을 매우 효율적으로 분산시킵니다. 따라서 2.26 GHz에서 Core 2 Quad q9100은 거의 예외가 있습니다. 항상 예외가 있습니다 :-)는 항상 Core 2 Duo X9100 @ 3.06GHz보다 빠르며 IDA (기본적으로 Turbo boost의 전임자, 단일 스레드 앱의 경우 하나 또는 두 개의 코어에서 빈도가 증가합니다).

  • 코어 2 쿼드에는 두 개의 물리적 다이가 있기 때문에 두 개의 클럭 도메인이 있으므로 두 개의 코어가 전체 주파수에서 실행될 수 있고 두 개의 코어는 가장 낮은 주파수에 있습니다. 그래도 두 개의 전압 레귤레이터가 있는지 모르겠습니다. 전압이 4 코어 모두에서 균일하다는 것을 알았으므로 전체 패키지에 대해 하나의 레귤레이터 만 있어야합니다.

3
이것은 몇 가지 이유로 모호하게 들립니다. "사실"에 대한 참조를 제공하십시오. 첫째, 왜 4 개의 코어에서 25 %의 컴퓨팅 성능이 하나의 100 %보다 적은 전력을 소비합니까? (열이 더 고르게 퍼지는 것에 동의 할 수 있지만 ...) 또한 내 질문의 스레드가 최대 기울기 (100 %)로 실행 중이므로 이미 처리 중이므로 더 많은 처리 능력을 요구하지 않습니다. 가능한 한 많이.
Macke

글쎄, 그것은 내 자신의 관찰에 의한 것입니다-나는 IDA와 TurboBoost에 흥미가 있었고 몇 가지 테스트를하기로 결정했습니다. 꽤 오래 전 일 이었지만 위의 결론에 도달했습니다. 모든 코어가 더 낮은 전압에서 작동하므로 프로세서는 더 적은 전력을 소비합니다. 0.1V 감소로 약 6-10W의 전력 소비가 절약됩니다 (한 코어에 100 %로드 된 경우 유휴 상태에 관계없이 모든 코어는 더 높은 전압에서 실행 됨) 또는 아닙니다). SLFM 모드의 Core2Duo에서 특히 그렇습니다. 더 많은 프로세서 전술을 요구하지 않고 풀 틸트 상태에서 실행중인 스레드에 대해서는 맞지만 실제로 그렇게하는 앱이 있습니다.
JakL

"실 퍼짐"(5 년이 지나도)은 없습니다. 하나의 코어에서 실행되는 단일 스레드가 있습니다. 그리고 나중에 또 다른. 등등. 매 순간 하나의 코어가 100 %로 실행되고 다른 코어는 유휴 상태입니다. 따라서 저축은 없습니다. 특히 당신이 언급 한대로, 모든 코어가 항상 완전 전압 일 때 (당신이 말했듯이, 그들은 전압을 공유합니다) 언급합니다. 또한 동일한 코어에 이미 언급되어 있으므로 스레드가 모든 처리 능력을 얻습니다. 해당 코어가 이미 100 % 사용되었으므로 OS는 다른 스레드를 덜 활용되는 다른 코어로 예약합니다.
David Balažic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.