8

マルチスレッドを使用して 30 の独立したタスクを同時に実行するアプリケーションがあります。各タスクは http 経由でデータを取得し、計算を実行して結果を UI スレッドに返します。

TPL を使用して同じタスクを実行できますか?

TPL は 30 個の新しいスレッドを作成し、利用可能なすべてのコアに分散しますか? それとも、利用可能なコアにタスクを分割し、コアごとに 1 つのスレッドを使用するだけですか?

この場合、マルチスレッドよりも TPL を使用するとパフォーマンスが向上しますか?

4

4 に答える 4

10

原則として、TPL がコアよりも多くの (または少ない) スレッドを使用するのを止めるものは何もありません。

TPL を使用して状況をある程度制御するには、私の最初のアプローチは次のとおりです。スレッドプールの最大スレッド数の設定が少なくとも 30 であることを確認してから、最大同時実行レベル30 でタスクを並列化します。 CPU バウンド計算を開始して、同時実行をコア数に制限します。IIS または SQL サーバーで実行していない場合は、スレッド プールのヒューリスティックがスレッド数で遊びすぎるのを防ぐために、スレッドプール スレッドの最小/最大数を 30 に設定することができます。(もちろん、TPL とスレッド プールがアプリケーションでこの時間中に他の目的で使用されないことが前提です。)

最適なスレッド数は状況によって異なります。たとえば、シナリオを考えてみましょう。タスクは、データを取得するときに CPU バウンドではなく、ネットワーク バウンドです。タスクを開始するときは、並列処理を増やして、ダウンロードが同時に実行されるようにすることをお勧めします。ただし、計算は CPU バウンドになる場合があります。その場合、コアごとに 1 つのスレッドのみが実行されるようにスレッドの数を減らすと、パフォーマンスが向上する可能性があります。

TPL は、新しいCLR Thread Poolに基づいています。
スレッド プールは、ヒューリスティックを使用してスレッドの数を決定します。新しいスレッド プールに関するChannel9 のビデオ
があり、いくつかの洞察が示されています。 古いスレッドプールのヒューリスティックと新しいスレッドプールに関するいくつかのビットは、ここで見つけることができます(最後の段落「What the Future Holds?」)

アルゴリズムと数値は、CLR のさまざまなバージョンで変更される可能性があります。
今後もそうなるかもしれません。

同時実行レベルに関する投稿はたくさんありますが、私が見つけたのはhereです。

于 2010-03-26T08:38:12.613 に答える
9

TPLは、特に使用するように指示しない限り、通常、コアごとに1つのスレッドを使用すると思います。それが十分でない場合を検出する可能性があります。たとえば、タスクがほとんどの時間をデータの待機に費やす場合などです。

非同期Webフェッチを使用できない理由はありますか?ここでは、タスクごとにスレッドを作成する必要はなく、コアごとにスレッドを作成する必要もないと思います。TPLを使用すると、継続など、非同期プログラミングのさまざまな側面が簡単になります。

効率の観点から、アプリケーションは実際にCPUバウンドですか?ネットワーク側で最大の適切なレベルの並列処理を取得する必要があるようです。計算が非常に重い場合を除いて、これは少し集中する必要があります。


更新-元の作者からではありません

上記の答えはいつものように素晴らしいですが、.NET 4.0 CLRにいくつかの重要な変更がないため、誤解を招く可能性があります。

Andrasが言うように、現在のTPL実装はスレッドプールを使用するため、必要な数のスレッドを使用します(コアの数は現在は関係ありません)。

タスク並列ライブラリ(TPL)は、最新のハードウェアで非常にきめ細かい並列ワークロードをより簡単かつ効率的に実行できるように特別に設計された新しいクラスのコレクションです。TPLは、しばらくの間CTPとして個別に利用可能であり、Visual Studio 2010 CTPに含まれていましたが、これらのリリースでは、専用の作業スケジューラーに基づいて構築されていました。CLR4.0のBeta1の場合、TPLのデフォルトの スケジューラーはCLRスレッドプールになります。これにより、TPLスタイルのワークロードが既存のQUWIベースのコードと「うまく機能」し、基盤となるテクノロジーの多くをスレッドプール-特に、スレッドインジェクションアルゴリズム。これについては、今後の投稿で説明します。

から:

http://blogs.msdn.com/b/ericeil/archive/2009/04/23/clr-4-0-threadpool-improvements-part-1.aspx

于 2010-03-26T08:21:03.447 に答える
2

マルチスレッドを使用して 30 の独立したタスクを同時に実行するアプリケーションがあります。各タスクは http 経由でデータを取得し、計算を実行して結果を UI スレッドに返します。

これは、IO バウンドの並行プログラムです。

TPL を使用して同じタスクを実行できますか?

できますが、TPL は CPU バウンドの並列プログラム用に設計されているため、悪用することになります。

TPL は 30 個の新しいスレッドを作成し、利用可能なすべてのコアに分散しますか? それとも、利用可能なコアにタスクを分割し、コアごとに 1 つのスレッドを使用するだけですか?

ない。TPL は基本的に、コアごとの待機なしのワークスティーリング タスク キューを使用して、実行時に CPU を集中的に使用する計算の負荷を動的に分散します。

この場合、マルチスレッドよりも TPL を使用するとパフォーマンスが向上しますか?

30 のスレッドの作成と、不要なスレッドが発生する余分な競合を節約できます。

問題の正しい解決策は、スレッドをブロックしない非同期プログラムを作成することです。これは、ダウンロードが完了した後にデータで呼び出される継続として、ダウンロードが完了した後の残りの計算を表現することによって行われます。

Microsoft の新しい F# プログラミング言語には、これを簡単にするために特別に設計された機能が含まれています。たとえば、F# では 5 行のコードだけで問題を解決できます。

let fetchCalcAndPost uris calc post =
  for uri in uris do
    async { use client = new System.Net.WebClient()
            let! data = client.AsyncDownloadString uri
            do calc data |> post }
    |> Async.Start

このソリューションはスレッドをブロックしないため、完全に同時実行されます。

于 2010-05-16T16:07:26.710 に答える
0

30 のスレッドを生成しますか? スレッドプールを利用していますか? tpl はより最適化されると思います。スレッドの生成は、かなりコストのかかる操作です。tpl は通常、コアごとに 1 つのスレッドを使用するという Jon の意見に同意します。ここで話している.NETバージョンは何ですか

于 2010-03-26T08:27:25.193 に答える