Subscribed unsubscribe Subscribe Subscribe

MATLABのparforの使い方メモ(高速化のために)

MATLABのparfor構文を使うと、parfor内の処理を並列で行ってくれるため簡単に高速化ができます。たとえば多くのパラメータに対するシミュレーション結果を得たいとき、parforを使うと各パラメータに関する計算を簡単に並列化することができます。

しかし、parfor内の処理には、並列化のためのやっかいな制限があります。中でも「結果を配列に書き込むときは、異なる並列計算の書き込み先インデックスが競合しないことが保証されなければいけない」という制限がくせもので、これ自体は当たり前な事なのですが、これをMATLABに納得させるようにプログラムを書くのが少し面倒だったりします。
以下に、parforがちゃんと動くコードを示します。内容は、ある2パラメータtheta1とtheta2の直積の範囲で計算を走査するプログラムとなっています。

% 走査したいパラメータ
theta1 = 1:100;
theta2 = 1:100;

% parfor内から書き込みたい配列のサイズを、parforのインデックスの最大値として明示する
resultMatrix = zeros(length(theta1),length(theta2));
theta1indmax = size(resultMatrix,1);
theta2indmax = size(resultMatrix,2);
% theta1ind, theta2indを陽にインデックスに指定する・その1
parfor theta1ind = 1:theta1indmax
    for theta2ind = 1:theta2indmax
        % theta1ind, theta2indを陽にインデックスに指定する・その2
        resultMatrix(theta1ind,theta2ind) = theta1(theta1ind)^2 + theta2(theta2ind)^2;
    end
end

contourf(resultMatrix);

% parfor中で配列に書き出さない時は、上記の制限を気にせず書くことができる
parfor theta1ind = 1:length(theta1)
    for theta2ind = 1:length(theta2)
        [theta1(theta1ind) theta2(theta2ind)]
    end
end