
私は CPUz と OCCT を使用したテストを実行してきました。CPUz を設定して複数のスレッドで CPU に負荷をかけると、70 度を超えることは決してないことに気づきました。一方、OCCT を実行して CPU に負荷をかけると、すぐに 75 度を超えて急上昇し、85 度でテストが停止することもあります。
何が起こっているのでしょうか? ビデオカードには個別に負荷をかける必要のあるコアが多数ありますが、CPU は単純であると常に理解していました。基本的な for ループは CPU に 100% の負荷をかけることができます。複数のスレッドで実行される多数の for ループは、すべてのコアに負荷をかけることができます。OCCT が CPU をこれほど熱くしているのはなぜでしょうか。CPUz ではできないことを OCCT が実行している理由は何でしょうか?
背景情報: CPU は Intel Core i7-4790k です。ターボブーストが有効になっていますが、どちらかのプロセスが動作しているときは 5% で止まっていると思います。
答え1
CPU 使用率は、CPU が使用できるリソースの量を測定するものですが、処理できる命令にはさまざまな種類があり、それぞれ処理およびメモリの要件が異なります。
メモリを大量に消費するタスクでは、メモリからデータを取得する際にCPUが停止し、実効的な命令CPU を「使用中」にしたままスループットを向上させます。
また、CPU にはさまざまな部分があり、それぞれが異なる方法で飽和する可能性があります。
ウィキチップスよりサンディブリッジuArch:
初期命令デコーダー フロントエンドがあることがわかります。複雑で多様な命令ストリームの場合、パイプラインの残りの部分をいっぱいに保つのに苦労する可能性があります。
もし、あんたがのみ整数加算を行う場合、CPU には 3 つの INT ALU ユニットがあるため、コア実行ユニットを 3 つ使用できます。浮動小数点乗算のみを行う場合は、1 つの FPU MUL (乗算) ユニットのみを使用できます。
CPUはパイプラインとしても動作し、実行ユニットの1つのユニットが使用されている間に、操作をスケジュールできる場合があります。次のサイクルではこれは、使用されていないユニットを同じ EU 内で異なる命令タイプでスケジュールできるため、多様な命令ストリームによってリソースをより有効に活用できることを意味します。命令が異なれば実行時間も異なり、実行する関連回路の数も大きくなり、小さくなります。単純な加算には 1 クロック サイクルか 2 クロック サイクルかかりますが、浮動小数点命令には時間がかかり、大量の回路が関係します。時間がかかるということは、回路の面積が大きいということと同様、消費電力が増えることを意味します。あるいは、命令に時間がかかるということは、フロントエンド スケジューリング回路が一時停止し、使用可能な実行ユニットを待機している間、一時的に消費電力が少なくなることを意味しますが、CPU の他の部分を含めると、より小さく高速な命令の方が全体的な回路使用量が増えることを意味します。
その結果、満杯CPU を使用するには多様な命令ストリームが必要であり、実行ユニットの配置や数、機能の違いにより、ある CPU で実行できるものが別の CPU では十分に実行できない可能性があります。
実行ユニットは、最新のパワー ゲーティング方式を使用して「低電力」にすることができ、その結果、デバイスの熱出力に寄与しなくなるか、寄与が大幅に減少します。
キャッシュも電力消費に影響します。キャッシュを使用すると、命令とデータをフェッチできるため、キャッシュには大きすぎるメモリ内のデータ セットを持つルーチンよりも高速に実行できます。
その結果、プログラムや命令ストリームが異なると、ピーク時の電力使用量が異なり、温度も異なる可能性があります。
プロセッサの世代間でのアーキテクチャの違い、また同じ世代でもキャッシュ サイズ、プロセッサ オプション、異なる命令の可用性が影響を及ぼす場合があります。
答え2
マルチスレッド クランチ テストを実行しても、モノスレッド テストほど CPU が熱くならない理由を知りたいとお考えのようですね。
簡単に説明すると、ターボ ブーストが原因です。CPU が複数のコアで均等に動作しているときはターボ ブーストが無効になります。ターボ ブーストが有効になるのは、1 つのコアが頻繁に使用されている場合 (1 つのコアのみ) のみです。
ターボ ブーストがアクティブな場合、ブーストされたコアにさらに多くの電力が供給され、他のコアへの電力が削減されるため、他のコアの速度が低下します。
ブーストされたコアはより高速で動作し、ブーストされていないコアよりも熱くなります。これはセンサーによって捕捉され、1 つのコアの温度が CPU 全体の温度として報告されます。
答え3
CPU の「負荷」(または使用率) は、CPU 時間のうち「有用な」アクティビティに費やされた割合と「アイドル」時間の割合を示すアクティビティ モニターです。オペレーティング システムは、何が「有用な」アクティビティで何が「アイドル」時間であるかを決定します。
CPU 負荷が 0 パーセントの場合、OS はその時間間隔中にユーザー プロセスをスケジュールしていません。CPU 負荷が 50 パーセント
の場合、OS は時間間隔の約半分をユーザー プロセスにスケジュールし、その時間間隔の残りの半分はアイドル ループで費やされています。ユーザー プロセスが 1 つしかない場合でも、そのプロセスは CPU を集中的に使用しないため、たとえば I/O 操作の完了を待機している間に再スケジュールする必要があるため、CPU 負荷の 100 パーセントを消費できない可能性があります。CPU
負荷が 100 パーセントの場合、OS は時間間隔全体をユーザー プロセスにスケジュールしています。
CPU は実際には常にビジー状態 (電源投入時) であり、常に命令を実行していることに注意してください。実行準備の整った (ユーザー) プロセスがない場合、OS スケジューラはアイドル ループを実行する必要があります。
CPU の温度は、CPU 回路で消費される電力の結果です。トランジスタのスイッチが増えると、より多くの電力が必要になり、消費されるため、CPU の温度が上昇します。
この電力消費は、CPU の「負荷」では示されません。CPU の「負荷」は、単に時間ベースのアクティビティ モニタです。
プロセスは、メモリ内でデータをコピーまたは移動するだけで (ロード命令やストア命令など)、CPU を (時間的に) 「ビジー」な状態にすることができます (アイドル状態を超える大きな電力負荷にはなりません)。
一方、別の計算集約型プロセスは、ALU (算術論理ユニット) や FPU (浮動小数点ユニット) など、CPU 内の他の多くの回路を使用する計算 (乗算命令や除算命令など) を実行する場合があります。
つまり、プロセスが実行する命令の組み合わせ (つまり、命令の種類) によって、消費される電力とその後の温度レベルが決まります。OS
はこの電力消費を測定することはできず、CPU 負荷センサーと温度センサーを使用して時間ベースのアクティビティ測定を報告するだけです。
答え4
例を挙げてみましょう。2つのループを見てみましょう。
for (i = 0; i < 1000000000; ++i) {
x += a [i];
}
そして
for (i = 0; i < 1000000000; ++i) {
x += a [i];
y += a [i];
z += a [i];
}
最初のループでは、プロセッサは、次の加算を開始する前に、前の加算が終了するまで待機する必要があります。加算のレイテンシが 3 サイクルの場合、プロセッサは 3 サイクルごとに 1 つの加算を実行します。CPU 負荷は 100% ですが、CPU は実際にはそれほど多くの作業を行っていません。
2 番目のループでも、3 サイクルごとに 1 回の反復がありますが、加算は独立しているため、プロセッサは 3 サイクルごとに 3 回の加算を実行し、3 倍の作業を行います。CPU 負荷は依然として 100% ですが、作業が 3 倍になると、発熱量も大幅に増加します。
したがって、各サイクルで利用可能なコンピューティング リソースをより多く使用するコードでは、より多くの熱が発生します。