web-dev-qa-db-ja.com

マシンが持っているコアの正確な数でスレッド化されたアルゴリズムを実行することが、他の何よりも速いのはなぜですか?

ここでいくつかの基本的なマルチスレッドテストを行ったところ、exactを使用した場合の速度の向上が予想よりも大きいことがわかりました。

コアの制限に達するまで速度が直線的に増加し、その後増加が止まるか、さらには遅くなると想定しました。

代わりに速度は直線的に増加し、次に[〜#〜]ジャンプ[〜#〜]上昇しますが、スレッドの次の量(1+マシンにはコアがあります)、それは以前から続いていました。

たとえば、グラフは長い線形関数のように見え、中央に巨大なスパイクがあり、コアと同じ数のスレッドがありました。

それで、なぜですか?

PS:誰かが明白なことを指摘する前に(CPUのコアの数を使用することは、CPUの最大値を使用することを意味する)、私はすでに明白なことを知っています。

編集:グラフはRで作成されます。これは、MSごとにシミュレータが実行できる「ターン」の数です。

debug test, 4690K

そこにあるアルゴリズムは、エージェントの配列を実行してから、浮動小数点演算を実行し、回転数との比較を実行し、さらに浮動小数点演算を実行する関数を呼び出します。グラフのテストでは、関数はインライン。

EDIT2:

同じプログラムですが、「リリース」ビルドが含まれています。

また、ここでの「スレッド」とはワーカースレッドを指し、OpenGLで可能な限り高速に更新されるUI + Bossスレッドもあることに注意してください。MacMiniではこれが重要になったようです。 」

これはMacMiniのパフォーマンスだけです。そのCPUはi5-2415M 2.3Ghz(2.9Ghzブースト付き)2コア+ HTです。

MacMini

グラフの下部にあるZephyrのパフォーマンス+ MacMiniは次のとおりです。そのCPUはIntelの標準的な動作を備えたi5-4690Kであり、4つのコアがありますが、HTはありません。

Zephyr

6
speeder

タスクにかかる時間は、各コアが作業を行うのにかかる最大時間です。 4スレッドの場合、各スレッドは作業の1/4を実行し、各コアは1スレッドなので、各コアは同じ量の作業を行います。 5スレッドの場合、各スレッドは1/5の作業を行いますが、1つのコアが2スレッドを処理する必要があり、2/5の時間で、1/4を超えます。より一般的には、スレッド数が4の倍数である場合、コアは同等の処理を行います。これは、グラフに反映されています。

CPUにバインドされたタスクのコンテキスト切り替えは、スレッドの数がhuge(おそらく数千)に達するまでパフォーマンスにほとんど影響しないことに注意してください。それは確かにそのような少数のスレッドの問題ではありません。

1