코어 당 최적 스레드 수


281

4 코어 CPU가 있고 최소 시간 내에 일부 프로세스를 실행하려고한다고 가정하겠습니다. 프로세스는 이상적으로 병렬화 가능하므로 무한한 수의 스레드에서 청크를 실행할 수 있으며 각 스레드는 동일한 시간이 걸립니다.

코어가 4 개이므로 단일 코어는 주어진 순간에 단일 스레드 만 실행할 수 있기 때문에 코어보다 더 많은 스레드를 실행해도 속도가 향상되지 않을 것으로 예상됩니다. 나는 하드웨어에 대해 잘 모르므로 이것은 단지 추측 일뿐입니다.

코어보다 더 많은 스레드에서 병렬화 가능 프로세스를 실행하면 이점이 있습니까? 즉, 4 개의 스레드가 아닌 4000 개의 스레드를 사용하여 프로세스를 실행하면 프로세스가 더 빠르거나 느리거나 거의 같은 시간 내에 완료됩니까?

답변:


254

스레드가 I / O, 동기화 등을 수행하지 않고 다른 실행중인 것이 없으면 코어 당 1 개의 스레드가 최상의 성능을 제공합니다. 그러나 그렇지 않을 가능성이 높습니다. 더 많은 스레드를 추가하면 도움이되지만 어느 정도 후에 성능이 저하 될 수 있습니다.

얼마 전, 꽤 괜찮은 부하로 Mono에서 ASP.NET 응용 프로그램을 실행하는 2 쿼드 코어 컴퓨터에서 성능 테스트를 수행했습니다. 우리는 최소 및 최대 스레드 수로 작업했으며 결국 특정 구성의 특정 응용 프로그램에 대한 최상의 처리량은 36 ~ 40 스레드 사이라는 것을 알았습니다. 그 경계 밖의 모든 것은 더 나빠졌습니다. 수업을 배웠습니까? 내가 당신이라면, 당신이 당신의 어플리케이션에 맞는 숫자를 찾을 때까지 다른 수의 스레드로 테스트 할 것입니다.

한 가지 확실한 점 : 4k 스레드가 더 오래 걸립니다. 그것은 많은 상황 전환입니다.


21
나는 곤잘로의 대답이 좋다고 생각합니다. 실험하고 측정해야한다고 덧붙였습니다. 귀하의 프로그램은 본인이나 다른 사람 또는 다른 사람과 다르며 귀하의 프로그램 행동에 대한 측정만으로 귀하의 질문에 올바르게 답변 할 것입니다. 병렬 (또는 동시) 프로그램의 성과는 첫 번째 원칙만으로도 좋은 결론을 도출 할 수있는 영역이 아닙니다.
High Performance Mark

5
+1, + answer : 코어보다 더 많은 스레드가 있으면 성능이 향상된다는 사실이 놀랍지 만 더 많은 스레드가 경쟁 스레드에 비해 시간 점유율이 더 큰 경우에는 의미가 있습니다. 내 응용 프로그램이 성능의 차이를 감지하고 자동으로 최적의 스레드 수로 조정하는 것이 좋을 것입니다.
Juliet

12
실제 시나리오에서 당신을 놀라게해서는 안됩니다. 스레드는 디스크 액세스, 네트워크 등과 같은 IO 리소스를 기다리는 것을 차단합니다. 또한 다른 스레드와 같은 비 IO 리소스가 공유 변수를 사용하여 완료되기를 기다리는 것도 차단합니다. 실제로 달성하려는 것은 코어 당 최소 하나의 스레드가 항상 실행될 수있는 최소 스레드 수입니다.
patros

4
코어 당 1 개의 스레드가 최적이 아닙니다. 스레드가 일시적으로 차단되면 다른 스레드가 실행될 수 있으므로 약간 더, 바람직하게는 두 배가 필요합니다. 메모리에만있는 경우에도 마찬가지입니다. SMT / HT 기능이있는 시스템 (P4, I7, Sun Rock 등)을 사용하는 경우 더욱 중요합니다.
Marco van de Voort

1
따라서 내 대답에 "그건 그렇지 않을 것입니다." 올바른 숫자를 찾는 것은 응용 프로그램과 응용 프로그램에서 실행되는 아키텍처에 따라 다릅니다.
Gonzalo

129

