2017-01-13 19 views
1

私のコンピュータ上でcv :: remap()のGPU対CPUの評価を実行しようとしています。 これを行うには、max_countコール以上の時間を平均化しようとしていました。私が観察し何OpenCV 3.Xのタイミング機能呼び出しUMATを使用して

for(int count = 0; count < max_count; count++) 
{ 
auto t0 = std::chrono::high_resolution_clock::now(); 
     cv::remap(cv_im_gpu, cv_im_gpu_remap, map1_gpu, map2_gpu, CV_INTER_LINEAR); 
auto t1 = std::chrono::high_resolution_clock::now(); 
time += t1 - t0; 
} 
average_time = time/max_count; 

最初の繰り返しは約100ミリ秒(1024×768ピクセルの入力画像)を取り、supsequent反復が0msとしたことでした。私は何らかのシンクロナイズを実行しなければならないのですか?またはこの動作の理由は何ですか? cv :: UMatの代わりにcv :: Matを使って同じ関数を呼び出すことは、期待通りに機能し、すべての反復はおおよそ同じ時間になります。

OpenCV 3.1.0を使用しているATI 360mグラフィックスカードを使用してWindows 7プラットフォームでコードを実行しています。

ありがとうございました。

+0

私は初めて、OpenCLコードをコンパイルしなければならないと考えているので、これを観察します。 'UMat'を使った' cv :: remap'の他の呼び出しは、何らかの形で保存する必要があるので、再マップOpenCLコードをコンパイルする必要はありません。 – Catree

+0

あなたの答えCatreeに感謝します。私はコンパイルには初めて関数が起動されるまでに時間がかかることを知っています。私が理解していないのは、後続の反復が時間変数に何も寄与しない理由です。 – Martin1988a

+0

毎回コンパイルを避けるため、バイナリカーネルがどこかに保存されているとします。詳細:[オンライン/オフライン編集](https://www.fixstars.com/en/opencl/book/OpenCLProgrammingBook/online-offline-compilation/)。 – Catree

答えて

0

OpenCVコードにclWaitForEvents(...)を追加することでこれを修正しました。ありがとうございました。

関連する問題