OpenCV OpenCL example using UMat

重點在於 shader code 必須是固定的,如果 filter kernel 一直改變,估計在 runtime 重新 compile shader 的時間會成為瓶頸。

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/ocl.hpp>
#include <time.h>

using namespace cv;
using namespace cv::ocl;

int main(int argc, char** argv)
{
	setUseOpenCL(1);
	printf("useCL %s\n", useOpenCL()?"true":"false");

    Mat img = imread(argv[1]);
    UMat mImgSource, mImgSource2, mImgResult, mImgResult2, mImgResult3;
	img.copyTo(mImgSource);

    int ksize = 200;
    RNG rng;
    while (true) {
    	clock_t t1 = clock();
    	add(mImgSource, UMat(mImgSource.size(), mImgSource.type(), Scalar( rng.uniform(0,50), rng.uniform(0,50), rng.uniform(0,50), rng.uniform(0,50) )), mImgSource2);
    	boxFilter(mImgSource2, mImgResult, -1, Size(ksize, ksize));
    	boxFilter(mImgResult, mImgResult2, -1, Size(ksize, ksize));
    	resize(mImgResult2, mImgResult3, Size(), 0.5, 0.5);
    	clock_t t2 = clock();
    	printf("%d %d\n", ksize, (int)(t2-t1));
    	imshow("img", mImgResult3);
    	int key = waitKey(1);
    	if (key > 0) break;
    }
}

 

Pipeline Programming

pipe

基本上是一個硬體 pipeline 概念

一個簡單的加速方法,至少需要雙核心以上 CPU 才有效果

演算法執行重複的 A 和 B 兩個 process,其中 B 是相依 A 的結果,但 B 的執行時間小於 A ,且下一個 A 相依前一個 A 但不相依前一個 B 的結果。代表可以用 pipeline 的方式將 B 執行在另一 個 thread,把時間隱藏在下一個 A 循環計算中。 整體而言除了要等最後一個 B process 結束外,基本上整個 pipeline 的執行時間就是在最長的 process 上而已。

下面是一個簡單利用 openmp 的寫法及執行結果,關閉 openmp 即可以退化成 non-pipe mode

閱讀全文〈Pipeline Programming〉

C++11 Rvalue move table

Lvalue T Lvalue class Rvalue T Rvalue class
Lvalue T copy copy copy move
Lvalue class copy copy copy move
Rvalue T copy copy copy move
Rvalue class move move move move