web-dev-qa-db-ja.com

4コアの8つの論理スレッドは、最大で4倍高速に並列実行されますか?

Intel 2670QMで4倍高速に実行されるベンチマークソフトウェアであり、8つの「論理」スレッドすべてを使用するシリアルバージョンです。ベンチマーク結果の認識に関するコミュニティのフィードバックをお願いします s。

4コアで4スレッドを使用している場合、4倍の速度が得られ、アルゴリズム全体が並行して実行されます。 「Amdhalsの法則」がそれを予測しているので、これは私には論理的に思えます。 Windowsタスクマネージャーは、CPUの50%を使用していると言っています。

ただし、8つのスレッドすべてで同じソフトウェアを実行すると、再び4倍の速度が得られ、not 8倍の速度が得られます。

これを正しく理解している場合:私のCPUには個別に2.2GHZの周波数を持つ4つのコアがありますが、8つの「論理」スレッドに適用すると周波数は1.1GHZに分割され、キャッシュメモリなどの残りのコンポーネントについても同じことが続きます?これが当てはまる場合、タスクマネージャーがCPUの50%しか使用されていないと主張するのはなぜですか?

#define NumberOfFiles 8
...
char startLetter ='a';
#pragma omp parallel for shared(startLetter)
for(int f=0; f<NumberOfFiles; f++){
    ...
}

ディスクI/Oの使用時間は含まれていません。ディスクI/Oではなく、STL呼び出しにかかる時間(STLソート)にのみ関心があります。

12
Cisum Inas

i7-2670QM プロセッサには4つのコアがあります。ただし、8つのスレッドを並行して実行できます。これは、4つのプロセッシングユニット(コア)しかないが、ハードウェアで8​​つのスレッドを並行して実行することをサポートしていることを意味します。これは、たとえばメモリアクセスが原因でジョブの1つが停止した場合、別のスレッドがほとんどペナルティなしで空きコアで実行を非常に高速に開始できる場合、最大4つのジョブがコアで実行されることを意味します。 ハイパースレッディングの詳細を読む 。現実には、ハイパースレッディングによってパフォーマンスが大幅に向上するシナリオはほとんどありません。最新のプロセッサは、古いプロセッサよりもハイパースレッディングを適切に処理します。

あなたのベンチマークは、それがCPUにバインドされていることを示しました。つまり、ハイパースレッディングに利点を与えるパイプラインストールはほとんどありませんでした。 50%のCPUは正しく、4つのコアが機能していて、4つの追加のコアは何もしていません。 BIOSでハイパースレッディングをオフにすると、CPUが100%表示されます。

12
Nys

ここで理解しておくべき重要な情報は、物理スレッドと論理スレッドの違いです。
CPUに4つの物理コアがある場合、4つの異なる実行スレッドを並行して実行するための物理リソースがあることを意味します。したがって、スレッドにデータ競合がない場合は、通常、単一スレッドの速度と比較して、4倍のパフォーマンスの向上を測定できます。
OS(またはあなた:))がスレッドアフィニティを正しく設定していることも前提としているため、各スレッドは各物理コアで実行されます。
CPUでHT(ハイパースレッディング)を有効にしても、コア周波数は変更されません。 :)
hwパイプラインのpart(コア内およびその周辺(アンコア、キャッシュなど))が複製されますが、その一部は論理スレッド間で共有されます。これが、8倍のパフォーマンス向上を測定しない理由です。私の経験では、すべての論理コアを有効にすると、実行しているコード、キャッシュ使用量に応じて、物理コアごとにx1.5〜x1.7のパフォーマンスが向上します(L1キャッシュは2つの論理コアと1つの物理コアの間で共有されることに注意してください) 、たとえば)、スレッドアフィニティなど。お役に立てれば。

8
sergico

これは、ハイパースレッディング/ HyperTransportの概要です。

スレッドの切り替えは遅く、実行を停止し、一連の値をメモリにコピーし、一連の値をメモリからCPUにコピーしてから、新しいスレッドで処理を再開する必要があります。

これが4つの仮想コアの出番です。4つのコアがあります。つまり、ハイパースレッディングによってCPUが実行できるのは、1つのコアに2つのスレッドがあることです。

一度に実行できるスレッドは1つだけですが、メモリアクセス、ディスクアクセス、またはその他の時間がかかるために1つのスレッドを停止する必要がある場合は、他のスレッドに切り替えて少しの間実行できます。古いプロセッサでは、基本的にこの時間は少し眠っていました。

