[parallel-processing] 코어 당 최적 스레드 수

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

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

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



답변

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

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

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


답변

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

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

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

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

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


답변

나는이 질문이 다소 오래되었다는 것을 알고 있지만, 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 개의 프로세스보다 빠르게 실행됩니다.)


답변

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


답변

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

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


답변

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

에서 위키 백과 :

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

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

질문이 약한 스케일링을 가정하면 @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 코어)입니다.

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


답변

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

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

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