私は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 倍のスピードアップです。すべての反復は他の反復から独立しているため、これは並列処理に非常に適しています。なぜそれほどスケールが悪いのでしょうか?
私が試したこと:
- C# 用の OpenCV と EmguCV ラッパーをインストールしました。標準の for ループを使用すると、毎秒 ~52 ファイルを取得し、Parallel.ForEach() を使用すると、毎秒 ~200 ファイルを取得します。(私の期待通りに)
異なる量のファイルを使用しています。十分なファイルを選択した場合、ファイル/秒は変更されません:
0.3 秒で 20 ファイル、72.7 ファイル/秒0.6 秒で
60 ファイル、94.3 ファイル/秒1.9 秒
で 200 ファイル、105.3 ファイル/秒Matlab で通常の for ループを使用しても何も変わりません。どうやら、parfor ループと同じ量の並列化 (自動的に魔法のように) を行います。
- 4 つのワーカー スレッドを使用する必要があることを明示的に指定します (上記を参照) - 何もしません。(1 に設定してもパフォーマンスは低下しません)
ファイルは約です。640x480 グレースケールで、同様のコンテンツがあります。
何かご意見は?