新しいOpenCV2.4.3で、ユニバーサルparallel_forが追加されているのを見ました。したがって、この例に従って、自分で実装しようとしました。すべてを自分のコードで機能させることができましたが、通常の「for」コマンドを使用して通常のシリアル方式で実行される同様のループと比較して処理のタイミングを調整すると、結果はわずかに速くなるか、多くの場合少し遅くなりました。
これは、ベクトルへのプッシュなどに関係しているのではないかと思ったので(並列処理にはかなり大きな初心者です)、大きな数を実行するだけのテストループを設定しましたが、それでも機能しません。
コード:
class Parallel_Test : public cv::ParallelLoopBody
{
private:
double* const mypointer;
public:
Parallel_Test(double* pointer)
: mypointer(pointer){
}
void operator() (const Range& range) const
{
//This constructor needs to be here otherwise it is considered an abstract class.
// qDebug()<<"This should never be called";
}
void operator ()(const cv::BlockedRange& range) const
{
for (int x = range.begin(); x < range.end(); ++x){
mypointer[x]=x;
}
}
};
//TODO Loop pixels in parallel
double t = (double)getTickCount();
//TEST PARALELL LOOPING AT ALL
double data1[1000000];
cv::parallel_for(BlockedRange(0, 1000000), Parallel_Test(data1));
t = ((double)getTickCount() - t)/getTickFrequency();
qDebug() << "Parallel TEST time " << t << endl;
t = (double)getTickCount();
for(int i =0; i<1000000; i++){
data1[i]=i;
}
t = ((double)getTickCount() - t)/getTickFrequency();
qDebug() << "SERIAL Scan time " << t << endl;
出力:
Parallel TEST time 0.00415479
SERIAL Scan time 0.00204597