14

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

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

ただし、8 つのスレッドすべてで同じソフトウェアを実行すると、8 倍ではなく4 倍の速度になります。

これを正しく理解していれば、私の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 ソート) にかかる時間のみに関心があります。

4

5 に答える 5

14

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

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

于 2012-05-01T20:00:20.693 に答える
12

これはハイパースレッディングの簡単な要約です

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

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

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

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

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

于 2012-05-01T19:45:08.923 に答える
10

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

于 2012-05-01T20:00:08.340 に答える
1

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

ところで、アムダルの法則では、並列速度向上の上限は、コードのシリアル部分に対する 1 であると述べられています。通常、スレッド間の通信またはその他の同期 (ランタイムに隠されている可能性があります) がある場合、シリアル部分は処理要素の数とともに増加します。

于 2012-05-04T11:41:59.923 に答える
0

実際の数値:

i7 での CPU 集中型タスク (1 ~ 1000000000 の数値を int var に 16 回追加)、8 回のテストで平均:

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

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

以下のレポートの「X スレッドの使用」行では、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
于 2012-05-01T21:40:55.403 に答える