@ Gonzalo의 답변에 동의합니다. I / O를 수행하지 않는 프로세스가 있으며 여기에 내가 찾은 것이 있습니다.

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

모든 스레드는 하나의 배열에서 작동하지만 다른 범위 (두 스레드는 동일한 인덱스에 액세스하지 않음)에서 작동하므로 다른 배열에서 작업 한 경우 결과가 다를 수 있습니다.

1.86 시스템은 SSD가 장착 된 Macbook Air입니다. 다른 Mac은 일반 HDD가 장착 된 iMac입니다 (7200rpm이라고 생각합니다). 윈도우 머신에는 7200 rpm HDD도 있습니다.

이 테스트에서 최적의 수는 머신의 코어 수와 동일했습니다.


14
그래프의 경우 +1 분명히 코어 당 1 개의 스레드가 가장 좋지만 쿼드 코어 시스템이 다른 스레드보다 스레드 수가 더 높지 않은 것으로 보입니다 (<100).
Jim Garrison

46
그래프의 경우 -1! 정수 값 x 좌표를 통한 부드러운 곡선? 1 2 3에서 10 20 30에서 50 100까지의 야생 점프? 그리고 좋은 측정을 위해 10 더하기 2의 배수 인 y 좌표. 이것은 Excel에서하고 있습니까?
Spacedman

5
@Spacedman 그렇습니다. 부드러운 곡선은 IMHO보다 훨씬 멋지게 보입니다. : D
Motasim

22
@PascalvKooten, 문제는 예쁘게 보이는 것이 아니라 언뜻보기에 속이는 것입니다. 우선 모든 y 축은 42에서 시작하여 테스트 된 기계 간의 명백한 차이를 과장합니다. 두 번째로, x 축 값의 이상한 진행은 '취한 시간'이 '스레드 수'와 선형으로 확장되지 않는다는 것을 나타냅니다. 이는 특히 파란색 선에 해당됩니다. 다른 사람들 (자신을 포함하여)이 가지고있는 문제는 데이터를 잘못 표현한다는 것입니다.
pauluss86

13
@Spacedman 지난 24 시간 동안 제가 만난 가장 우스운 일이 그래프에 대한 비판입니다. 그래프가 도움이됩니다. 많이. 기간. 더 나을 수 있었습니까? 아무도 신경 쓰지 않는다. 이산 대신 부드러운 곡선? 그게 문제 야 ???? 나는 당신이 그래프를보기에 여분의 시간 / 에너지가 없기 때문에 그러한 그래프를 답에 포함시키지 않을 것이라고 가정합니다. 그게 내 요점이야
tyrex

50

나는이 질문이 다소 오래되었다는 것을 알고 있지만, 2009 년 이후로 상황이 발전했습니다.

이제 고려해야 할 두 가지가 있습니다 : 코어 수와 각 코어 내에서 실행할 수있는 스레드 수.

Intel 프로세서의 경우 스레드 수는 하이퍼 스레딩으로 정의되며 2 (사용 가능한 경우)입니다. 그러나 하이퍼 스레딩은 2 개의 스레드를 사용하지 않더라도 실행 시간을 2로 줄입니다. (즉, 두 프로세스간에 공유되는 1 개의 파이프 라인-프로세스가 많을수록 좋습니다. 그렇지 않은 경우에는 더 좋습니다. 코어가 많을수록 더 좋습니다!)

다른 프로세서에는 2, 4 또는 8 개의 스레드가있을 수 있습니다. 따라서 각각 8 개의 스레드를 지원하는 8 개의 코어가있는 경우 컨텍스트 전환없이 64 개의 프로세스를 병렬로 실행할 수 있습니다.

표준 운영 체제를 사용하여 제어 할 수없는 다른 모든 종류의 상황에 대한 컨텍스트 전환을 수행하는 경우 "컨텍스트 전환 없음"은 사실이 아닙니다. 그러나 이것이 주요 아이디어입니다. 일부 OS에서는 프로세서를 할당 할 수 있으므로 응용 프로그램 만 해당 프로세서에 액세스 / 사용할 수 있습니다!

