第0050期•2019.09.20 發行
ISSN 2077-8813

首頁 >技術論壇

在MATLAB中實現分散式與平行運算(上篇)

作者:葉昱霆 /鈦思科技股份有限公司應用工程師

隨著目前資料量大幅的成長與演算法日益複雜,程式的運算負載也逐漸加重。透過MATLAB,我們可以簡單且容易的實現平行運算與使用分散式運算來達到顯著的加速效果。藉由撰寫平行運算程式碼或是將重複大量的運算修改成分散式的架構來達到加速的目的。本文將分成上下篇,介紹如何在MATLAB中存取硬體資源、撰寫平行運算程式碼、分散式運算功能以及如何使用計中提供之叢集運算資源。

前言
“平行運算”(Parallel Computing) 與“分散式運算”(Distributed Computing)為近期加速資料處理、機器學習(Machine Learning)或是深度學習(Deep Learning) 開發最為人熟知的技術。平行運算與分散式運算即人們對於爆炸成長的資料量、龐大複雜的運算量以及冗長的運算等待時間所提出的解決方案。面對上述的問題,序列執行方式已不敷使用。取而代之的是平行運算,透過資料平行將單一大任務分成若干個小任務同時進行,即在多個運算單元同時執行,解決問題。可以把平行運算想像成一家人帶著購物清單到超級市場購物,若是一家人從頭到尾一起照著清單一項項去採買清單物品,所花費的時間相較於一家人分工合作,各別負責清單上的一部分項目較長上許多。

MATLAB平行運算工具箱
MATLAB平行運算工具箱(MATLAB Parallel Computing Toolbox)提供利用多處理器、GPU以及叢集電腦之硬體環境來處理資料密集和大量運算的問題。

平行運算工具箱在MATLAB語言下可處理高階平行處理的架構,如:分散式陣列、平行演算法、迴圈平行化運算和訊息傳送,能開發資料與工作平行化的應用;而且在將原MATLAB程式轉為平行化MATLAB程式時,使用者不需大幅改寫原來的程式碼,也不用另外學習低階的平行語言;而且自2011b版本之後,平行運算工具箱可讓你不需使用CUDA or MPI編程即可執行MATLAB的平行運用。另外,使用Simulink時搭配此工具箱,可平行化執行模型的模擬。平行運算工具箱可在多核心單一處理器或多處理器的工作站執行,再搭配MATLAB分散式運算引擎還能應用於一組電腦叢集上,這兩種方式都支援互動式和批次處理執行模式。

平行化迴圈(parfor)
FOR迴圈語法(For-loop)是各大程式語言撰寫者最為熟悉的語法疊代陳述方式,但當迴圈的次數太過龐大又無法使用其他的手法,如點運算(dot operations)改寫時,往往會造成程式執行效率低落,運行時間增加,在此情況下,MATLAB提供一種平行化的迴圈函式 “parfor”。其背後的運行概念,即將迴圈中的疊代次數分配到各個 “Worker” 上去做執行(如Fig.1所示)。“Worker”為MATLAB存取多核心計算機中處理單元的計算引擎。


Fig.1 par-for 概念圖

在使用parfor指令時,MATLAB會自動建立“Parallel Pool”,為MATLAB存取的運算單元或稱Worker的集成,可以根據叢集(Cluster)中所含有的運算單元去調整數量,請見Fig.2。


Fig.2 Cluster and Parallel Pool

下面則示範如何透過改寫成平行化迴圈(parfor)來達到加速的效果。

此範例使用因數分解作為示範,分解的複雜性會隨著數量大小而增加,首先以雙精度浮點數64位來創建質數數列,並隨機乘以另一個質數,其數量達到2的21次方,並創建一陣列來儲存每個因數分解結果。
primeNumbers = primes(uint64(2^21));
compositeNumbers = primeNumbers.*primeNumbers(randperm(numel(primeNumbers)));
factors = zeros(numel(primeNumbers),2);
使用迴圈對每個複合數進行因數分解,並計算所需時間。

tic;
for idx = 1:numel(compositeNumbers)
    factors(idx,:) = factor(compositeNumbers(idx));
end 
toc

Elapsed time is 684.464556 seconds.
若是嘗試將上述迴圈程式碼平行化,其運行結果則會大幅減少。

tic;
parfor idx = 1:numel(compositeNumbers)
    factors(idx,:) = factor(compositeNumbers(idx));
end 
toc

Elapsed time is 144.550358 seconds.
如同前段所提及,當使用parfor語法時MATLAB會自行啟動平行運算池,本地電腦(Local)為預設的叢集資源並會啟動所擁有的最大數量。可以透過指令進而限制parfor所能使用的資源。

numWorkers = [1 2 4 6];

tLocal = zeros(size(numWorkers));
接下來使用迴圈來運行不同的 worker數並儲存測試結果。

for w = 1:numel(numWorkers)
    tic;
    parfor (idx = 1:numel(compositeNumbers), numWorkers(w))
        factors(idx,:) = factor(compositeNumbers(idx));
    end 
    tLocal(w) = toc;

end

通過計算單個worker的計算時間與每個最大worker的計算時間之間的比率來計算加速,並繪製加速圖。

f = figure;

speedup = tLocal(1)./tLocal;
plot(numWorkers, speedup);
title('Speedup with the number of workers');
xlabel('Number of workers');
xticks(numWorkers);

ylabel('Speedup');

Fig.3 Worker數相對應加速比率圖

總結
MATLAB平行運算工具箱(MATLAB Parallel Computing Toolbox)提供利用多處理器、GPU以及叢集電腦之硬體環境來處理資料密集和大量運算的問題。運算的資源除了本機以外,也提供使用者擴展其計算量級,藉由不同的運算語法來達成平行運算、分散式運算、叢集運算等解決大數據運算或是加速程式碼值性速率等解決方案。下篇我們將繼續介紹如何擴展並管理運算資源,以及何謂分散式運算、該如何在MATLAB中使用。

參更多資源

  • Parallel Computing Toolbox
  • Run Code on Parallel Pools
  • BigData with MATLAB
  • Using MATLAB for GPU Computing
  • Scale up from Desktop to Cluster (Example 1)
  • Numerical Estimation of Pi Using Message Passing (Example2)
  • 使用 parfor 訓練多個深度學習網路