How to parallelise sections of my for loop

2 ビュー (過去 30 日間)
KieranSQ
KieranSQ 2020 年 10 月 8 日
コメント済み: KieranSQ 2020 年 10 月 23 日
Hello,
I am trying to think of a way to make my for loop quicker. It has occurred to me that I could parallelise the commands in the loops and then bring them back together at the end. Is there such a thing in matlab or am I overcomplicating everything?
My MWE is:
for kx = 1:length(w)
for ky = 1:length(w) %These could be linearised
for kkx = 1:length(w)
for kky = 1:length(w)
for freq_sign_ansatz = 1:2
for freq_sign_test = 1:2
[pqf, v1qf, v2qf, pw1f, pw2f, v1w1f, v1w2f, v2w1f, v2w2f] = Convection_basis(kx,ky,kkx,kky,w, freq_ansatz, freq_test);
pq_freq(freq_sign_ansatz, freq_sign_test) = pqf(kx,ky,kkx,kky,freq_ansatz, freq_test);
v1w1_freq(freq_sign_ansatz, freq_sign_test) = v1w1f(kx,ky,kkx,kky,freq_ansatz, freq_test);
v1w2_freq(freq_sign_ansatz, freq_sign_test) = v1w2f(kx,ky,kkx,kky,freq_ansatz, freq_test);
v2w1_freq(freq_sign_ansatz, freq_sign_test) = v2w1f(kx,ky,kkx,kky,freq_ansatz, freq_test);
v2w2_freq(freq_sign_ansatz, freq_sign_test) = v2w2f(kx,ky,kkx,kky,freq_ansatz, freq_test);
pw1_freq(freq_sign_ansatz, freq_sign_test) = pw1f(kx,ky,kkx,kky,freq_ansatz, freq_test);
pw2_freq(freq_sign_ansatz, freq_sign_test) = pw2f(kx,ky,kkx,kky,freq_ansatz, freq_test);
v1q_freq(freq_sign_ansatz, freq_sign_test) = v1qf(kx,ky,kkx,kky,freq_ansatz, freq_test);
v2q_freq(freq_sign_ansatz, freq_sign_test) = v2qf(kx,ky,kkx,kky,freq_ansatz, freq_test);
end
end
index = [(kx - 1) * Length_Wavenumbers + ky, (kkx - 1) * Length_Wavenumbers + kky];
if w(kkx) == w(kx) && w(kx) == 0 && (w(kky) == w(ky) && w(kky) == 0) && zero_counter == 0
zero_counter = 1;
zero_entries(zero_counter) = {index};
end
pq{index(1), index(2)} = pq_freq; %pd_dxw
v1w1{index(1), index(2)} = v1w1_freq; %pd_dxw
v1w2{index(1), index(2)} = v1w2_freq; %pd_dxw
v2w1{index(1), index(2)} = v2w1_freq; %pd_dxw
v2w2{index(1), index(2)} = v2w2_freq; %pd_dxw
pw1{index(1), index(2)} = pw1_freq; %pd_dxw
pw2{index(1), index(2)} = pw2_freq; %pd_dxw
v1q{index(1), index(2)} = v1q_freq; %vd_dxq
v2q{index(1), index(2)} = v2q_freq; %vd_dxq
end
end
end
end
Clearly here I could linearise some of the for loops through combinations of kx,ky,kkx,kky but I was interested whether there is a way of parallelising it as each pw1 etc are square matrices which are independent of each other before I combine them into a cell.
I am new to the way of parallelising things.

採用された回答

Gaurav Garg
Gaurav Garg 2020 年 10 月 12 日
Hi,
Rather than using 4-6 for loops, you can try making a single for loop traversing through all the elements.
For example -
for i = 1:2
for j = 1:2
%do anything
end
end
can be rewritten as (using parfor loop)
parfor i=1:4
[r,c] = ind2sub([2 2],i)
disp(r);
disp(c);
end
Here, ind2sub function has been used to convert the single iterator into r and c which are the iterators i and j in the first case.
Similarly you can rewrite your loops as (not tested)-
parfor x = 1:length(w)*length(w)*length(w)*length(w)
[kx, ky, kkx, kky] = ind2sub([length(w) length(w) length(w) length(w)],x);
end
  1 件のコメント
KieranSQ
KieranSQ 2020 年 10 月 23 日
Thank you! I will give this a go :)

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeArray Geometries and Analysis についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by