使用所有核心會降低效率嗎?

使用所有核心會降低效率嗎?

我有一個程式(嗯,php 腳本),它執行一些相當繁重的文字搜尋 - 它加載一個 2mb 和 40mb 檔案並蒐索它們以查找第一個中出現的每個單字在第二個中出現的位置。

我有一個 4 核心 cpu(個人電腦)。當我開始運行進程時,CPU 使用率跳至 25%,負載為 1。 IE。讓每個任務比單獨運行需要更長的時間才能完成?如果我運行 4 個進程,CPU 使用率達到 100%,會怎麼樣?那麼他們會跑得慢嗎?

我認為並行運行兩個進程比串行運行它們完成得更快,這是正確的嗎?如果我跑了兩次以上(例如 3 次或 4 次),這仍然是真的嗎?或更多?這其中的瓶頸在哪裡——我假設只要我保持進程數等於或小於核心數,那麼cpu就可以處理它,但是記憶體存取呢?進程在讀取記憶體時是否必須等待?

答案1

簡短的回答:對其進行基準測試。

長答案:每個單獨的進程將需要更長的時間才能完成(由於頻率縮放),但總體而言,最有效的做法是將每個核心加載到 100%。

答案2

這取決於許多因素,並行運行會提高效能還是降低效能。喜歡:

  1. 如果您進行大量 IO,在比較中使用大文件,那麼瓶頸將是磁碟而不是 CPU,並且您的效能肯定會下降。
  2. 同時,如果你的檔案對於系統中的 RAM 來說足夠大,並且你運行多個進程,那麼瓶頸將是 RAM,並且機器中也會再次出現 IO。

因此,這要根據具體情況而定。但就你而言,我非常確定,只有並行運行時,你的性能才會提高,而且我看不到可能會降低你的效率的場景,除非我錯過了一些點,而我可以'想不到。

答案3

聽起來您在硬碟或網路上都沒有太多 I/O 等待。假設您有 GB 的 RAM,那麼 42MB 的檔案應該可以輕鬆載入到 RAM 中。此時,四個並行進程應該會為您帶來最佳結果。當正常的作業系統程序需要運行時,您會看到輕微的上下文切換。

在 NUMA 系統上,每個核心都有一個分配的記憶體池。當核心將進程遷移到其他核心時,效能可能會下降,因為檔案仍在原始核心的記憶體池中。老實說,我不確定這是否適用於個人電腦。

答案4

一般來說 - 是的。暫時忽略編碼部分。

現代多核心處理器具有升壓模式,如果僅使用少量核心,則可以稍微提高頻率。因此,使用所有核心會使單一核心更小。詳細資訊取決於處理器。

也就是說:總數仍然會更高,因為與獲得另一個核心相比,單獨的提升通常非常小(大約幾百兆赫)。因此,使用所有 coer 確實會更好。提升主要是針對那些擴展性不好且需要高每核頻率的情況——其中包括單線程遊戲;)

問你有關記憶體存取的問題。我希望您知道現代伺服器的 DRAM 記憶體存取速度超過每秒 50GB(即千兆位元組),更多來自快取。所以,你不太可能碰到這個。 IO 可能是一個問題,但這可以透過 CPU 未達到最大且 IO 等待統計資料上升來看出。快取在這裡很有幫助。

相關內容