つまり、クアッドコアには4つのコアがあり、それぞれが一度に1つのことを実行できますが、コンピューターの別の部分で待機する必要があるとすぐに、2番目のジョブをスタンバイにすることができます。

タスクのメモリ使用量とCPU使用率が多い場合は、合計実行時間がわずかに減少するはずですが、ほぼ完全にCPUにバインドされている場合は、4つのスレッドだけを使用する方がよいでしょう。

8
Andrew Brock

HTは、ほとんどのBIOSでSMT(同時マルチスレッディング)またはHTT(ハイパースレッディングテクノロジー)と呼ばれています。 HTの効率は、コードが低速のメインメモリまたはI/Oメモリからフェッチまたは格納する前に実行するコア内(またはレジスタ/キャッシュ)操作の数である、いわゆるコンピューティングとフェッチの比率に依存します。キャッシュ効率が高くCPUにバインドされたコードの場合、HTではパフォーマンスがほとんど向上しません。より多くのメモリバウンドコードの場合、HTは、いわゆる「レイテンシの隠蔽」により、実行に実際に役立ちます。そのため、ほとんどの非x86サーバーCPUは、コアごとに4(IBM POWER7など)から8(UltraSPARC T4など)のハードウェアスレッドを提供します。これらのCPUは通常、多数の同時メモリバウンド要求が一度に処理されるデータベースおよびトランザクション処理システムで使用されます。

ちなみに、アムダールの法則によれば、並列高速化の上限は、コードのシリアル部分の1つです。通常、スレッド間に(ランタイムに隠されている可能性がある)通信またはその他の同期がある場合、シリアルの割合は処理要素の数とともに増加しますが、キャッシュ効果によって超線形の高速化が発生する場合や、キャッシュのトラッシングによってパフォーマンスが大幅に低下する場合があります。

1
Hristo Iliev

いくつかの実際の数:

私のi7でのCPUを集中的に使用するタスク(1から1000000000までの数値をint varに16回追加)、8回のテストで平均:

要約、スレッド/ティック:

1/26414
4/8923
8/6659
12/6592
16/6719
64/6811
128/6778

以下のレポートの「usingXthreads」行では、Xはタスクを実行できるスレッドの数より1つ多いことに注意してください-1つのスレッドがタスクを送信し、カウントダウンラッチevnetの完了を待機します-何も処理しませんCPUを多用し、CPUを使用しませんでした。

8 tests,
16 tasks,
counting to 1000000000,
using 2 threads:
Ticks: 26286
Ticks: 26380
Ticks: 26317
Ticks: 26474
Ticks: 26442
Ticks: 26426
Ticks: 26474
Ticks: 26520
Average: 26414 ms

8 tests,
16 tasks,
counting to 1000000000,
using 5 threads:
Ticks: 8799
Ticks: 9157
Ticks: 8829
Ticks: 9002
Ticks: 9173
Ticks: 8720
Ticks: 8830
Ticks: 8876
Average: 8923 ms

8 tests,
16 tasks,
counting to 1000000000,
using 9 threads:
Ticks: 6615
Ticks: 6583
Ticks: 6630
Ticks: 6599
Ticks: 6521
Ticks: 6895
Ticks: 6848
Ticks: 6583
Average: 6659 ms

8 tests,
16 tasks,
counting to 1000000000,
using 13 threads:
Ticks: 6661
Ticks: 6599
Ticks: 6552
Ticks: 6630
Ticks: 6583
Ticks: 6583
Ticks: 6568
Ticks: 6567
Average: 6592 ms

8 tests,
16 tasks,
counting to 1000000000,
using 17 threads:
Ticks: 6739
Ticks: 6864
Ticks: 6599
Ticks: 6693
Ticks: 6676
Ticks: 6864
Ticks: 6646
Ticks: 6677
Average: 6719 ms

8 tests,
16 tasks,
counting to 1000000000,
using 65 threads:
Ticks: 7223
Ticks: 6552
Ticks: 6879
Ticks: 6677
Ticks: 6833
Ticks: 6786
Ticks: 6739
Ticks: 6802
Average: 6811 ms

8 tests,
16 tasks,
counting to 1000000000,
using 129 threads:
Ticks: 6771
Ticks: 6677
Ticks: 6755
Ticks: 6692
Ticks: 6864
Ticks: 6817
Ticks: 6849
Ticks: 6801
Average: 6778 ms
1
Martin James