博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Jpeg 库的解码OpenCL优化
阅读量:6872 次
发布时间:2019-06-26

本文共 1809 字,大约阅读时间需要 6 分钟。

hot3.png

libJpeg库解码OpenCL优化

这两周在闲暇时基于通用的libjpeg库重新做了一个opencl解码实现。重新熟悉下算法。

代码路径

OpenCL文件夹目录下面的就是所有的修改。
用Xcode开发的,没兴趣去整Makefile了,代码独立,移植集成也很方便。

主要特点

1.算法代码完全独立,不修改原来库中的代码。

2.支持各种YUV格式(411、422、444等等)。
3.霍夫曼解码仍然由CPU完成,采用OpenCL做idct和颜色转换,向量化实现,效率很高。(PS:当年移植那个坑爹的libjpeg-opencl时被坑死了)
4.只支持输出为rgb的格式,需要扩展的看下代码自己改,也不麻烦,这部分用simd实现比较好,因此没怎么写。

使用示例

extern "C"{#include "jpeglib.h"};int main() {    const char* inputfile = "input.jpg";    const char* outputfile = "output.jpeg";    struct jpeg_decompress_struct cinfo;    FILE* infile;    int row_stride;    auto sta = clock();    if ((infile = fopen(inputfile, "rb")) == NULL)    {        return NULL;    }    jpeg_create_decompress(&cinfo);    struct jpeg_error_mgr jerr;    cinfo.err = jpeg_std_error(&jerr);    jpeg_stdio_src(&cinfo, infile);    (void) jpeg_read_header(&cinfo, TRUE);    /*必须设成float方式,若是cpu解码,这个会影响性能,但对于gpu来说没有关系,而且float方式精度最高,几乎不会造成图片失真*/    cinfo.dct_method = JDCT_FLOAT;    (void) jpeg_start_decompress(&cinfo);    auto width = cinfo.output_width;    auto height = cinfo.output_height;    /*rgb 三个分量*/    auto pixels = (JSAMPLE*)(malloc(width*height*3));    /*opencl 解码的 api*/    /*pixels 默认为rgb24位,事先分配好内存*/    jpeg_decode_by_opencl(&cinfo, pixels);    //这里用abort而不是finish,直接中止掉    (void) jpeg_abort_decompress(&cinfo);    jpeg_destroy_decompress(&cinfo);    fclose(infile);    auto fin = clock();    printf("Time cost for %d * %d, %lu / %ds\n", width, height, fin-sta, CLOCKS_PER_SEC);    /*用得到的pixels做一些事情。。。。。。*/    /*释放掉pixels*/    free(pixels);    return 0;}

性能数据

MACBook上数据,仅供参考

OpenCL优化后数据:
Time cost for 3200 * 2000, 177757 / 1000000s
MCU is 130001 / 1000000s

原CPU方式数据

Time cost for 3200 * 2000, 363453 / 1000000s

idct和颜色转换的时间压缩到可以忽略不计了。几乎只剩下解霍夫曼编码的时间,总体性能是提升了100%。

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://my.oschina.net/jxt1234and2010/blog/517718

你可能感兴趣的文章
Android--简单的三级菜单
查看>>
java10-异常处理
查看>>
highcharts 条形图
查看>>
一个多项式问题
查看>>
Ansible 入门指南 - 安装及 Ad-Hoc 命令使用
查看>>
python练习七—P2P下载
查看>>
巨强大的免费LOGO在线制作工具
查看>>
_____________________背包——————————————————2546——————————————...
查看>>
zencart通过产品id 批量添加推荐产品
查看>>
实习第六天
查看>>
Careercup | Chapter 4
查看>>
@Value的使用
查看>>
软件工程学期总结
查看>>
解析html和采集网页的神兵利器
查看>>
自定义Json解析工具
查看>>
3Sum
查看>>
python-集合(set)
查看>>
Spring实例化bean顺序问题,导致注入失败
查看>>
Sublime Text 3编辑器的SublimeRPEL快捷键设置
查看>>
ScrollView嵌套GridView的解决办法
查看>>