2014-11-06 2 views
1

멀티 쓰레딩 프로그램을 실행하는 동안 사용 가능한 8 개의 CPU 중 4 개만 사용됩니다. 왜? 모든 CPU가 작동하도록 변경하려면 어떻게해야합니까?Delphi OTL 멀티 쓰레드 프로그램이 사용 가능한 CPU의 절반 만 사용하는 이유

Parallel.ForEach(0, CalcList.Count-1) 
    .NumTasks(nMax) 
    .NoWait 
    .Execute(
    procedure(const value: integer) 
    begin 
     CalcUnit.EntrySearch(value); 
    end); 

이 OTL를 사용하여 I7 2600 (4 개 코어 8 HT)에 당신에게

+2

FWIW 하이퍼 스레딩이 경우 많은 모든 CPU 바인딩 작업에 도움이되지 않습니다. –

+0

가상 코어가 아닌 실제 코어 만 사용하도록 OTL을 제한 할 수있는 옵션이 OTL에 있습니까? – SilverWarior

+0

@ SilverWarior OP는 8 코어 (16 하이퍼 스레드)에 대해 이야기하고 있지만 코어 4 개만 사용 중입니다. CPU가 실제로 4 개 또는 8 개의 코어를 가지고 있는지 확인하는 것이 좋을지도 모르지만. – Graymatter

답변

1

난 그냥 한 테스트 감사 (Nmax가와 CalcList.Count 인텔 I7 하이퍼 쓰레드 모두 16입니다). 간단한 Parallel.ForEach 루프는 모두 8을 사용합니다. 가지고있는 .NumTask가 있거나없는 것. 라이브러리에는 문제가 없습니다.

begin 
    Parallel.ForEach(0, 100) 
    //.NumTasks(16) 
    .Execute(
    procedure(const value: integer) 
    var 
     newValue: Single; 
     I: Integer; 
    begin 
     newValue := value; 
     for I := 1 to 100000000 do 
     begin 
     newValue := newValue * I; 
     newValue := newValue/I; 
     end; 
    end); 
    ShowMessage('Done!'); 
end; 

제 생각에 문제는 귀하의 코드에 있습니다. 스레드의 디스크 액세스는 처음부터 스레드를 사용하는 이점을 상쇄하는 좋은 방법입니다.

코드에 대해 충분히 알지 못하지만 단일 스레드의 데이터를 읽은 다음 해당 데이터의 실제 처리를 스레딩하는 것이 좋습니다.

아니요. 지정된 번호가 있습니다. Parallel.ForEach의 반환 값을 저장 하시겠습니까? OnClick이 종료 될 때 코드가 차단되므로이 값을 저장하는 것이 좋습니다. 이 질문에 대한 가브의 대답을 참조하십시오.

Why is OmniThreadLibrary's ForEach blocking main thread?

+0

의견과 코드를 제공해 주셔서 감사합니다. 코드에서 .NumTasks (nMAx)를 제거하면 CPU 사용이 느려집니다. 예, 문제는 내 코드에 있습니다. 코드 예제는 내 8 개의 CPU가 모두 100 % 실행되도록합니다. 실제로 '오래된'단일 스레드 데이터 계산을 멀티 스레드하려고합니다. 이전 의견 덕분에 I/O 병목 현상에 대해 더 자세히 알아 내려고 노력했습니다. 다시 한 번 감사드립니다. –

관련 문제