반응형



OpenCL 사용 여부에 따라 OpenCV 성능이 어떻게 달라지는지 테스트해보았습니다.



테스트는 다음과 같이 진행했습니다.


OpenCL을 활성화 한 상태에서 소벨을 10000번 진행하고


ocl::setUseOpenCL(true);


for (int i = 0; i < 10000; i++) {
UMat dst;
Sobel(src, dst, -1, 1, 0);
}



OpenCL을 비활성화한 상태에서 소벨을 10000번 진행합니다.


ocl::setUseOpenCL(false);


for (int i = 0; i < 10000; i++) {
UMat dst;
Sobel(src, dst, -1, 1, 0);
}




테스트 결과 OpenCL을 활성화 했을 때가 비활성화 했을때보다 10배 정도 빨라졌습니다.

(테스트 환경에 따라 달라질 수 있습니다.)


1 GPU device (s) detected
- Device 0 ---
Name : Intel(R) HD Graphics 620
Availability : 1
Image Support : 1
OpenCL C version : OpenCL C 2.0
Sobel Test : OpenCL Enabled  --- Done. Processing Time : 25.757 sec.
Sobel Test : OpenCL Disabled  --- Done. Processing Time : 316.561 sec.




테스트에 사용한 전체 코드입니다.


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

using namespace std;
using namespace cv;


int  main()
{

// OpenCL을 사용할 수 있는지 테스트
if (!ocl::haveOpenCL()) {
cout << "에러 : OpenCL을 사용할 수 없는 시스템입니다." << endl;
return  -1;
}

// 컨텍스트 생성
ocl::Context context;
if (!context.create(ocl::Device::TYPE_GPU)) {
cout << " 에러 : 컨텍스트를 생성할 수 없습니다." << endl;
return  -1;
}

// GPU 장치 정보
cout << context.ndevices() << " GPU device (s) detected " << endl;
for (size_t i = 0; i < context.ndevices(); i++) {
ocl::Device device = context.device(i);
cout << " - Device " << i << " --- " << endl;
cout << " Name : " << device.name() << endl;
cout << " Availability : " << device.available() << endl;
cout << "Image Support : " << device.imageSupport() << endl;
cout << " OpenCL C version : " << device.OpenCL_C_Version() << endl;
}

// 장치 0 번 사용
ocl::Device(context.device(0));

// 입력 이미지
Mat mSrc = imread("lena.jpg" , IMREAD_GRAYSCALE ) ;
UMat src = mSrc.getUMat(ACCESS_READ);

// 실행 시간 측정
static int64 start, end;
static float time;


// OpenCL Enable 상태에서 Sobel을 10000번 반복
ocl::setUseOpenCL(true);
cout << " Sobel Test : OpenCL Enabled ";

start = getTickCount();
for (int i = 0; i < 10000; i++) {
UMat dst;
Sobel(src, dst, -1, 1, 0);
}
end = getTickCount();
time = (end - start) / getTickFrequency();
cout << " --- Done. Processing Time : " << time << " sec. " << endl;


// OpenCL Disable 상태에서 Sobel을 10000번 반복
ocl::setUseOpenCL(false);
cout << " Sobel Test : OpenCL Disabled ";

start = getTickCount();
for (int i = 0; i < 10000; i++) {
UMat dst;
Sobel(src, dst, -1, 1, 0);
}
end = getTickCount();
time = (end - start) / getTickFrequency();
cout << " --- Done. Processing Time : " << time << " sec. " << endl;

return  0;
}




참고


https://sites.google.com/site/uranishi/opencv_imageprocessing/opencl_opencv

https://docs.opencv.org/3.3.0/dc/d71/tutorial_py_optimization.html




최초 작성 2019. 1. 22



반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts