1

During executing my multithreading program only 4 of the available 8 CPU's are being used. Why? What can I change to make all CPU's working?

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

(nMax and the CalcList.Count are both 16, Intel I7 HyperThreaded)

Thank you

4

1 に答える 1

1

OTL を使用して i7 2600 (4 コア 8 HT) でテストを行いました。単純なParallel.ForEachループは 8 つすべてを利用します。ライブラリには問題ありません。

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 の回答を参照してください。

OmniThreadLibrary の ForEach がメイン スレッドをブロックしているのはなぜですか?

于 2014-11-06T22:51:27.297 に答える