내 경험상 I / O가 많으면 여러 스레드가 좋습니다. 메모리를 많이 사용하는 작업 (소스 1 읽기, 소스 2 읽기, 빠른 계산, 쓰기)이 많은 경우 더 많은 스레드가 도움이되지 않습니다. 다시 말하지만, 이는 동시에 읽고 쓰는 데이터의 양에 달려 있습니다 (즉, SSE 4.2를 사용하고 256 비트 값을 읽는 경우 해당 단계에서 모든 스레드를 중지시키는 것입니다. 즉, 1 스레드는 구현하기가 훨씬 쉬울 것입니다. 프로세스 및 메모리 아키텍처에 따라 달라지며, 일부 고급 서버는 별도의 코어에 대해 별도의 메모리 범위를 관리하므로 데이터가 올바르게 제출되었다고 가정하면 별도의 스레드가 더 빨라집니다. 아키텍처에서는 4 개의 프로세스가 4 개의 스레드로 1 개의 프로세스보다 빠르게 실행됩니다.)


4
아마도 다른 것들도 있지만, 내가 아는 것은 IBM의 POWER 프로세서입니다. 프로세서 당 4 개 또는 8 개의 스레드가있는 시스템이있었습니다. 그들이 ... 대신에 코어 당 2 개 스레드를 제공 할 수 있도록 이제 그들은 더 많은 코어에서 크랭크 수 있습니다
알렉시스 WILKE

이것은 오래되었지만 대부분의 Intel i5, i7에는 멀티 스레드 CPU가 있습니다. 예를 들어 i7 CPU에는 일반적으로 4 개의 코어가 있지만 8 개의 스레드가 있습니다.
Edgar. A

4
프로세서에는 스레드가 없습니다. 물리적 및 논리적 코어가 있습니다. 하이퍼 스레딩을 사용하면 단일 물리적 코어가 두 개의 논리적 코어로 작동합니다. 스레드를 가진 프로세서가 실용적이라고 주장하는 기술이 있었기 때문에 스레드의 스핀들이 튀어 나와있는 프로세서의 화이트 보드에 그림을 그렸습니다.

@TechnikEmpire이 intel.com/content/www/us/en/processors/core/…를 살펴보면 인텔에 연락하여 스레드를 그릴 수도 있습니다.
g7k

24

실제 성능은 각 스레드가 자발적으로 생성하는 양에 따라 다릅니다. 예를 들어, 스레드가 전혀 I / O를 수행하지 않고 시스템 서비스를 사용하지 않으면 (즉, 100 % CPU 바인딩) 코어 당 1 개의 스레드가 최적입니다. 스레드가 대기해야하는 작업을 수행하는 경우 최적의 스레드 수를 결정하기 위해 실험해야합니다. 4000 개의 스레드는 상당한 스케줄링 오버 헤드를 발생 시키므로 아마 최적이 아닙니다.


21

