
我在 Matlab 中編寫了一個計算任務,其中包括處理啟動時讀入記憶體的大量資料。運行時間在幾小時到幾天的範圍內。該任務是單線程的。
為了執行這個任務,我有許多不同的 Linux 機器可供使用。由於已經運行的任務,這些機器承受不同量的系統負載,這些任務將在可預見的將來繼續運作。所有機器都具有 amd64 架構,但它們在實體核心數量、虛擬核心數量以及 CPU 型號(包括時脈速度和其他因素)方面有所不同。
我的問題:是否有一種原則性的方法來選擇一台機器來執行任務,以盡快完成任務為目標?
以下部分根據 Doktoro Reichard 的回答進行了更新。
我的粗略想法是結合兩個方面來大致了解哪台機器最快:
(1) 估計如果機器在那裡運行的話,它會分配多少處理資源給我的任務,我稱之為「相對速度」:如果機器空閒,根據定義,我的任務將以相對速度 1 執行。如果目前負載為L,核心數為C,那麼我提交任務後,負載為L+1,相對執行速度為R = min(C / (L+1), 1)。 min 運算子是因為該行程不能利用多個核心。 – 作為相對於給定當前負載的機器上可能的最佳處理速度的可實現處理速度的指標,該計算是否正確?並且,相關數位C是實體核心的數量還是虛擬核心的數量,後者由於超線程而增加了一倍?
(2) 根據機器性能指標,估計如果不同機器都空閒的話,任務在不同機器上執行的相對速度。這不應該是時脈速度,而是適當選擇的基準。
然後根據哪一台具有最大的數字 (1) 和 (2) 乘積來挑選機器。
答案1
這不會有一個明確的答案,主要是由於電腦的工作方式,但我會嘗試給出一些指導方針,告訴你如何找出最快的。
我將分析您的陳述,以便告訴您您能弄清楚什麼和不能弄清楚什麼。
1. 數據
從你的第一段開始,你就說過你將所有資料載入到記憶體中並從記憶體中讀取。這對速度有好處,因為就頻寬而言,記憶體是首屈一指的。如果您的程式使用磁碟(無論是 HDD、SSD 還是隨身碟),則可能會成為程式運作速度的瓶頸。
這是由於傳輸速度造成的。 RAM 幾乎可以直接存取處理器。磁碟必須透過頻寬遠低於 RAM 的連接,對於 HDD 來說,還需要考慮獲取和儲存資料所需的時間。
2. 作業系統
使用的作業系統確實對速度有一些影響,但可以認為是殘餘的。
3.處理器架構(或指令集)
這是一個相關的面向。儘管您聲明機器使用 amd64 處理器,但所使用的指令集可能會有一些差異。
例如考慮皓龍和閃龍系列處理器。它們之間的一個關鍵區別是後者俱有SSE3支持。
SSE3 允許更新且更有效的方式來處理資料(特別是數組操作),這些操作在早期指令集中將使用效率較低的進程來完成。
那麼,在這方面,較新的處理器是設計更快,因為它們支援更有效率的指令集。
4、系統負載
正如你可能會說的,這是棺材上的最後一根釘子。除非您知道每個程式的工作原理,否則您無法以線性方式計算計算機中的負載。話雖如此,您可能有 10,000 個進程正在運行,但有剩餘負載,或者單個多執行緒進程浪費了所有處理器時間。
不過……讓我們進一步分析一下。新增進程意味著向底層系統添加某種數據,以便它知道進程存在以及應該為它準備多少處理器時間。在這方面,更少的流程是更好的為了速度,因為核心/處理器可以更好地決定可用的時間。
另一件需要考慮的事情是核心賦予進程的優先權。具有最高優先權的進程將佔用處理器的大部分時間。
您最終可以設想一個系統,為您的進程提供最大優先級,並讓所有其他進程永遠等待,直到您的進程停止。在這種情況下,你的處理速度將由CPU決定。
5、CPU
讓我們考慮一下您的觀點:核心和 CPU 時脈速度。
可以想像,核心可以將一些行程轉移到其他核心。在極限情況下,您的進程可以指定一個完整的核心。在這方面,更多的核心可以使更多的進程同時運行(因此速度更快)。
我對多線程了解不多,所以我將把它留給了解的人。
時鐘速度不是處理器效率的明確指標。為了證實這一點,我向您展示了 Apple 硬體中使用 Intel 和 PowerPC 處理器之間的「戰鬥」。蘋果辯稱,儘管英特爾處理器的處理器速度有所提高,但他們更喜歡 PowerPC 處理器而不是英特爾的主要原因是 PowerPC 性能更好,因為它們每秒可以處理比競爭對手更多的操作。最終,由於功耗問題和其他經濟因素,蘋果選擇了英特爾。
浮點運算次數(每秒浮點運算數)是電腦效能的衡量標準,特別是在大量使用浮點計算的科學計算領域,類似於舊的、更簡單的每秒指令數。如果您的工作嚴重依賴這些類型的操作,那麼這可能是比時脈速度更好的衡量標準,對於使用 Matlab 的您來說,這可能是一種可能性。
然而,這並不是一個非常容易洩漏的數量(因為它取決於什麼樣的您正在執行的操作)。我發現了一些基準超頻網。我指出這兩點:
- AMD 羿龍 Ix4 9850 @2.83GHz記憶體 754MHz 5-5-5-15每秒浮點運算數:27.5
- AMD 羿龍 IIx2 555 @4.12GHz記憶體 1000MHz 5-5-5-18浮點運算次數:26
正如您所看到的,即使速度是兩倍的處理器的性能也可能比速度一半的處理器差。
底線
沒有一個明確的公式由於程式處理中涉及無數因素,您可以使用它來估計運行時間。我總結了一些經驗法則(我嘗試按以下方式對它們進行排序)重要性):
- 將所有(或最常用的)資料儲存在 RAM 上速度更快。 (資料儲存是任何流程中的主要瓶頸)。
- 在同一台機器上運行的進程越少越好。
- 核心越多越好。
- 較新的處理器在設計上速度更快。
- CPU 速度是粗糙的速度指標(由於 RAM 延遲和其他因素的干擾)
- 您可以要求機器為您的進程提供最高優先權。機器會嘗試為您的流程分配更多時間。 (當我說會嘗試,我的意思是機器沒有義務給你的過程更多的時間,它試圖平衡一切,這就是第二項存在的原因)。
我還是有點猶豫要不要給一個全面的公式,但我相信我可以給你一個非常非常近似一,根據您的評論輸出。我不能談論多線程,所以我會認為所有核心都是獨立的。對於此演示,假設如下:
- 所有進程具有相同的負載。
- 進程不等待輸入/輸出。
- 記憶體速度為假定不成為一個因素。
- 所有行程都是單執行緒的。它們具有相同的優先權。
這樣一來,瓶頸將是CPU的容量。因此,對於任何 CPU,任何進程的相對負載如下:
R = min(C / N ; 1)
其中 R 是相對負載,C 是 CPU 中的核心數量,N 是活動進程的數量。然而,這假設系統可以均勻且完美地分配整個核心的所有負載,但這可能並不總是正確的。
將 CPU 的相對負載乘以您選擇的測量單位 (UM)(例如 GHz 或 GFLOPS),然後您就可以測量流程的「快」程度。
Speed = R * UM
所以,有了這個,你的公式是正確的。但是,求求您,拜託了請注意我必須做出的假設數量。這與真實案例相去甚遠。這不會給您一個確切的數量,而是一個有根據的猜測。
你的第二點與第一點相同(事實上,你在你的問題上回答了它)。簡而言之,它是機器的性能指標(如R = 1
),所以這裡的問題是如何選擇。這是您應該自己分析的內容:您可以使用 GHz 乘以核心數,或 GFLOPS 或兩者的某種組合。
有一些程式(我應該在寫第一個答案時就記住了)可以對 CPU 進行一些基準測試,從中您可以獲得一些可能有助於您做出決定的值。我有 SiSoftware Sandra(在我相當舊的版本上有一個處理器算術基準),但我想還有其他人。
在這種情況下,乘以 1) 和 2) 不會產生任何差異,除非您使用不同的測量單位。