6

クアッドコア i7 920 CPU を使用しています。ハイパースレッド化されているため、コンピューターは 8 つのコアがあると認識します。

インターウェブで読んだことによると、並列タスクを実行するときは、ハイパー スレッド コアの数ではなく、物理コアの数を使用する必要があります。

そのため、いくつかのタイミングを行ったところ、並列ループで 8 スレッドを使用する方が 4 スレッドを使用するよりも高速であることに驚きました。

どうしてこれなの?サンプル コードは長すぎてここに投稿できませんが、ここでサンプルを実行すると見つけることができます: https://github.com/jsphon/MTVectorizer

パフォーマンスのグラフは次のとおりです。

ここに画像の説明を入力

4

2 に答える 2

5

(Intel) ハイパースレッド コアは、(最大で) 2 つの CPU のように機能します。

単一の CPU には一連のリソースがあり、理想的には継続的にビジーですが、実際には、CPU が何らかの外部イベント (通常はメモリの読み取りまたは書き込み) を待機している間、驚くほどアイドル状態になることがよくあります。

別のハードウェア スレッドの追加の状態情報 (たとえば、レジ​​スタの別のコピー + 追加のもの) を追加することにより、「単一の」CPU は、最初のスレッドがブロックされたときに、その注意を他のスレッドの実行に切り替えることができます。(この N 個のハードウェア スレッドを一般化することができ、他のアーキテクチャはこれを行っています。Intel は 2 で終了しました)。

両方のハードウェア スレッドがさまざまなイベントの待機に時間を費やす場合、CPU はハードウェア スレッドに対応する処理を行うことができます。メモリ待機の 40 ナノ秒は長い時間です。したがって、プログラムが大量のメモリをフェッチする場合、両方のハードウェア スレッドが完全に効果的であるように見えると思います。たとえば、ほぼ 2 倍になるはずです。

2 つのハードウェア スレッドが非常にローカルな作業を行っている場合 (たとえば、レジ​​スタだけで集中的な計算を行う場合)、内部待機は最小限になり、単一の CPU は、両方のハードウェア スレッドが作業を生成するのと同じ速さでサービスを提供するのに十分な速度で切り替えることができません。この場合、パフォーマンスが低下します。どこで聞いたか覚えていませんが、ずっと前に聞いたことがあります。このような状況では、正味の効果は、理想化された 2 倍よりも 1.3 倍に近くなります。(SOの聴衆がこれについて私を訂正することを期待しています).

アプリケーションは、現在実行中の部分に応じて、必要に応じて切り替えることができます。次に、さまざまなパフォーマンスが得られます。いくらでもスピードアップできて満足です。

于 2014-11-23T14:04:41.777 に答える
1

Ira Baxter はあなたの質問をかなりよく説明してくれましたが、もう 1 つ追加したいと思います (担当者がまだ十分でないため、彼の回答についてコメントすることはできません): あるスレッドから別のスレッドに切り替えるにはオーバーヘッドがあります。コンテキスト切り替え ( http://wiki.osdev.org/Context_Switching#Hardware_Context_Switching )と呼ばれるこのプロセスでは、少なくとも CPU コアがそのレジスタを変更して、新しいスレッドにデータを反映する必要があります。プロセス レベルのコンテキスト切り替えを行っている場合、このコストは重要ですが、スレッド レベルの切り替えを行っている場合はかなり安くなります。これは次の 2 つのことを意味します。

1) ハイパー スレッディングでは、理論上の 2 倍のパフォーマンス向上は得られません。これは、コンテキストの切り替えのコストが些細なものではないためです。Ira によると、高度に論理的なスレッドがパフォーマンスを低下させるのも、これが理由です。頻繁なコンテキストの切り替えは、そのコストを倍増させます。

2) 8 つのシングルスレッド プロセスは、同じ作業を行う 4 つのダブルスレッド プロセスよりも低速で実行されます。したがって、マルチスレッド作業を計画している場合は、Python のスレッド ライブラリ、または素晴らしい greenlet ライブラリ ( https://greenlet.readthedocs.org/en/latest/ ) を利用する必要があります。

于 2014-11-23T16:20:47.363 に答える