0

私はMatlabでいくつかの画像処理コードを書きました.prallel処理を使ってスピードアップしたいと思います. 私は最も時間がかかるタスクを選びました: ガウスぼかしを画像に適用します。ファイル交換の助けを借りて、すでに imfilter() よりも高速なガウスぼかしを取得しています。ただし、それでもスケールアップしません。ここに私のテストコードがあります:

clear all
clc
image_paths = dir('C:\pics\Baustahl\3Bleche(3)\*.png');       
image_paths = sort({image_paths.name});

count = 600;

Img = cell(1, count);
Mean = cell(1, count);

for i = 1:count
    Img{i} = imread(['C:\pics\Baustahl\3Bleche(3)\ ' image_paths{i}]);
    Img{i} = Img{i}(:,:,1);
    Img{i} = single(Img{i})./255;
end
clear vars bilder

fprintf(1, 'Starting processing....\n');

starttime = tic;
parfor (i = 1:count, 4)
    Mean{i} = imgaussian(Img{i}, 25, 81);
end
elapsedtime = toc(starttime);
fprintf(1, 'Finished processing. (%d Files in %.1fs, %.1f files/second)\n', count, elapsedtime, count/elapsedtime);
fprintf(1, '\n');

clear vars Img Mean

私のシステムには Q6600 と 4 GB の RAM (これで十分です) があり、MATLAB を 1 つのコアに制限すると、次のようになります。

加工終了。(12.0s で 600 ファイル、49.8 ファイル/秒)

2 つのコア:

加工終了。(7.5 秒で 600 ファイル、80.3 ファイル/秒)

4 つのコアすべてを使用すると、次のようになります。

加工終了。(5.7 秒で 600 ファイル、104.7 ファイル/秒)

パフォーマンスは 4 倍になるはずですが、これは 2 倍のスピードアップです。すべての反復は他の反復から独立しているため、これは並列処理に非常に適しています。なぜそれほどスケールが悪いのでしょうか?

私が試したこと:

  1. C# 用の OpenCV と EmguCV ラッパーをインストールしました。標準の for ループを使用すると、毎秒 ~52 ファイルを取得し、Parallel.ForEach() を使用すると、毎秒 ~200 ファイルを取得します。(私の期待通りに)
  2. 異なる量のファイルを使用しています。十分なファイルを選択した場合、ファイル/秒は変更されません:

    0.3 秒で 20 ファイル、72.7 ファイル/秒0.6 秒で
    60 ファイル、94.3 ファイル/秒1.9 秒
    で 200 ファイル、105.3 ファイル/秒

  3. Matlab で通常の for ループを使用しても何も変わりません。どうやら、parfor ループと同じ量の並列化 (自動的に魔法のように) を行います。

  4. 4 つのワーカー スレッドを使用する必要があることを明示的に指定します (上記を参照) - 何もしません。(1 に設定してもパフォーマンスは低下しません)

ファイルは約です。640x480 グレースケールで、同様のコンテンツがあります。

何かご意見は?

4

2 に答える 2

0

matlabpool呼び出す前にを開きましたかparfor(そうしないと、通常の for のように動作します)。

matlabpool 4
parfor 
    ...
end
matlabpool close

プールの開閉には 10 ~ 20 秒のオーバーヘッドがかかることに注意してください。

于 2013-05-10T16:14:56.883 に答える