2016-12-16 9 views
0

私はアルゴリズムmyAlgo()を持っています。これは、データセット(約1000matファイル)を解析するために、パラメータpar1を使用しています。 .matファイルへのパスは、myAlgo()にも渡すセル配列です。 myAlgo()関数には、クラスおよびその他の関数が含まれています。 par1のすべての値に対して、私はすべての1000の.matファイルをテストする必要があります。私は独立した(?)問題があるので、並列ループを使うことができれば、もっと速くなります。Matlab parforと入力ファイル

私はparforに次のコードを使用します。

par1 = linespace(1,10,100); 
myFiles % cell array with the .mat file location 
myResult = zeros(length(par1),1); 

parfor k=1:length(par1) 
    myPar = par1(k); 
    myResult(k) = myAlgo(myPar, myFiles); 
end 

% do something with myResult 

function theResult = myAlgo(myPar, myFiles) 
    for ii=1:length(myFiles) 
     tempResult = initAlgo(myPar, myFiles(ii)); 
    end 
    theResult = sum(tempResult); 
end 

だから par1内のすべてのパラメータのために、私は同じことを行います。残念ながら、処理時間は減少しません。しかし、CPU(i5)の作業負荷をチェックすると、すべてのコアが静かにアクティブになります。今

私の質問は:parforによって初期化すべての労働者が1000個の.MATファイルとフォルダにアクセスする必要があるためparforが、この場合には機能しないこと、それは可能です。したがって、彼らは同じ時間に自分の仕事をすることはできません。右?それで、これを処理する方法はありますか?

答えて

1

まず、並列計算ツールボックス(PCT)のライセンスを取得しているかどうかを確認してください。あなたが持っていない場合、parfor will behave just like a normal for loop WITHOUT actually parallel processing (for compatibility reasons).

次に、必ずparpool firstを開いてください。

もう1つの問題は、100回の反復で外側のループに対して並列処理を使用しているが、1000回の反復でより大きな内側のループに対しては並列処理を使用していない可能性があります。あなたは100個の外側ループだけでなく、100 * 1000 = 100000個のタスクをparforで並列化できる大きなループとして問題を言い換えるべきです。 This excellent postは問題をうまく説明し、いくつかの解決策を提供します。

+0

あなたは正しいです。それはおそらくそれを遅くする。しかし、実際には上記の例では 'parfor'は機能しません。これは、すべてのプロセスが.matファイルに同時にアクセスする必要があるためですか? – Samuel

+0

それはずっと遅くする必要があります。ループ構造を変更しようとしましたか?私の知る限りでは、並列ファイルの読み込みは問題にならないはずです。この記事によれば、場合によってはさらに高速になることもあります。https://de.mathworks.com/matlabcentral/answers/20863-parfor-file-reading 「うまくいきません」エラーメッセージはありましたか? BTW parpoolを使って並列処理を初期化しましたか? – mzunhammer

+0

エラーはありません。しかし、私が 'for'と 'parfor'の時間を測定すると、有意差はありません。両方のループを比較するMATLAB Webサイトの例を使用すると、計算時間に大きな違いがあります。これはうまくいく。しかし、私はparpoolを使って並列処理を初期化することはできません。試してみると、ライセンスエラーメッセージが表示されます。 – Samuel

関連する問題