簡體   English   中英

如何衡量多線程代碼如何擴展(加速)?

[英]How can I measure how my multithreaded code scales (speedup)?

假設我只有4個核心,那么衡量程序加速的最佳方法是什么? 顯然我可以測量到4,但是知道8,16等等會很好。

理想情況下,我想知道每個線程數的加速量,類似於此圖:

阿姆達爾的法律圖

有什么方法可以做到這一點嗎? 也許是一種模擬多核的方法?

對不起,但在我看來,唯一可靠的測量是實際獲得8,16或更多核心機器並對其進行測試。

內存帶寬飽和,CPU功能單元數量和其他硬件瓶頸會對可擴展性產生巨大影響。 我從個人經驗中了解到,如果一個程序在2個內核和4個內核上擴展,那么當在8個內核上運行時,它可能會大大減慢,這僅僅是因為它不足以讓8個內核能夠擴展8倍。

您可以嘗試預測會發生什么,但需要考慮很多因素:

  1. 緩存 - 大小,層數,共享/非共享
  2. 內存帶寬
  3. 核心數量與處理器數量即8核機器或雙核四核機器
  4. 核心之間的互連 - 較少數量的核心(2,4)仍然可以很好地與總線一起工作,但是對於8個或更多核心,需要更復雜的互連。
  5. 內存訪問 - 同樣,較少數量的內核與SMP(對稱多處理)模型配合良好,而較高數量的內核需要NUMA(非統一內存訪問)模型。

我不認為有一種真正的方法可以做到這一點,但我想到的一件事是你可以使用虛擬機來模擬更多核心。 例如,在VirtualBox中,您可以從標准菜單中選擇最多16個核心,但我非常確信有一些黑客可以使更多這樣的內容,而像VMware這樣的其他VirtualMach甚至可以支持更多的開箱即用。

在此輸入圖像描述

bamboon和doron是正確的,許多變量正在發揮作用,但如果你有一個可調的輸入大小n ,你可以找出代碼的強縮放弱縮放

強縮放是指修復問題大小(例如, n = 1M )並改變可用於計算的線程數。 弱縮放是指修復每個線程的問題大小( n = 10k/thread )並改變可用於計算的線程數。

確實在任何程序中都有很多變量可用 - 但是如果你有一些基本的輸入大小為n ,那么可能會有一些相似的縮放。 在幾年前我開發的n-body模擬器上,我根據固定大小和每個線程的輸入大小改變了線程,並且能夠合理地計算多線程代碼縮放程度的粗略度量。

由於您只有4個核心,因此您只能可行地計算最多4個線程的擴展。 這嚴重限制了您查看其對大部分螺紋負載的擴展程度的能力。 但是,如果您的應用程序僅用於核心數量較少的計算機上,則這可能不是問題。

你真的需要問自己一個問題:這是用於10,20,40+線程嗎? 如果是這樣,准確確定這些制度的縮放的唯一方法是在具有該硬件可用的平台上實際對其進行基准測試。


附注:根據您的應用程序,您可能只有4個核心並不重要。 如果許多線程花費時間“等待”發生某些事情(例如Web服務器),則無論可用核心的實際數量如何,某些工作負載都會隨着線程的增加而擴展。 如果你正在進行純計算,情況並非如此

我不相信這是可能的,因為有太多的變量無法准確地推斷性能。 即使假設你是100%並行。 還有其他因素,如總線速度和緩存未命中,可能會限制您的性能,更不用說周邊性能。 所有這些因素如何影響您的代碼只能通過在特定硬件平台上進行測量來完成。

我認為你是在詢問測量,所以我不會解決預測對更多核心數的影響的問題。

這個問題可以用另一種方式來看待:你可以保持每個線程的繁忙程度,以及它們總共有多少? 因此,對於六個線程,每個運行的利用率為50%,意味着您有3個等效的處理器在運行。 將其除以四個處理器,意味着您的方法實現了75%的利用率。 將該利用率與實際加速的時鍾時間進行比較,可以告訴您有多少利用率是新的開銷,以及實際加速的程度。 這不是你真正感興趣的嗎?

處理器利用率可以以幾種不同的方式實時計算。 線程可以獨立地詢問系統的線程時間,計算比率並保持全局總數。 如果您完全控制阻塞狀態,則甚至不需要系統調用,因為您可以跟蹤阻塞與非阻塞機器周期的比率,以計算利用率。 我開發的實時多線程儀器包使用這樣的方法,它們運行良好。 較新的cpu中的cpu時鍾計數器讀取20個機器周期的內部。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM