난 그냥 한 테스트 감사 (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?
FWIW 하이퍼 스레딩이 경우 많은 모든 CPU 바인딩 작업에 도움이되지 않습니다. –
가상 코어가 아닌 실제 코어 만 사용하도록 OTL을 제한 할 수있는 옵션이 OTL에 있습니까? – SilverWarior
@ SilverWarior OP는 8 코어 (16 하이퍼 스레드)에 대해 이야기하고 있지만 코어 4 개만 사용 중입니다. CPU가 실제로 4 개 또는 8 개의 코어를 가지고 있는지 확인하는 것이 좋을지도 모르지만. – Graymatter