走出平行計算的誤區,你應該在什麼時候用它?
雷鋒網按:本文為 Salesforce 知名資料科學家、機器學習工程師 Anmol Rajpurohit 對開發者的建議。對演算法進行並行處理,是業內常見的加速方式,但不少開發者對它的認識存在誤區。因此,Anmol Rajpurohit 用本文向大家說明,到底什麼時候才應該並存執行代碼、以及它的前提是什麼。
Anmol Rajpurohit
Anmol Rajpurohit :
當一件任務能被分割為多個獨立處理(不必進行資訊溝通與資源分享)的子任務,並存執行會是一個絕佳選擇。
即便這樣,效率,即如何高效地執行,仍是一個關鍵問題。這關乎能否真正實現並行化理論上的優點。
實際情況中,絕大多數代碼都有需要串列執行的部分。可並行的子任務,也需要某種形式的資料傳輸同步。因此,相比串列而言,
預測並行化到底能否讓演算法運行地更快是一件十分困難的事。
相比按序處理任務所需要的計算週期,並存執行總是有額外代價——起碼包含把任務分割為子任務,以及把它們的結果整合起來。平行計算相比串列的性能,在很大程度上是由一個因素決定的:上述額外步驟耗費的時間,與並存執行節省的時間這兩者之間的差。
值得注意的是,
並行化的帶來的額外步驟並不局限於代碼運行之時,還包括編寫平行計算代碼所需的額外時間,以及修復漏洞(並行 vs. 串列)。
有一項評估並行化表現的理論方法廣為人知——Amdahl’s law。它用下面的公式來度量並存執行子任務帶來的加速(多處理器) vs. 串列運行(單個處理器):
Slatency 是執行整個任務的理論加速;
s 是任務裡受益于額外系統資源那部分的加速;
p 是受益于額外系統資源那部分所占的執行時間的比例。
為認識到 Amdahl’s Law 的意義,請看下面的圖表。它展示了不同處理器核心數對應的理論加速。當然,這是基於所執行的任務所能達到的不同並行化程度。
有一件事雷鋒網需要提醒諸位:並不是所有代碼都能被高效地並行。能在多處理器核心上實現理論上的加速水準,這樣的代碼可謂是鳳毛麟角。這是由於串列部分、內部資訊交換成本等天然限制。通常,大型資料集才是並存執行的理想情形。但開發者不應該攝像並行化能帶來性能提升,而應該在搞並行化之前,先在任務的子集上對並行和串列誰優誰劣做一個比較。
via
kdnuggets
,雷鋒網編譯