![どの Win OS でも、ほとんどのマルチスレッド アプリの CPU 最大使用率は 1/N CPU に制限されています。なぜでしょうか?](https://rvso.com/image/1645743/%E3%81%A9%E3%81%AE%20Win%20OS%20%E3%81%A7%E3%82%82%E3%80%81%E3%81%BB%E3%81%A8%E3%82%93%E3%81%A9%E3%81%AE%E3%83%9E%E3%83%AB%E3%83%81%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%20%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%20CPU%20%E6%9C%80%E5%A4%A7%E4%BD%BF%E7%94%A8%E7%8E%87%E3%81%AF%201%2FN%20CPU%20%E3%81%AB%E5%88%B6%E9%99%90%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B%3F.png)
私はマルチスレッドとタスク処理をある程度理解していますが、OS 外では、ほとんどの Windows アプリは平均最大使用率で 1/N CPU のみを使用するように制限されていることを知っています。
これは、デュアル コアの場合は 50%、4 つの CPU の場合は 25%、8 つの CPU すべての場合は 12.5% です。Procexp.exe を使用して CPU の割り当てを解除したり、偶数または奇数の CPU を選択したりしても、結果は変わりません。
私の質問
この OS 制限を超えて使用率を上げる方法はありますか。1 つのアプリに 100% を課すのは理解できます。OS は、予想または必要なタイムアウト期間内に応答しないハードウェア I/O からブルー スクリーンを表示する可能性がありますが、50% または 75% でも結果は改善されます。
しかし、OS 内の explorer.exe などは、大きなタスクを実行するときに 50% 以上(?) のパフォーマンスを発揮することがあります。
- 通常、ブラウザを開いてタブを 10 個開いた状態では、CPU の使用率は 98 ~ 99.5% アイドル状態になります (Brave)
私はWin7 i7-4770S Haswell 3.1GHz、16GB RAMを使用しており、LibreOffice SCALC.exeで150万セルのCV19 USデータのスプレッドシートを開いて、テキストを毎日の日付のセル番号に変換しようとして、テキストプレフィックス「」を検索/置換しました(いくつかのオプションがあります)。テキストから値へ) そしてそれはまだ実行中です (はい)、そして私が間違った方法を使用したことは明らかです。
OS 使用率を変更できない場合は、400 個のテキスト エントリを日付 '1\20\2020 の値に変換して、自分の好みに合わせて再フォーマットするこの質問を書き直す必要がありますか。
- このテキスト ファイルは、JHU CV19 米国郡の毎日の死亡率の累積合計の GitHub リポジトリからダウンロードされ、テキストから列への変換を使用して SCALC にインポートされました。
「SCALC はまだ実行中です!」、11 スレッドを使用した PERFMON によると 12.5% です。
問題は、150万セルのスプレッドシートで1文字を検索して置換したときに発生しました。私は「類似オプション」を選択しましたが、これは間違いでした。問題はExcelやOpen Officeアプリではありません。多くのアプリはマルチスレッドですが、平均して1/N CPUに制限されており、これを変更する方法はありません。私はこれを画像で証明できますが、皆さんの中にはこれが真実だと知っている人もいるでしょう。
他の人は質問を理解していません。はい、Windows でこれを行うには、作成することは可能ですが、既成のアプリケーションでは不可能です。
例 1 大きなファイル プロセスの単純な起動回復には数秒しかかからず、ピーク時には 20% を超えました。平均して 1 秒間に 12.5% を超えるピークに達することもありますが、メモリ スループットの制限がある場合は持続しないと考えられます。(つまり、これを改善する方法はないということですか?)
ここでは、150 万個のセルに対して 0 を 0 に置き換える検索を実行しました。スクリーンショットをキャプチャする直前の平均はちょうど 12.5% でした。
ここでは、ほぼ正確に、全 CPU ワークロードの 1/N または 12.5% が、多数のスレッドを持つ 1 つのアプリケーションに割り当てられています。
このアーキテクチャでは、Windows 上の他の多くのアプリケーションでこのテストを再現できます。これはアーキテクチャ - メモリ キャッシュ バスの制限によるものでしょうか。修正方法はありますか?
このフォーラムで他の人が書いているように、1/N CPUの制限は12.50%です
これが証拠です。
マルチスレッド MS アプリのさらなる証明 i=1/N CPU % 平均最大のみ使用
アップデート
WordPerfect 2020 を QUattro Pro とともにインストールし、まったく同じマルチスレッド プロセスを実行すると、まったく同じ結果が得られました。8 つの CPU すべてでの最大 CPU 使用率 = 1/8 = 12.5%
例4
- マルチスレッド プロセスでは、再びすべての CPU が使用されましたが、合計では 1/N CPU または 12.5% のみでした。これは、Mark Russinovich の Process Explorer (別名 PROCMON.exe) です。これは、他のすべてのプロセスから独立しており、リソースをほとんど使用しませんでした。
ここでマークがマルチスレッドをプログラムする能力があったとは思えません。:) (MS フェロー)
答え1
すべてのタスクが、CPU のすべてのコアで同時に実行できるタスクに分割できるわけではありません。
CPU の各コアは、完全なプロセッサです。1 つのハードウェア「スレッド」の実行状態に関する情報を保持できます。各コアには、他のコアとは独立した独自のキャッシュとデータ処理機能があります。キャッシュとメモリ バスを共有する場合もありますが、それ以外は完全に独立しています。
そのスレッドは、ソフトウェアでスレッドとして知られているものにほぼ相当します。
発生している問題は、そのソフトウェア内で作業を実行している特定のタスクが本質的にシングル スレッドであることです。
1 つのスレッドは、一度に 1 つのコアでのみ実行できます。8 コア プロセッサの場合、1 つのスレッドはプロセッサの最大 1/8、つまりタスク マネージャーによると 12.5% しか使用できません。4 コア プロセッサの場合は 1/4、つまり 25% になります。
プログラムには多数のスレッドを設定できますが、それらのスレッドは互いにまったく関係のない処理のみを実行できます。1 つのスレッドはシーンのデータの更新を処理し、別のスレッドは GUI の更新などを行う場合があります。
スレッドが実行できないのは、相互に通信せずに同時にまったく同じデータを処理することです。これが、あなたが見ている制限です。
複数のCPUコアを使用するには、実行中のタスクを分割して複数のスレッドに分配する必要があります。この分割はプログラミングの問題であり、ソフトウェアエンジニアが実装する必要があります。特定のタスクがマルチスレッドであるかどうかは、そのタスクの複雑さと、そもそも分割できるかどうかによって決まります。
- タスクには、別々のスレッドで処理できるように独立したデータ セットに分割できるデータが含まれていますか?
- ソフトウェアは、特定のタスクを別々のスレッドに分割するように作成されていますか?
データが特定の方法で処理されることに完全に依存している場合、複数のコアを使用する方法はありません。
データを分割できるが、分割と再結合に多くの作業が必要になる場合、ソフトウェア エンジニアは労力に見合わないと判断し、代わりに 1 つのスレッド/コアを使用することになります。
データを分割することができ、ソフトウェアがそうするように設計されている場合それから1 つ以上のコアが使用されていることがわかります。
Excel は多くのタスクでマルチコア計算をサポートしていますが、これは相互にまったく依存関係のないデータに完全に依存しています。