2012-03-01 4 views
3

제 질문은 Windows 환경의 다중 스레드 성능 문제를 다룹니다. 코드를 테스트 한 결과 스레드 수가 증가해도 병렬 계산의 성능이 향상되지 않고 일부 계산 후에는 결과가 줄어 들었습니다. 무슨 일 이니? 최적의 스레드 수의 수식을 찾을 수 있습니까? F (processors, memory ..) =?3 개의 스레드가 10+보다 빠른 이유

+1

http : // stackoverflow.com/questions/1718465/최적의 코어 당 스레드 수 – assylias

+0

어떤 CPU를 사용하고 있습니까? 얼마나 많은 코어가 있습니까? 스레드는 어떤 작업을하고 있습니까? – Tudor

+0

@Tudor Intel i5 750 – garik

답변

4

스레드가 수행하는 작업에 따라 다릅니다. 기본으로 CPU 바운드 인 경우 최적의 스레드 수는 프로세서 코어 당 1입니다. 커널에서 응답을 기다리는 중대한 IO를 수행하면 스레드 수가 증가하여 성능이 향상됩니다.

코어 당 둘 이상의 스레드가있을 때 컨텍스트 전환 오버 헤드가 있으므로 CPU 바인딩 계산을위한 스레드 수를 늘리면 항상 성능이 저하됩니다. 당신이 공식을 찾고 있다면

+0

@garik, 그러면 정말로 당신이하는 일에 더욱 더 의존적입니다. HyperThreaded 가상 코어는 캐시 및 실행 단위를 공유하므로 응용 프로그램이 CPU 및 메모리를 효율적으로 사용하면 더 많은 스레드를 사용하여 이익을 얻을 수 없습니다. 메모리가 조각화되어 많은 캐시 누락이있는 경우 코어 당 스레드 2 개를 사용하여 성능을 약간 향상시킬 수 있습니다. 경우에 따라 실제로 HT를 사용하지 않고 코어 당 스레드를 1 개만 실행하는 것이 더 빠릅니다. 확실하게 테스트해야합니다. – Gerald

+0

제쳐두고 세미 - 모던 그래픽 어댑터를 사용하면 병렬 처리를 위해 GPU를 활용하여 CUDA로 좋은 효과를 얻을 수 있습니다. 최신 그래픽 어댑터에는 초당 멀티 GB의 내부 메모리 처리량을 갖춘 수백 개의 코어가 있습니다. 그들은 제한된 명령어 세트를 가지고 있지만, 많은 부동 소수점 계산을 위해서는 매우 빠릅니다. – Gerald

1

.NET 4.0에서 Task Parallel Library을 살펴보십시오. 그리고 이전 버전의 프레임 워크를 실행하는 경우 thread pool을 사용하면 수동 스레드 생성 오버 헤드를 피할 수 있습니다.

2

Amdahl's law있다 : 병렬 컴퓨팅에 다수의 프로세서를 사용하여 프로그램의

속도 향상은 프로그램의 순차적 부분에 필요한 시간에 의해 제한됩니다. 예를 들어, 단일 프로세서 코어를 사용하여 20 시간이 필요하고 1 시간의 특정 부분을 병렬 처리 할 수없는 경우, 약 19 시간 (95 %)의 유망한 부분을 병렬 처리 할 수있는 경우, 얼마나 많은 프로세서를 사용하는지에 관계없이 이 프로그램의 병렬화 된 실행에 최소 실행 시간은 그 1 시간보다 클 수 없습니다.

1

정확한 일반 규칙을 지정하는 것은 어렵습니다. 보통 (I/O 또는 그와 같은 경우) 대기 중이라면 코어보다 스레드 수가 많습니다. 그러나 실제로 컴퓨팅 작업을 수행하는 경우 코어 수가 많습니다. 스레드가 많을수록 CPU 속도는 빠르지 만 스케줄링 작업이 늘어납니다.

6

우선, CPU가 동시에 실행할 수있는 스레드 수에 하드웨어 제한이 있으므로 (예 : 쿼드 코어 4 개, HyperThreading이있는 경우 2 배) 더 많은 성능을 얻을 수있는 방법은 없습니다 스레드가 코어보다 많습니다. 단위 시간당 수행되는 작업이 동일하게 유지되는 동안 스레드 스케줄링 및 동기화에 대한 오버 헤드가 증가하기 때문에 추가 스레드는 실제로 성능을 저하시킵니다.

Task Parallel Library은 런타임에서 자동으로 일부 매개 변수를 관리하도록하려는 경우 아주 좋은 출발점입니다. 나중에 그렇게 할 이유가있는 경우 명시 적으로 제어 할 수 있습니다.

2

10+ 스레드가 반드시 3보다 빠르지 않은 이유는 각 스레드와 관련된 오버 헤드가 있다는 것입니다. 이것은 스레드 자체를 관리합니다. 각 스레드가 적절한 처리 시간을 얻고 스레드간에 전달되는 데이터를 관리합니다.

따라서 스레드 수가 많을수록이 비 처리 오버 헤드가 커집니다.

쿼드 코어 프로세서를 사용하는 경우 3 개의 스레드가 각각 코어에서 100 % 시간을 실행할 수 있습니다 (사실이 아니지만 예제입니다). 그러나 9 개의 스레드가있는 경우 각 스레드는 코어에서 33 %의 시간 만 실행할 수 있습니다.이 스레드는 2 개의 다른 스레드와 공유해야합니다. 이를 관리하는 오버 헤드는 9 개의 스레드가 실제로 3보다 느리다는 것을 의미합니다.

관련 문제