對於任何 Win 作業系統上的大多數多執行緒應用程序,CPU 最大利用率限制為 1/N CPU:為什麼?

對於任何 Win 作業系統上的大多數多執行緒應用程序,CPU 最大利用率限制為 1/N CPU:為什麼?

我在一定程度上了解多執行緒和任務處理,但知道在作業系統之外,大多數 Windows 應用程式僅限於使用 1/N CPU 來實現平均最大值。利用率。

即雙核心 CPU 為 50%,4 個 CPU 為 25%,所有 8 個 CPU 為 12.5%。如果使用 Procexp.exe 取消指派 CPU 或選取偶數或奇數 CPU,這不會改變結果。

我的問題

有什麼方法可以提高利用率,使其超出此作業系統限制。我理解如果一個人對一款應用程式施加 100% 的費用。在預期或要求的超時時間內,作業系統可能會因硬體 I/O 無響應而藍屏,但即使是 50% 或 75% 也會改善我的結果。

然而,在執行大型任務時,作業系統中的 explorer.exe 等有時可以執行 50% 或更多(?)。

  • 通常,CPU 空閒率為 98~99.5%,僅開啟瀏覽器和 10 個標籤(Brave)

我在LibreOffice SCALC.exe 上使用Win7 i7-4770S Haswell 3.1GHz 和16GB RAM,電子表格包含150 萬個CV19 US 資料單元格,並進行了搜尋/替換' 文字前綴,嘗試將文字轉換為單元格號碼以供日常使用日期(有一些選項來自文字到值)並且它仍在運行(是的)並且顯然我使用了錯誤的方法。

如果無法更改作業系統使用率,那麼我是否應該重寫此問題,將 400 個文字條目轉換為日期「1\20\2020」的值,以根據我的喜好重新格式化。

  • 該文字檔案是從 JHU CV19 美國縣每日死亡率累積總數的 GitHub 儲存庫下載的,並使用文字到列轉換匯入到 SCALC 中。

SCALC 仍在運作! ,根據使用 11 個執行緒的 PERFMON,為 12.5%。

問題始於在 150 萬個儲存格電子表格中搜尋並取代 1 個字元。我選擇了“相似性選項”,這是一個錯誤,但問題不在於 Excel 或 Open Office Apps ,許多應用程式是多執行緒的,但平均限於 1/N 個 CPU,無法改變這一點。我可以用圖像證明這一點,但你們中的一些人會知道這是真的。

其他人不明白這個問題。是的,Windows 可以編寫或執行此操作,但不能是罐裝應用程式。

範例 1 大檔案進程的簡單啟動復原僅花費幾秒鐘,峰值超過 20%。它可以在一秒鐘內達到遠高於平均值 12.5% 的峰值,但我認為當存在記憶體吞吐量限制時,它不會持續。 (所以我想沒有什麼可以改善這一點?)

在此輸入影像描述

這裡的搜尋是在 150 萬個單元格上用 0 替換 0,在我捕獲螢幕截圖之前平均準確率為 12.5%。

在此輸入影像描述

這裡幾乎恰好有 1/N 或所有 CPU 工作負載的 12.5% 專門用於 1 個具有多個執行緒的應用程式。

我可以使用此架構在 Windows 下的許多其他應用程式上重複此測試。那麼它的架構 - 記憶體快取總線有限且有任何修復嗎?

正如其他人在本論壇上所寫的那樣,1/N CPU 的限製或 12.50 %

這就是證明。

在此輸入影像描述

關於多執行緒 MS 應用程式的更多證據 i=僅使用 1/N CPU % 平均最大值

在此輸入影像描述

更新

使用 QUattro Pro 安裝 WordPerfect 2020 並執行完全相同的多執行緒進程,並在所有 8 個 CPU 上獲得完全相同的結果最大 CPU 使用率 = 1/8 = 12.5% 在此輸入影像描述

例子#4

  • Mark Russinovich 的 Process Explorer(又稱 PROCMON.exe)再次利用了所有 CPu,但總共只使用了 1/N 個 CPU,即 12.5%。它獨立於所有其他進程,使用很少的資源。

我懷疑是馬克在這裡進行多線程編程的能力。 :)(碩士研究員)

在此輸入影像描述 在此輸入影像描述

我的 CPU 延遲最高 在此輸入影像描述

答案1

並非所有任務本質上都能夠拆分為能夠在 CPU 的每個核心上同時執行的任務。

CPU 中的每個核心都是成熟的處理器。它能夠維護一個硬體「線程」的執行狀態資訊。每個核心都有自己的快取和獨立於其他核心的資料處理。它們可能共享快取和記憶體總線,但在其他方面它們是完全獨立的。

該線程大致翻譯為軟體中所謂的線程。

您看到的問題是,在該軟體中執行工作的特定任務本質上是單線程的。

單一執行緒一次只能在一個核心上執行。在 8 核心處理器上,這意味著單一執行緒最多可以使用處理器的 1/8,也就是任務管理器的 12.5%。在 4 核心處理器上,比例為 1/4 或 25%。

一個程式可以有很多線程,但是這些線程只能處理彼此完全不相關的事情。一個執行緒可能正在處理更新場景數據,另一個執行緒可能正在更新 GUI 等等。

線程不能做的是在不相互通信的情況下同時處理完全相同的數據,這就是您所看到的限制。

為了使用多個 CPU 核心,必須將正在完成的任務拆分並指派給多個執行緒。這種分離是一個程式設計問題,需要由軟體工程師來實現。任何給定任務是否是多執行緒的取決於該任務的複雜性以及它是否可以首先拆分

  • 該任務是否包含可以拆分為獨立資料集以便由單獨執行緒處理的資料?
  • 軟體是否被編寫為將該特定任務拆分為單獨的執行緒?

如果資料完全依賴以特定方式處理,那麼它就不可能使用多個核心。

如果資料可以拆分,但需要更多的工作來拆分和重新合併,那麼軟體工程師可能會認為不值得付出努力,而是堅持使用一個執行緒/核心。

如果資料可以分割且軟體是這樣設計的然後您將看到超過 1 個核心正在使用。

我知道對於許多任務,Excel 支援多核心計算,但它完全依賴彼此完全不依賴的資料。

相關內容