2017-05-15 63 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. 确保您正在使用合并读取和写入。一般来说,这意味着确保相邻的工作项正在读取相邻的存储位置。