2017-05-15 61 views
0

我想在一個i.mx6平臺上使用OpenCL來改進bayer到rgb的轉換。我正在使用the OpenCL Shader進行轉換。我期待的OpenCL版本將比OpenCV的cvtColor bayer到rgb轉換(它使用for循環)更快。但事實證明,OpenCL版本比OpenCV的基於CPU的轉換慢得多。OpenCL bayer到rgb比CPU版本慢

OpenCV的:28.3 FPS爲1280 * 960的圖像 的OpenCL:7.15 FPS爲1280 * 960的圖像

size_t global[] = {1280, 960}; 
Mat bayer = Mat(960, 1280, CV_8UC1); 
Mat rgb_image = Mat(960, 1280, CV_8UC3); 
cl_input = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, width * height, bayer.data , &ret); 
if(ret != CL_SUCCESS){ 
    cout << "OpenCL Buffer Allocation Error\n" ; 
    exit(0); 
} 

cl_output = clCreateBuffer(context, CL_MEM_WRITE_ONLY | CL_MEM_USE_HOST_PTR, width * height * 3, rgb_image.data, &ret); 
if(ret != CL_SUCCESS){ 
    cout << "OpenCL OP Buffer Error\n" ; 
    exit(0); 
    } 

while(true){ 
    capture_image(bayer); 
    ret = clEnqueueNDRangeKernel(cq, kernel, 2, NULL, global, NULL, 0, NULL, NULL); 
    if(ret != CL_SUCCESS){ 
    cout << ret << " OpenCL kernel exec Error\n" ; 
    exit(0); 
    } 
    ret = clEnqueueReadBuffer(cq, cl_output, CL_TRUE, 0, width * height * 3, rgb_image.data, 0, NULL, NULL); 
    if(ret != CL_SUCCESS){ 
    cout << "OpenCL OP Buffer read Error\n" ; 
    exit(0); 
    } 
} 

有什麼我在明智的配置缺失?我是新來的OpenCL和我不知道如何調用loop.The平臺內部信息的OpenCL內核如下:

  • 平臺名稱:Vivante的OpenCL的平臺
  • 平臺簡介:EMBEDDED_PROFILE
  • 平臺版本:OpenCL的1.1
  • 平臺供應商:芯公司

  • 設備名稱:Vivante的OpenCL設備

  • 設備簡介:EMBEDDED_PROFILE
  • 設備版本:OpenCL的1.1
  • 設備供應商:芯公司
  • 設備最大工作項目尺寸:3 d
  • 設備最大工作組大小:1024

PS :我無法在OpenCV中使用OpenCL,因爲i.mx6不支持OpenCV中OpenCL支持所需的OpenCL完整配置文件

回答

0

每個線程處理4個像素(2×2拜爾模式)。這避免了fmod和三元條件(c?t:f)。你可以嘗試通過向量化4來產生每個線程8x2像素。因此,在寫入時讀取和交錯時,red.xyzw等中的4個紅色像素以及使用.even.odd進行解交織。

我也看到,每個工作組只有一個線程。由於您定位的是單一設備類型,因此請嘗試設置工作組大小以匹配最大值。也就是說,如果是矢量化,則爲32x32或16x64。

0

我不知道你的特定設備,但如果這是一個獨立的GPU有兩種優化,將有很大的不同:

  1. 從全局內存不要再讀取數據(在你鏈接的代碼中,每個源像素被多次讀取)。而是使用共享本地內存來共享從全局內存中讀取工作組中工作項目的值。如果你不這樣做,請使用圖像而不是全局內存。這將利用紋理緩存,這將爲您帶來很多相同的好處。

  2. 確保您正在使用合併讀取和寫入。一般來說,這意味着確保相鄰的工作項正在讀取相鄰的存儲位置。