답은 프로그램에서 사용되는 알고리즘의 복잡성에 달려 있습니다. 임의의 수의 스레드 'n'과 'm'에 대해 처리 시간 Tn과 Tm을 두 번 측정하여 최적의 스레드 수를 계산하는 방법을 생각해 냈습니다. 선형 알고리즘의 경우 최적 스레드 수는 N = sqrt ((m n (Tm * (n-1) – Tn * (m-1))) / (n Tn-m입니다. Tm)입니다.

다양한 알고리즘에 대한 최적의 수 계산에 관한 내 기사를 읽으십시오 : pavelkazenin.wordpress.com


4
왜 다운 보트입니까? 죄송하지만이 질문에 대한 가장 좋은 답변입니다. 곤잘로는 질문의 대담한 부분을 다루고, pkazen은 제목을 다룹니다. 두 답변 모두 매우 유용하지만 pkazen 답변은 스레드 수를 대략적으로 체계화하는 방법이 있기 때문에 관련이 있습니다. 그는 심지어 리나 알고리즘에 대한 공식을 제공합니다.
tobiak777

1
나는 공감하지 않았지만 내가 그렇게했다면 최적의 스레드 수가 알고리즘의 복잡성과 관련이있는 이유 또는 방법에 대한 실제 설명이 없다는 것을 기반으로 할 것입니다. 링크 된 전체 기사를 읽으면 저장됩니다. 기사의 복잡성으로 인해 오랫동안 읽었습니다. 그 외에도 기사의 일부 측면은 명확하지 않으며, 가장 중요한 것은 실험 결과가 이론을 어떻게 확인하는지입니다.
Codebling

또한이 계산은 무한한 수의 CPU 코어가 있다고 가정합니다. 이것은 확실히 귀중한 정보이지만, 문제는 적은 수의 코어를 가진 실제 머신에 관한 것입니다.
Navneeth

9

여기에 다른 관점을 추가 할 것이라고 생각했습니다. 대답은 질문이 약한 스케일링인지 강한 스케일링인지를 가정합니다.

에서 위키 백과 :

약한 스케일링 : 솔루션 시간이 프로세서 당 고정 된 문제 크기에 대한 프로세서 수에 따라 어떻게 달라지는 지.

강력한 스케일링 : 해결 된 총 문제 크기에 대한 솔루션 수는 프로세서 수에 따라 다릅니다.

질문이 약한 스케일링을 가정하면 @Gonzalo의 대답으로 충분합니다. 그러나 질문에 강력한 확장이 있다고 가정하면 추가해야 할 것이 있습니다. 강력한 확장에서는 고정 워크로드 크기를 가정하므로 스레드 수를 늘리면 각 스레드에서 작동해야하는 데이터 크기가 줄어 듭니다. 최신 CPU에서는 메모리 액세스가 비싸므로 데이터를 캐시에 보관하여 로컬 성을 유지하는 것이 좋습니다. 따라서 각 스레드의 데이터 세트가 각 코어의 캐시에 맞는 경우 최적의 스레드 수를 찾을 수 있습니다. (시스템의 L1 / L2 / L3 캐시인지 여부에 대해서는 자세히 설명하지 않습니다).

스레드 수가 코어 수를 초과하는 경우에도 마찬가지입니다. 예를 들어, 4 개의 코어 머신에서 실행될 프로그램에 8 개의 임의의 작업 단위 (또는 AU)가 있다고 가정하십시오.

사례 1 : 각 스레드가 2AU를 완료 해야하는 4 개의 스레드로 실행하십시오. 각 스레드는 완료하는 데 10 초가 걸립니다 ( 많은 캐시 누락 ). 코어가 4 개인 경우 총 시간은 10 초 (10s * 4 스레드 / 4 코어)입니다.

사례 2 : 각 스레드가 1AU를 완료해야하는 8 개의 스레드로 실행합니다. 캐시 미스감소로 인해 각 스레드는 2 초만 소요됩니다 (5 초 대신). . 코어가 4 개인 경우 총 시간은 4 초 (2 * 8 스레드 / 4 코어)입니다.

문제를 단순화하고 다른 답변 (예 : 컨텍스트 스위치)에서 언급 된 오버 헤드를 무시했지만 데이터 크기에 따라 사용 가능한 코어 수보다 많은 수의 스레드를 갖는 것이 유리 할 수 ​​있기를 바랍니다. 다시 다루기.


7

한 번에 4000 스레드가 꽤 높습니다.

대답은 '예'입니다. 각 스레드에서 많은 블로킹 I / O를 수행하는 경우 논리 코어 당 최대 3 개 또는 4 개의 스레드로 상당한 속도 향상을 보일 수 있습니다.

그러나 많은 차단 작업을 수행하지 않으면 스레딩의 추가 오버 헤드로 인해 속도가 느려집니다. 프로파일 러를 사용하여 병목 현상이 평행 한 부분을 확인하십시오. 많은 계산을 수행하는 경우 CPU 당 1 개 이상의 스레드가 도움이되지 않습니다. 많은 메모리 전송을 수행하는 경우 도움이되지 않습니다. 디스크 액세스 또는 인터넷 액세스와 같은 많은 I / O를 수행하는 경우 여러 스레드가 어느 정도 도움이되거나 최소한 응용 프로그램의 응답 성을 향상시킵니다.


7

기준.

1부터 시작하여 응용 프로그램의 스레드 수를 늘리고 100과 같은 것으로 이동하여 각 스레드 수에 대해 3 ~ 5 회 시험을 실행하고 작업 속도와 스레드 수에 대한 그래프를 작성합니다. .

4 개의 스레드 케이스가 최적이어야하며 그 이후에는 런타임이 약간 증가하지만 그렇지 않을 수도 있습니다. 응용 프로그램의 대역폭이 제한적일 수 있습니다. 즉, 메모리에로드하는 데이터 세트가 크거나, 캐시 누락이 많이 발생하여 2 개의 스레드가 최적 일 수 있습니다.

테스트하기 전까지는 알 수 없습니다.


3

머신에서 프로세스 수를 리턴하는 htop 또는 ps 명령을 실행하여 머신에서 실행할 수있는 스레드 수를 찾을 수 있습니다.

'ps'명령에 대한 매뉴얼 페이지를 사용할 수 있습니다.

man ps

모든 사용자 프로세스 수를 계산하려면 다음 명령 중 하나를 사용할 수 있습니다.

  1. ps -aux| wc -l
  2. ps -eLf | wc -l

사용자 프로세스 수 계산 :

  1. ps --User root | wc -l

또한 "htop" [참고]를 사용할 수 있습니다 .

우분투 또는 데비안에 설치하기 :

sudo apt-get install htop

Redhat 또는 CentOS에 설치 :

yum install htop
dnf install htop      [On Fedora 22+ releases]

소스 코드에서 htop을 컴파일하려면 여기에서 찾을 수 있습니다 .


2

스레드가 차단되지 않는 한 코어 당 1 개의 스레드가 이상적입니다.

이것이 사실이 아닌 경우 : 코어에서 실행중인 다른 스레드가 있습니다.이 경우 더 많은 스레드가 프로그램에 더 큰 실행 시간을 줄 수 있습니다.


응용 프로그램이 실행되는 동안 사용자 백그라운드 프로세스가 쓰레기처럼 실행되도록할지 여부에 따라 다릅니다. 그 문제에 대해 각 스레드에 대해 실시간 우선 순위를 설정하고 최대 전력량을 얻을 수 있습니다. 그러나 사용자는 멀티 태스킹을 좋아합니다.
Earlz

2
글쎄, 우리는 마 법적으로 이상적인 병렬화 가능한 응용 프로그램을 다루고 있습니다. 내가 그런 것을 만든 적이 있다면 나는 원하는만큼 CPU를 쓸 자격이 있다고 느낄 것이다.
patros

2

많은 스레드 ( "스레드 풀") 대 코어 당 하나의 예는 Linux 또는 Windows에서 웹 서버를 구현하는 것입니다.

소켓은 Linux에서 폴링되기 때문에 많은 스레드가 적절한 시간에 올바른 소켓을 폴링 할 가능성을 증가시킬 수 있지만 전체 처리 비용은 매우 높습니다.

Windows에서는 서버가 I / O 완료 포트 (IOCP)를 사용하여 구현되어 응용 프로그램 이벤트를 구동합니다. I / O가 완료되면 OS가 대기 스레드를 시작하여 처리합니다. 처리가 완료되면 (일반적으로 요청-응답 쌍에서와 같이 다른 I / O 작업으로) 스레드는 IOCP 포트 (큐)로 돌아가 다음 완료를 기다립니다.

I / O가 완료되지 않은 경우 수행 할 처리가없고 스레드가 시작되지 않습니다.

실제로 Microsoft는 IOCP 구현에서 코어 당 하나 이상의 스레드를 권장합니다. 모든 I / O는 IOCP 메커니즘에 연결될 수 있습니다. 필요한 경우 응용 프로그램에서 IOC를 게시 할 수도 있습니다.


어떤 리눅스에 대해 이야기하고 있는지 알지 못하지만 연결이 될 때까지 내 블록. select () 및 FD_SET () 및 유사한 함수 / 매크로에 대한 몇 가지 사항을 읽으십시오.
Alexis Wilke

좋아, 그래서 즉시 반환하는 비동기 양식이 없습니까?
Olof Forshell

select () 매뉴얼 페이지에서 :timeout is an upper bound on the amount of time elapsed before select() returns. If both fields of the timeval structure are zero, then select() returns immediately. (This is useful for polling.) If timeout is NULL (no timeout), select() can block indefinitely.
Alexis Wilke

0

계산 및 메모리 바운드 관점 (과학 계산) 4000 스레드에서 말하면 응용 프로그램이 실제로 느리게 실행됩니다. 문제의 일부는 컨텍스트 전환의 오버 헤드가 매우 높고 메모리 위치가 매우 낮다는 것입니다.

그러나 또한 아키텍처에 따라 다릅니다. 나이아가라 프로세서는 일종의 고급 파이프 라이닝 기술을 사용하여 단일 코어에서 여러 스레드를 처리 할 수 ​​있다고 들었습니다. 그러나 나는 그 프로세서들에 대한 경험이 없다.


0

CPU 및 메모리 사용률을 확인하고 임계 값을 지정하십시오. 임계 값이 초과되면 새 스레드를 만들 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.