我有一個程式,想進一步提高運行時性能。
let a = 1;
let b = 2;
let c = a b;
let d = c 2;
let e = 3;
let f = c d;
let g = a e;
第1步:因為a,b和e是獨立的,所以我想并行執行它們(不同的內核)。
第二步:因為c依賴于a和b;g 依賴于 a 和 e,但 c 和 g 是相互獨立的,因此在步驟 1 之后并行執行 c 和 g。
第 3 步:因為 d 依賴于 c,所以它們在第 2 步之后執行。
第四步:因為f依賴于c和d,所以在第三步之后執行。
我們可以用 C 或任何本機支持的編程語言來實作這一點嗎?
uj5u.com熱心網友回復:
多執行緒顯然不適合您的問題。同步/資料移動時間遠大于計算兩個本機型別值(例如浮點數、整數等)相加的時間。實際上,在主流 x86-64 處理器上添加兩個整數大約需要 1 個周期,而將資料從內核的一個快取移動到另一個快取的時間至少需要幾十個周期(如果不是針對目標架構的數百個周期)。因此,使用多個內核實際上會大大降低代碼速度。多執行緒只值得相對繁重的計算(至少幾微秒,通常甚至更多)。
幸運的是,現代處理器可以在每個周期并行執行多條指令(請參閱指令級并行性和超標量處理器)。例如,英特爾 Skylake 每個周期可以執行 4 次加法。它還可以亂序執行指令。處理器可以為您檢測依賴關系,因此您不需要做太多事情。您只需要確保指令是獨立的,以便它們可以并行執行。
uj5u.com熱心網友回復:
您正在尋找的概念是“多執行緒”。大多數現代進步語言都內置了對這個概念的支持(例如 C std::thread,C 有點古老,但在 2011 年標準更新(稱為 C11)中使用threads.h標頭添加了多執行緒支持。新的 API 是可選,雖然許多常見的 C 實作確實提供支持,但您使用的可能不支持。
幸運的是,在 2011 年標準更新之前,執行緒已與 C 一起廣泛使用,并且有多個可用作庫的執行緒的非標準 API。例如,查看pthread作為 C 的通用跨平臺執行緒庫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/512707.html
標籤:C并行处理
