Matlab多線程運算的問題
上次說到,Matlab R2006a開始使用Intel MKL,只要設好OMP_NUM_THREADS這個環境變量,即可以BLAS Level 3的運算在任意線程數下。然而,盡管設定的線程數和CPU核的數目相同,但這樣也並不能保證能提升計算效率。主要的原因在於建立線程也是需要時間的。如果你的任務只要0.0001秒就能算完,但建立線程也要用0.0001秒,那就根本沒有必要把該任務多線程化。
麻煩的是,當我們設定好環境變量OMP_NUM_THREADS后啟動Matlab,那么這個進程運行的線程數就定下來了,不能中途改變。於是,我們沒有辦法根據具體問題隨時改變使用的線程數,使得在我們的程序中,能提升某部份的效率,但另一部份的效率卻可能降低。
我們可以對矩陣乘法做一點測試,在不同的線性數下,看看不同的矩陣大小,其乘法的效率如何。首先編寫程序如下:
THREADS = 2; % 線程數
N = 2000000; % N / 矩陣大小 = 每種維度的矩陣要做乘法的次數
% 設定測試的矩陣大小
MN = 50;
step = 2;
x = 10 : step : MN;
n = max(size(x));
T = zeros(2, n); % 用作存放結果
for i = 1 : n
M1 = zeros(x(i));
M2 = zeros(x(i));
M1 = rand(x(i));
M2 = rand(x(i));
t = cputime; % 准備計時
for j = 1 : N / x(i) % 令計算次數隨矩陣增大而減少
tmp = M1 * M2;
end
T(:, i) = [x(i) (cputime - t) / THREADS]; % 存放結果
end
可以在不同線程下計算,把T存起來。接着可以比較單線程下的計算結果T1和雙線程下計算的結果T2,有:
>> T = T1(2, :) ./ T2(2, :);
>> plot(T1(1, :), T, 'k')
可得出下圖。說明當矩陣大小約為20到30時,雙線程反而令矩陣乘法效率降低。當矩陣更小時,是否多線程效率更好,我不能保證,應該要作更仔細的驗算