在执行我的多线程程序期间,只使用了4个可用的8个CPU。为什么? 我可以改变什么来使所有CPU工作?
Parallel.ForEach(0, CalcList.Count-1)
.NumTasks(nMax)
.NoWait
.Execute(
procedure(const value: integer)
begin
CalcUnit.EntrySearch(value);
end);
(nMax和CalcList.Count都是16,Intel I7 HyperThreaded)
谢谢
答案 0 :(得分:1)
我刚刚使用OTL对i7 2600(4核8 HT)进行了测试。一个简单的Parallel.ForEach
循环使用所有8.使用和不使用.NumTasks。该库没有问题。
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;
我的猜测是问题在于你的代码。线程中的磁盘访问是首先抵消使用线程的好处的好方法。
我对您的代码了解不多,但您应该考虑在单个线程中读取数据,然后对该数据的实际处理进行处理。
我看到你也指定了.NoWait。您是否正在保存Parallel.ForEach
的返回值?保存此值是个好主意,否则您的代码将在OnClick退出时阻止。请参阅gabr对此问题的回答。