上次說到,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;
endt(:, i) = [x(i) (cputime - t) / threads]; % 存放結果
end可以在不同執行緒下計算,把t存起來。接著可以比較單執行緒下的計算結果t1和雙線程下計算的結果t2,有:
>> t = t1(2, :) ./ t2(2, :);
>> plot(t1(1, :), t, 'k')
可得出下圖。說明當矩陣大小約為20到30時,雙線程反而令矩陣乘法效率降低。當矩陣更小時,是否多執行緒效率更好,我不能保證,應該要作更仔細的驗算
Matlab多執行緒運算的問題
上次說到,matlab r2006a開始使用intel mkl,只要設好omp num threads這個環境變數,即可以blas level 3的運算在任意執行緒數下。然而,儘管設定的執行緒數和cpu核的數目相同,但這樣也並不能保證能提公升計算效率。主要的原因在於建立執行緒也是需要時間的。如果你的...
Matlab多執行緒與多核運算, 以及GPU加速
matlab支援多執行緒多核運算,並且可用gpu加速 軟體版本 matlab2015a windows10 i7 4710hq 16g gtx860m 4g 1.matlab多執行緒.preference computer vision system toolbox 勾選 use parallel ...
多執行緒(多執行緒的安全問題)
多執行緒的執行出現安全問題。非常可怕的問題,一出問題比較惱火 問題原因 重點 當多條語句在操作同乙個執行緒共享資料時,乙個執行緒對多條語句只執行了一部分,還沒執行完,另乙個執行緒參與進來執行。導致共享資料的錯誤。解決方法 對多條操作共享資料的語句,只能讓乙個執行緒都執行完,在執行過程中,其他執行緒不...