CN117389571A - 一种基于opencl的jpeg2000中t1并行解码方法和装置 - Google Patents

一种基于opencl的jpeg2000中t1并行解码方法和装置 Download PDF

Info

Publication number
CN117389571A
CN117389571A CN202311684975.6A CN202311684975A CN117389571A CN 117389571 A CN117389571 A CN 117389571A CN 202311684975 A CN202311684975 A CN 202311684975A CN 117389571 A CN117389571 A CN 117389571A
Authority
CN
China
Prior art keywords
decoding
opj
mqc
opencl
value
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN202311684975.6A
Other languages
English (en)
Other versions
CN117389571B (zh
Inventor
谌竟成
董礼
冯雨
汤汉兵
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Xindong Microelectronics Technology Wuhan Co ltd
Original Assignee
Xindong Microelectronics Technology Wuhan Co ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Xindong Microelectronics Technology Wuhan Co ltd filed Critical Xindong Microelectronics Technology Wuhan Co ltd
Priority to CN202311684975.6A priority Critical patent/CN117389571B/zh
Publication of CN117389571A publication Critical patent/CN117389571A/zh
Application granted granted Critical
Publication of CN117389571B publication Critical patent/CN117389571B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5027Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Compression Or Coding Systems Of Tv Signals (AREA)

Abstract

本发明涉及一种基于opencl的jpeg2000中t1并行解码方法和装置。其方法部分主要包括:建立八个opencl文件,分别与八种类型的t1解码相关的代码块相对应;依次将对应的代码块拷贝至对应的opencl文件中,将openjpeg定义的数据类型转换为opencl支持的数据类型,并对opencl文件中的代码块进行优化;创建主解码程序,所述主解码程序包含kernel函数,用于根据opencl文件中优化的代码块实现t1并行解码的过程。本发明以openjpeg中jpeg2000的t1解码源码部分为基础,将其优化为可支持opencl设备进行t1并行解码,在一定条件下,能够加快解码速度。本发明针对jpeg2000解码中,最为复杂的熵解码中的t1解码过程,提出了一种基于opencl的t1并行解码方案,从而实现利用GPU快速解码jpeg2000码流的目的。

Description

一种基于opencl的jpeg2000中t1并行解码方法和装置
技术领域
本发明涉及jpeg2000解码过程中的熵解码中的t1解码技术领域,特别是涉及一种基于opencl的jpeg2000中t1并行解码方法和装置。
背景技术
图像压缩标准jpeg2000是一种压缩效率极高的编解码方法,由于其压缩比高且失真率低,在医疗图像、卫星图像以及数字影院等领域都有广泛的应用,但是其编解码过程繁琐复杂,这阻碍了其在市场上大规模推广和使用。其主要的编码过程为:预处理、小波变换、量化、熵编码,解码过程则依次为熵解码、反量化、小波反变换、后处理,其中最为复杂的是熵编码和解码过程,其中熵编解码又分为t1编解码、t2编解码,t1占比最重。当前技术背景下,jpeg2000大多是采用CPU来完成编解码运算的,市场上仅有英伟达公司采用了cuda开发了自家的nvJPEG库,在显卡GPU上用于jpeg2000快速编解码,且并未开源。
openjpeg是一个用C语言编写的开源jpeg2000编解码库,其源码可以任意修改、使用及用于商业用途,也是目前使用较为广泛的jpeg2000编解码库,但是目前只能用于CPU串行解码,无法进行并行解码。
有鉴于此,如何克服现有技术所存在的缺陷,解决上述技术问题,是本技术领域待解决的难题。
发明内容
针对现有技术中的缺陷或改进需求,为了解决现有jpeg2000编解码库只能用于CPU串行解码,无法进行并行解码的问题。本发明提出了一种基于opencl的jpeg2000中t1并行解码方法和装置,本发明以openjpeg中jpeg2000的t1解码源码部分为基础,将其优化为可支持opencl设备进行t1并行解码,在一定条件下,能够加快解码速度。本发明针对jpeg2000解码中,最为复杂的熵解码中的t1解码过程,提出了一种基于opencl的t1并行解码方案,从而实现利用GPU快速解码jpeg2000码流的目的。
本发明采用如下技术方案:
第一方面,本发明提供了一种基于opencl的jpeg2000中t1并行解码方法,包括:
建立八个opencl文件,分别与八种类型的t1解码相关的代码块相对应;
依次将对应的代码块拷贝至对应的opencl文件中,将openjpeg定义的数据类型转换为opencl支持的数据类型,并对opencl文件中的代码块进行优化;
创建主解码程序,所述主解码程序包含kernel函数,用于根据opencl文件中优化的代码块实现t1并行解码的过程。
在一个可选的实施方式中,所述八种类型的t1解码相关的代码块具体包括:预定义类型的代码块、结构体定义类型的代码块、数组或者常量类型的代码块、t1整体解码相关类型的代码块、mqc上下文解码器类型的代码块、重要性传播解码类型的代码块、幅值细化解码类型的代码块以及标志清除解码类型的代码块。
在一个可选的实施方式中,所述建立八个opencl文件,分别与八种类型的t1解码相关的代码块相对应具体包括:
建立八个.cl文件,分别命名为:a1.cl、a2.cl、a3.cl、a4.cl、a5.cl、a6.cl、a7.cl以及a8.cl;其中,a1.cl与预定义类型的代码块相对应;a2.cl与结构体定义类型的代码块相对应;a3.cl与数组或者常量类型的代码块相对应;a4.cl与t1整体解码相关类型的代码块相对应;a5.cl与mqc上下文解码器类型的代码块相对应;a6.cl与重要性传播解码类型的代码块相对应;a7.cl与幅值细化解码类型的代码块相对应;a8.cl标志清除解码类型的代码块相对应。
在一个可选的实施方式中,所述将openjpeg定义的数据类型转换为opencl支持的数据类型具体包括:
对八个opencl文件内的文本内容进行全文字符串检索,若检索到OPJ_CHAR则替换为char;若检索到OPJ_CHAR*则替换为char*;若检索到OPJ_FLOAT32则替换为float;若检索到OPJ_FLOA32*则替换为float32*;若检索到OPJ_FLOAT64则替换为double;若检索到OPJ_FLOA64*则替换为float64*;若检索到OPJ_BYTE则替换为unsigned char;若检索到OPJ_BYTE*则替换为unsigned char*;若检索到OPJ_INT32则替换为int;若检索到OPJ_INT32*则替换为int*;若检索到OPJ_UINT32则替换为uint;若检索到OPJ_UINT32*则替换为uint*;若检索到opj_flag_t则替换为uint;若检索到opj_flag_t*则替换为uint*;若检索到OPJ_BOOL则替换为bool;若检索到OPJ_BOOL*则替换为BOOL*。
在一个可选的实施方式中,所述对opencl文件中的代码块进行优化具体包括:
对opj_mqc_state结构体进行优化,将其中指向opj_mqc_state结构体的指针修改为两个uint型成员;
对opj_mqc结构体进行优化,将其中指向opj_mqc_state的指针数组ctxs优化修改为一个uint型的数组,长度和原始相同;将其中指向opj_mqc_states的指针的二级指针curctx修改为一个uint型的数据;将其中char型指针lut_ctx_ctxno_zc_orient修改为一个uint型数据;
对结构体数组mqc_states进行优化,将结构体中的指针修改为uint数字后,其值只用为索引即可;
对mqc上下文解码器类型的代码块进行修改和优化。
在一个可选的实施方式中,所述对mqc上下文解码器类型的代码块进行修改和优化具体包括:
检索文档中的所有字符串,若出现了*curctx->则替换为mqc_state[curctx];若出现了opj_mqc_state_t**curctx则替换为uint curctx;
对函数opj_mqc_resetstates进行修改,将mqc的ctxs均初始化为0;
对opj_mqc_setstate进行修改,对mqc的ctxs的第ctxno赋值为mbs+prob*2。
在一个可选的实施方式中,所述主解码程序包含kernel函数,用于根据opencl文件中优化的代码块实现t1并行解码的过程具体包括:
所述kernel函数接收解码块的global参数,并根据解码块的global参数进行各项初始化;
初始化passno为0,passtype执行循环;
设需要进行的t1解码块为N个,配置kernel函数运算的global size为(N),localsize为(1,1),执行编译好的代码进行并行解码。
在一个可选的实施方式中,所述kernel函数接收解码块的global参数,并根据解码块的global参数进行各项初始化具体包括:
kernel函数接收global参数:unsigned char*cblkdata_buffer表示每个解码块的原始图像压缩数据;int*t1_data_buffer表示解码后的数据存放空间;uint*len_buffer表示每个解码块的长度;uint*real_num_passes_buffer、uint*orient_buffer、int*bpno_plus_one_buffer表示每个解码块解码过程中用到的中间参数;uint*w_buffer、uint*h_buffer表示每个解码块的解码后图像块的宽和高;uint*idx1_buffer表示每个解码块解码后数据存放位置地址相对于t1_data_buffer地址偏移量;uint*idx2_buffer表示每个解码块原始数据相对于cblkdata_buffer的地址偏移量;
获取当前解码块的global_id,所述global_id对应每个解码块的global参数的索引,依据global_id依次获取每个解码块的对应global参数的值;
初始化一个uint数组,用于存放解码过程中的标志位;
初始化一个opj_mqc_t结构体mqc,将该mqc的lut_ctxno_zc_orient值初始化为global参数中的orient值的左移9位的值;
初始化一个opj_t1_t结构体t1,其中t1的data值初始化为idx1_buffer的第global_id个值的指针,表示该解码块的解码值的存放起始位置,t1的flags值初始化为uint数组,t1的mqc值初始化为指向opj_mqc_t结构体mqc的指针;
调用opj_t1_allocate_buffers函数进行二次初始化,其中,opj_t1_allocate_buffers传入的参数依次为指向t1的指针、w值和h值;
调用opj_mqc_resetstates函数,该函数传入t1的mqc值;
调用opj_mqc_setstate函数三次,该函数接收4个参数;第一次该函数传入4个参数依次为t1的mqc值、t1_CTXNO_UNI、0、46;第二次该函数传入4个参数依次为t1的mqc值、t1_CTXNO_AGG、0、3;第三次该函数传入4个参数依次为t1的mqc值、t1_CTXNO_ZC、0、4;其中t1_CTXNO_UNI、t1_CTXNO_AGG、t1_CTXNO_ZC为预定义值;
调用函数opj_mqc_init_dec初始化t1的mqc,该函数接收5个参数,依次为t1的mqc、cblkdata_buffer、idx2_buffer数组中的第globa_id个值、len、OPJ_COMMON_CBLK_DATA_EXTRA;其中,OPJ_COMMON_CBLK_DATA_EXTRA为预定义值。
在一个可选的实施方式中,所述passtype执行循环具体包括:
步骤F1:判断passno<real_num_passes且bpno_plus_one>1是否成立,若成立则执行步骤F2,不成立则结束循环;
步骤F2:判断passtype的值,若passtype的值为0则执行步骤F3;若passtype的值为1则执行步骤F4;若passtype的值为2则执行步骤F5;
步骤F3:执行opj_t1_dec_sigpass_mqc_generic_novsc函数,传入该函数两个参数,一个为t1,一个为bpno_plus_one;之后执行步骤F7;
步骤F4:执行opj_t1_dec_refpass_mqc_generic函数,传入该函数两个参数,一个为t1,一个为bpno_plus_one;之后执行步骤F7;
步骤F5:执行opj_t1_dec_clnpass_generic_novsc函数,传入该函数两个参数,一个为t1,一个为bpno__plus_one;之后执行步骤F6;
步骤F6:执行opj_t1_dec_clnpass_check_segsym函数,传入该函数一个参数,为t1;之后执行步骤F7;
步骤F7:passtype=passtype+1;
步骤F8:判断passtype的值是否等于3,若是则passtype=0,bpno_plus_one=bpno_plus_one–1,返回步骤F1;否则直接返回步骤F1。
另一方面,本发明提供了一种基于opencl的jpeg2000中t1并行解码装置,具体为:包括至少一个处理器和存储器,至少一个处理器和存储器之间通过数据总线连接,存储器存储能被至少一个处理器执行的指令,指令在被处理器执行后,用于完成第一方面中的基于opencl的jpeg2000中t1并行解码方法。
与现有技术相比,本发明的有益效果在于:
本发明提出了一种基于opencl的jpeg2000中t1并行解码方法和装置,为了解决现有jpeg2000编解码库只能用于CPU串行解码,无法进行并行解码的问题,本发明以openjpeg中jpeg2000的t1解码源码部分为基础,将其优化为可支持opencl设备进行t1并行解码,在一定条件下,能够加快解码速度。本发明针对jpeg2000解码中,最为复杂的熵解码中的t1解码过程,提出了一种基于opencl的t1并行解码方案,从而实现利用GPU快速解码jpeg2000码流的目的。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例中所需要使用的附图作简单地介绍。显而易见地,下面所描述的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
图1为本发明实施例提供的一种基于opencl的jpeg2000中t1并行解码方法的流程图;
图2为本发明实施例提供的对opencl文件中的代码块进行优化的流程图;
图3为本发明实施例提供的步骤204扩展流程图;
图4为本发明实施例提供的步骤300扩展流程图;
图5为本发明实施例提供的cblk_data_buffer内存空间示意图;
图6为本发明实施例提供的一种基于opencl的jpeg2000中t1并行解码装置结构示意图。
具体实施方式
下面结合具体实施例对本发明进行详细说明。以下实施例将有助于本领域的技术人员进一步理解本发明,但不以任何形式限制本发明。应当指出的是,对本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以作出若干变形和改进。这些都属于本发明的保护范围。
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本申请,并不用于限定本申请。
需要说明的是,如果不冲突,本发明实施例中的各个特征可以相互结合,均在本申请的保护范围之内。另外,虽然在装置示意图中进行了功能模块划分,在流程图中示出了逻辑顺序,但是在某些情况下,可以不同于装置中的模块划分,或流程图中的顺序执行所示出或描述的步骤。
除非另有定义,本说明书所使用的所有的技术和科学术语与属于本发明的技术领域的技术人员通常理解的含义相同。本说明书中在本发明的说明书中所使用的术语只是为了描述具体的实施方式的目的,不是用于限制本发明。此外,下面所描述的本发明各个实施方式中所涉及的技术特征只要彼此之间未构成冲突就可以相互组合。
本发明针对jpeg2000解码过程中的熵解码中的t1解码,提出了一种基于opencl的t1解码方法,从而可以利用支持opencl的GPU或者其他设备快速并行解码jpeg2000码流。
下面就参考附图和实施例结合来详细说明本发明。
如图1所示,本发明实施例提供一种基于opencl的jpeg2000中t1并行解码方法,该方法包括如下步骤。
步骤100:建立八个opencl文件,分别与八种类型的t1解码相关的代码块相对应。需说明,在该步骤之前,本实施例先分析openjpeg源码,找出其中和t1解码相关的解码源码,具体分析后可知,与t1解码相关的部分主要可分为八种类型,所以本实施例该步骤建立八个opencl文件,分别与八种类型的t1解码相关的代码块相对应。可以理解的是,本发明并不以此为限。
在一些实施方式中,所述八种类型的t1解码相关的代码块具体包括:预定义类型的代码块、结构体定义类型的代码块、数组或者常量类型的代码块、t1整体解码相关类型的代码块、mqc上下文解码器类型的代码块、重要性传播解码类型的代码块、幅值细化解码类型的代码块以及标志清除解码类型的代码块。本实施例采用opencl编程语言编写设备(支持opencl的设备)可编译、执行的.cl(或者.opencl)文件,新建8个.cl文件,分别命名为a1.cl、a2.cl…a8.cl,基于前述类型的划分,该八个opencl文件一一对应8种类型。具体地,在本优选实施例的一种实施方式中,所述建立八个opencl文件,分别与八种类型的t1解码相关的代码块相对应具体包括:建立八个.cl文件,分别命名为:a1.cl、a2.cl、a3.cl、a4.cl、a5.cl、a6.cl、a7.cl以及a8.cl;其中,a1.cl与预定义类型的代码块相对应;a2.cl与结构体定义类型的代码块相对应;a3.cl与数组或者常量类型的代码块相对应;a4.cl与t1整体解码相关类型的代码块相对应;a5.cl与mqc上下文解码器类型的代码块相对应;a6.cl与重要性传播解码类型的代码块相对应;a7.cl与幅值细化解码类型的代码块相对应;a8.cl标志清除解码类型的代码块相对应。
步骤200:依次将对应的代码块拷贝至对应的opencl文件中,将openjpeg定义的数据类型转换为opencl支持的数据类型,并对opencl文件中的代码块进行优化。对于该步骤,基于上述类型的划分,依次将对应的代码块拷贝至对应的.cl文件;由于openjpeg采用的是自定义数据类型,对上述opencl文件进行编译的时候,无法通过语法检测,需要将openjpeg定义的数据类型转换为opencl支持的数据类型;然后还需要对上述a2.cl中的结构体进行优化;需要修改并优化a3中定义的数组;还需要对上述中的a3.cl代码块进行修改和优化,a3.cl与数组或者常量类型的代码块儿相对应,a3.cl里面有个opj_mqc_state_t_mqc_states数组,这个数组要用于mqc上下文解码器,在解码过程中,使用对结构体opj_mqc、和opj_mqc_state的结构体数组mqc_state进行上下文状态计算,由于前面关于结构体的修改,所以需对a3.cl代码进行优化。
步骤300:创建主解码程序,所述主解码程序包含kernel函数,用于根据opencl文件中优化的代码块实现t1并行解码的过程。对于该步骤,本实施例创建一个主解码程序main_t1.cl,该cl文件包含一个kernel函数,实现t1并行解码的主要过程。
通过上述步骤,本实施例可以利用支持opencl的GPU或者其他设备快速并行解码jpeg2000码流。
具体地,本实施例首先需要分析openjpeg源码,找出和t1解码相关的解码源码,具体分析可知,与t1解码相关的部分主要由以下几部分组成。
1、openjpeg的预定义,在采用c语言的编写的openjpeg源码中,包括两部分,openjpeg关于整个解码过程的预定义和openjpeg中关于t1的预定义,第1部分在openjpeg源码的j2k.h文件中,第2部分在openjpeg源码的t1.h文件中,采用c语言编写的openjpeg源码,预定义以‘#define’标识开始。
2、openjpeg的结构体,其中与t1解码相关的结构体有3个结构体的定义,分别为在mqc.h文件中定义的结构体opj_mqc_state和结构体opj_mqc,及在t1.h文件中定义的结构体opj_t1。
3、与t1解码相关的,在代码中定义的数组或者常量,有4个相关数组,在mqc.c文件中定义的‘static const mqc_states[47*2]’数组,在t1_luts.h中定义的‘static constOPJ_BYTE lut_ctxno_zc[2048]’数组、‘lut_ctxno_sc[256]’数组、‘lut_spb[256]’数组。
4、与t1解码相关的代码块或者函数主体,具体的包含以下函数:
4_1、t1.c文件中定义的‘opj_t1_allocate_buffers’函数。
4_2、mqc.c文件中定义的函数有:
‘static void opj_mqc_init_dec_common’;
‘void opj_mqc_bytein’;
‘opj_mqc_init_dec’;
‘opj_mqc_resetstates’;
‘opj_mqc_setstate’。
4_3、mqc.inl.h文件中,定义的函数有:
‘#define opj_mqc_lpsexchange_macro’;
‘#define opj_mqc_bytein_macro’;
‘#define opj_mqc_renormd_macro’;
‘#define opj_mqc_mps_sexchange_macro’;
‘#define opj_mqc_decode_macro’;
‘#define opj_mqc_decode’。
4_4、t1.c文件中定义的函数有:
4_4_1:
‘opj_t1_getctxno_zc’;
‘#define opj_t1_setcurctx’;
‘opj_t1_getctxtxo_sc_or_spb_index’;
‘opj_t1_getctxno_sc’;
‘opj_t1_getspb’;
‘#define opj_t1_update_flags_macro’;
‘#define opj_t1_dec_sigpass_step_mqc_macro’;
‘#define DOWNLOAD_MQC_VARIABLES’;
‘#define UPLOAD_MQC_VARIBALES’;
‘opj_t1_dec_sigpass_step_mqc’;
‘#define opj_t1_dec_sigpass_mqc_internal’;
‘opj_t1_dec_sigpass_mqc_generic_novsc’。
4_4_2:
‘opj_t1_getctxno_mag’;
‘#define opj_t1_dec_refpass_step_mqc_macro’;
‘opj_t1_dec_refpass_step_mqc’;
‘#define opj_t1_dec_refpass_mqc_internal’;
‘opj_t1_dec_refpass_mqc_generic’。
4_4_3:
‘#define opj_t1_dec_clnpass_step_macro’;
‘opj_t1_dec_clnpass_step’;
‘#define opj_t1_dec_clnpass_internal’;
‘opj_t1_dec_clnpass_generic_novsc’;
‘opj_t1_dec_clnpass_check_segsym’;
‘opj_t1_decode_cblk’。
对上述挑选出的相关代码进一步分析可知,与t1解码相关的代码块,可以分为8种类型:1、预定义;2、结构体定义;3、数组或者常量;4、t1整体解码相关;5、mqc上下文解码器;6、重要性传播解码;7、幅值细化解码;8、标志清除解码。其中类型1、2、3分别与t1解码相关的部分中的1、2、3一一对应;类型4对应t1解码相关的部分中的4_1;类型5对应t1解码相关的部分中的4_2、4_3;类型6、7、8分别对应于t1解码相关的部分中的4_4_1、4_4_2、4_4_3。
具体地,在一些实施方式中,步骤200中所述将openjpeg定义的数据类型转换为opencl支持的数据类型具体包括如下操作:对八个opencl文件内的文本内容进行全文字符串检索,若检索到‘OPJ_CHAR’则替换为‘char’;若检索到‘OPJ_CHAR*’则替换为‘char*’;若检索到‘OPJ_FLOAT32’则替换为‘float’;若检索到‘OPJ_FLOA32*’则替换为‘float32*’;若检索到‘OPJ_FLOAT64’则替换为‘double’;若检索到‘float64*’则替换为‘double*’;若检索到‘OPJ_BYTE’则替换为‘unsigned char’;若检索到‘OPJ_BYTE*’则替换为‘unsignedchar*’;若检索到‘OPJ_INT32’则替换为‘int’;若检索到‘OPJ_INT32*’则替换为‘int*’;若检索到‘OPJ_UINT32’则替换为‘uint’;若检索到‘OPJ_UINT32*’则替换为‘uint*’;若检索到‘opj_flag_t’则替换为‘uint’;若检索到‘opj_flag_t*’则替换为‘uint*’;若检索到‘OPJ_BOOL’则替换为‘bool’;若检索到‘OPJ_BOOL*’则替换为‘BOOL*’。
具体地,参考图2所示,在一些实施方式中,步骤200中所述对opencl文件中的代码块进行优化具体包括如下步骤:
步骤201:对opj_mqc_state结构体进行优化,将其中指向opj_mqc_state结构体的指针修改为两个uint型成员。本实施例该步骤中,对结构体opj_mqc_state进行优化,原始openjpeg中的opj_mqc_state结构体包含2个uint型的成员,2个指向opj_mqc_state结构体的指针,opencl设备一般不能支持二级指针操作,且opj_mqc_state主要用来构造结构体数组实现相互索引,可将2个指向opj_mqc_state结构体的指针也修改为两个uint型成员。
步骤202:对opj_mqc结构体进行优化,将其中指向opj_mqc_state的指针数组ctxs优化修改为一个uint型的数组,长度和原始相同;将其中指向opj_mqc_states的指针的二级指针curctx修改为一个uint型的数据;将其中char型指针lut_ctx_ctxno_zc_orient修改为一个uint型数据。本实施例该步骤中,对结构体opj_mqc进行优化,其中opj_mqc结构体成员较多,需对其中的ctxs、curctx、lut_ctxno_zc_orient进行修改;对于ctxs,其原始是一个指向opj_mqc_state的指针数组,用于opj_mqc_state结构体数组内数据的相互索引,由于步骤201的修改,现将其优化修改为一个uint型的数组,长度和原始相同;对于curctx,原始是一个指向opj_mqc_states的指针的二级指针,修改为一个uint型的数据;对于lut_ctx_ctxno_zc_orient是一个char型指针,修改为一个uint型数据。
步骤203:对结构体数组mqc_states进行优化,将结构体中的指针修改为uint数字后,其值只用为索引即可。本实施例该步骤中,修改并优化a3中定义的数组,主要修改优化结构体数组mqc_states,由于步骤201的修改,将结构体中的指针修改为uint数字,其中原先的指针指向的是结构体数组mqc_states中的成员,因此,改为uint型后,其值只用为该成员的索引即可。
步骤204:对mqc上下文解码器类型的代码块进行修改和优化。本实施例该步骤中,对上述中的a3.cl代码块儿进行修改和优化,a3.cl与数组或者常量类型的代码块儿相对应,a3.cl里面有个opj_mqc_state_t_mqc_states数组,这个数组要用于mqc上下文解码器,在解码过程中,使用对结构体opj_mqc、和opj_mqc_state的结构体数组mqc_state进行上下文状态计算,由于前面关于结构体的修改,需对a3.cl代码进行优化,具体方式如下:原始openjpeg中都是采用‘*curctx->qeval’指针操作的方式进行计算,原先curctx为一个uint数,现修改为按照索引的方式来计算,即检索文档中的所有字符串:如果出现了相应字符就进行替换。
参考图3所示,在一些实施方式中,步骤204的所述对mqc上下文解码器类型的代码块进行修改和优化具体包括如下步骤:
步骤2041:检索文档中的所有字符串,若出现了*curctx->则替换为mqc_state[curctx];若出现了opj_mqc_state_t**curctx则替换为uint curctx。在本实施例的该步骤中,如果出现了‘*curctx->’则替换为‘mqc_state[curctx]’,例如‘*curctx->qeval’替换为‘mqc_state[curctx]->qeval’。如果出现了‘opj_mqc_state_t**curctx’则替换为‘uint curctx’。
步骤2042:对函数opj_mqc_resetstates进行修改,将mqc的ctxs均初始化为0。在本实施例的该步骤中,对函数opj_mqc_resetstates进行修改,原opj_mqc_resetstates函数用于对传入的opj_mqc类型的参数mqc,初始mqc的ctxs数组每个值为一个结构体数组mqc_state,由于上述对opj_mqc_state和opj_mqc的优化,这里将mqc的ctxs均初始化为0。
步骤2043:对opj_mqc_setstate进行修改,对mqc的ctxs的第ctxno赋值为mbs+prob*2。在本实施例的该步骤中,对opj_mqc_setstate进行修改,该函数接收4个参数,分别为mqc、ctxno、msb、prob,原opj_mqc_resetstates函数用于对传入的opj_mqc类型的参数mqc,对mqc的ctxs的第ctxno进行赋值,赋值为mqc_states的第mbs+prob*2个值,由于上述对opj_mqc_state和opj_mqc的优化,这里对mqc的ctxs的第ctxno赋值为mbs+prob*2。
参考图4所示,在一些实施方式中,步骤300的所述主解码程序包含kernel函数,用于根据opencl文件中优化的代码块实现t1并行解码的过程具体包括如下步骤:
步骤301:所述kernel函数接收解码块的global参数,并根据解码块的global参数进行各项初始化。在本实施例的该步骤中,该kernel函数接收10个global参数,依次为unsigned char*cblkdata_buffer、int*t1_data_buffer、uint*len_buffer、uint*real_num_passes_buffer、uint*orient_buffer、int*bpno_plus_one_buffer、uint*w_buffer、uint*h_buffer、uint*idx1_buffer、uint*idx2_buffer,依次表示每个解码块的原始图像压缩数据、解码后的数据存放空间、每个解码块的长度、每个解码块解码过程中用到的中间参数、每个解码块的解码后图像块的宽和高、每个解码块解码后数据存放位置地址相对于t1_data_buffer地址偏移量、每个解码块原始数据相对于cblkdata_buffer的地址偏移量。然后,根据上述参数进行各项初始化。
具体地,unsigned char*cblkdata_buffer表示每个解码块的原始图像压缩数据;int*t1_data_buffer表示解码后的数据存放空间;uint*len_buffer表示每个解码块的长度;uint*real_num_passes_buffer、uint*orient_buffer、int*bpno_plus_one_buffer表示每个解码块解码过程中用到的中间参数;uint*w_buffer、uint*h_buffer表示每个解码块的解码后图像块的宽和高;uint*idx1_buffer表示每个解码块解码后数据存放位置地址相对于t1_data_buffer地址偏移量;uint*idx2_buffer表示每个解码块原始数据相对于cblkdata_buffer的地址偏移量。
步骤302:初始化passno为0,passtype执行循环。
步骤303:设需要进行的t1解码块为N个,配置kernel函数运算的global size为(N),local size为(1,1),执行编译好的代码进行并行解码。global size、local size为原有解码库中的两个参数;passtype表示在执行哪一种解码,passno表示从0开始,循环累加至原始的库中real_num_passes这个参数值。
在一些实施方式中,步骤301的所述根据解码块的global参数进行各项初始化具体包括如下步骤:
步骤3011:获取当前解码块的global_id,所述global_id对应每个解码块的global参数的索引,依据global_id依次获取每个解码块的对应global参数的值(len、real_num_passes、orient、bpno_plus_one、w、h的值)。
步骤3012:初始化一个uint数组,用于存放解码过程中的标志位。该步骤初始化一个大小为1188的uint数组,该数组主要用于存放解码过程中的标志位。
步骤3013:初始化一个opj_mqc_t结构体mqc,将该mqc的lut_ctxno_zc_orient值初始化为global参数中的orient值(步骤3011中orient值)的左移9位的值。
步骤3014:初始化一个opj_t1_t结构体t1,其中t1的data值初始化为idx1_buffer的第global_id个值的指针,表示该解码块的解码值的存放起始位置,t1的flags值初始化为步骤3012中的uint数组,t1的mqc值初始化为指向opj_mqc_t结构体mqc(步骤3013中的mqc)的指针。
步骤3015:调用opj_t1_allocate_buffers函数进行二次初始化,其中,opj_t1_allocate_buffers传入的参数依次为指向t1(步骤3014中的opj_t1_t结构体t1)的指针、w值和h值(步骤3011中的w值和h值)。
步骤3016:调用opj_mqc_resetstates函数,该函数传入t1的mqc值。
步骤3017:调用opj_mqc_setstate函数三次,该函数接收4个参数;第一次该函数传入4个参数依次为t1的mqc值、t1_CTXNO_UNI、0、46;第二次该函数传入4个参数依次为t1的mqc值、t1_CTXNO_AGG、0、3;第三次该函数传入4个参数依次为t1的mqc值、t1_CTXNO_ZC、0、4;其中t1_CTXNO_UNI、t1_CTXNO_AGG、t1_CTXNO_ZC为预定义值。
步骤3018:调用函数opj_mqc_init_dec初始化t1的mqc,该函数接收5个参数,依次为t1的mqc、cblkdata_buffer、idx2_buffer数组中的第globa_id个值、len、OPJ_COMMON_CBLK_DATA_EXTRA;其中,OPJ_COMMON_CBLK_DATA_EXTRA为预定义值。
在一些实施方式中,步骤302的所述passtype执行循环具体包括如下步骤:
步骤F1:判断passno<real_num_passes且bpno_plus_one>1是否成立,若成立则执行步骤F2,不成立则结束循环。
步骤F2:判断passtype的值,若passtype的值为0则执行步骤F3;若passtype的值为1则执行步骤F4;若passtype的值为2则执行步骤F5。
步骤F3:执行opj_t1_dec_sigpass_mqc_generic_novsc函数,传入该函数两个参数,一个为t1,一个为bpno_plus_one;之后执行步骤F7。t1即为前面的opj_t1_t结构体t1。该循环中的函数均为对openjpeg库中现有的解码函数进行了修改后的kernel函数,函数名字和现有的openjpeg库中的函数名字是一样的。passtype所涉及的循环在openjpeg库中的t1.c的opj_t1_decode_cblk函数中。
步骤F4:执行opj_t1_dec_refpass_mqc_generic函数,传入该函数两个参数,一个为t1,一个为bpno_plus_one;之后执行步骤F7。
步骤F5:执行opj_t1_dec_clnpass_generic_novsc函数,传入该函数两个参数,一个为t1,一个为bpno__plus_one;之后执行步骤F6。
步骤F6:执行opj_t1_dec_clnpass_check_segsym函数,传入该函数一个参数,为t1;之后执行步骤F7。
步骤F7:passtype=passtype+1。
步骤F8:判断passtype的值是否等于3,若是则passtype=0,bpno_plus_one=bpno_plus_one–1,返回步骤F1;否则直接返回步骤F1。
最后,在本实施例的步骤303中,需要先编译上述过程中的所有cl文件,准备上述的步骤301、步骤302所需传入参数数据,传入上述对应的参数,设需要进行t1解码块为N个,配置kernel的运算的global size为(N),local size为(1,1),执行编译好的代码进行并行解码。需说明,passtype没有一直循环,在passno累加到real_num_passes就不会循环了,该步骤解码完后还是码流,本实施例涉及的只是t1解码,t1解码完成后要将码流送入t2解码。
综上所述,本发明实施例提出了一种基于opencl的jpeg2000中t1并行解码方法,为了解决现有jpeg2000编解码库只能用于CPU串行解码,无法进行并行解码的问题,本发明以openjpeg中jpeg2000的t1解码源码部分为基础,将其优化为可支持opencl设备进行t1并行解码,在一定条件下,能够加快解码速度。本发明针对jpeg2000解码中,最为复杂的熵解码中的t1解码过程,提出了一种基于opencl的t1并行解码方案,从而实现利用GPU快速解码jpeg2000码流的目的。
基于上述实施例提供的基于opencl的jpeg2000中t1并行解码方法,本发明实施例通过一个具体使用的例子来对该方法进行更详细的说明。
openjpeg是采用C语言进行编写的jpeg2000串行解码方法,在处理完预处理后、t2解码后,进入t1解码模块,openjpegt1原解码块一个一个串行解码,假设某张jpeg2000压缩图片,经过t2解码后,有1000个t1解码块,则需要串行执行openjpegt1解码过程1000次。每个t1解码块需要的参数有cblkdata、t1_data、len,real_num_passes、orient、bpno_plus_one、w、h,这与上述实施例中的10个参数具有一一对应的关系,且每个解码块的参数均能通过待解码码流获取得到。
某计算机,假设存在某支持opencl并行计算的设备device,按上述实施例中的步骤依次完成对应的.cl文件,编译成二进制。
当openjpeg解码至t1,用表示上述实施例中八个参数类型中每个参数类型所占的空间类型大小,在CPU的内存空间中提前申请8个大小为1000*/>字节相对应的buffer大小。
openjpeg只串行的获取每个解码块的len、real_num_passes、orient、bpno_plus_one、w、h的值,将每个解码块的这6个参数值依次送入对应的buffer之中。
将len_buffer中的所有值累加,累加值用total_len表示,将w_buffer、h_buffer中相同位置的值先相乘在累加,值用total_size表示。
申请一块大小为total_len*4+2*4*1000字节的cblk_data_buffer内存空间大小,按顺序先存放每个解码块数据cblkdata,再存放2个空字符,如图5所示。
申请一块大小为total_size*4字节的t1_data内存空间,用于存放每个解码块解码后数据。
申请一块大小为1000*4字节的内存空间idx1_buffer,idx1_buffer用于表示每个解码块数据在cblkdata_buffer的起始位置,则其第1个值为0,后面的第i个值依次为,其中/>表示第i-1个解码块的长度。
申请一块大小为1000*4字节的内存空间idx2_buffer,idx2_buffer用于表示每个解码块解码后数据存储位置,则其第一个值为0,后面的第i个值依次为
上述各个步骤中已经准备好上述实施例中采用opencl并行解码所需的所有参数数据,在device上申请大小相同的内存空间,将上述buffer数据依次从CPU搬运至支持opencl并行计算的设备device内存空间中,采用opencl接口调用main_t1.cl中的kernel函数即可进行并行解码。
综上所述,本发明实施例提出了一种基于opencl的jpeg2000中t1并行解码方法,为了解决现有jpeg2000编解码库只能用于CPU串行解码,无法进行并行解码的问题,本发明以openjpeg中jpeg2000的t1解码源码部分为基础,将其优化为可支持opencl设备进行t1并行解码,在一定条件下,能够加快解码速度。本发明针对jpeg2000解码中,最为复杂的熵解码中的t1解码过程,提出了一种基于opencl的t1并行解码方案,从而实现利用GPU快速解码jpeg2000码流的目的。
在上述实施例提供的基于opencl的jpeg2000中t1并行解码方法的基础上,本发明还提供了一种可用于实现上述方法的基于opencl的jpeg2000中t1并行解码装置,如图6所示,是本发明实施例的装置架构示意图。本实施例的基于opencl的jpeg2000中t1并行解码装置包括一个或多个处理器21以及存储器22。其中,图6中以一个处理器21为例。
处理器21和存储器22可以通过总线或者其它方式连接,图6中以通过总线连接为例。
存储器22作为一种非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块,如上述实施例中的基于opencl的jpeg2000中t1并行解码方法。处理器21通过运行存储在存储器22中的非易失性软件程序、指令以及模块,从而执行基于opencl的jpeg2000中t1并行解码装置的各种功能应用以及数据处理,即实现上述实施例的基于opencl的jpeg2000中t1并行解码方法。
存储器22可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其它非易失性固态存储器件。在一些实施例中,存储器22可选包括相对于处理器21远程设置的存储器,这些远程存储器可以通过网络连接至处理器21。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
程序指令/模块存储在存储器22中,当被一个或者多个处理器21执行时,执行上述实施例中的基于opencl的jpeg2000中t1并行解码方法,例如,执行以上描述的图1所示的各个步骤。
上述产品可执行本申请实施例所提供的方法,具备执行方法相应的功能模块和有益效果。未在本实施例中详尽描述的技术细节,可参见本申请实施例所提供的方法。
需要说明的是,以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。
通过以上的实施方式的描述,本领域普通技术人员可以清楚地了解到各实施方式可借助软件加通用硬件平台的方式来实现,当然也可以通过硬件。本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(ReadOnly Memory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;在本发明的思路下,以上实施例或者不同实施例中的技术特征之间也可以进行组合,步骤可以任意顺序实现,并存在如上所述的本发明的不同方面的许多其他变化,为了简明,它们没有在细节中提供;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。

Claims (10)

1.一种基于opencl的jpeg2000中t1并行解码方法,其特征在于,包括:
建立八个opencl文件,分别与八种类型的t1解码相关的代码块相对应;
依次将对应的代码块拷贝至对应的opencl文件中,将openjpeg定义的数据类型转换为opencl支持的数据类型,并对opencl文件中的代码块进行优化;
创建主解码程序,所述主解码程序包含kernel函数,用于根据opencl文件中优化的代码块实现t1并行解码的过程。
2.根据权利要求1所述的基于opencl的jpeg2000中t1并行解码方法,其特征在于,所述八种类型的t1解码相关的代码块包括:预定义类型的代码块、结构体定义类型的代码块、数组或者常量类型的代码块、t1整体解码相关类型的代码块、mqc上下文解码器类型的代码块、重要性传播解码类型的代码块、幅值细化解码类型的代码块以及标志清除解码类型的代码块。
3.根据权利要求2所述的基于opencl的jpeg2000中t1并行解码方法,其特征在于,所述建立八个opencl文件,分别与八种类型的t1解码相关的代码块相对应包括:
建立八个.cl文件,分别命名为:a1.cl、a2.cl、a3.cl、a4.cl、a5.cl、a6.cl、a7.cl以及a8.cl;其中,a1.cl与预定义类型的代码块相对应;a2.cl与结构体定义类型的代码块相对应;a3.cl与数组或者常量类型的代码块相对应;a4.cl与t1整体解码相关类型的代码块相对应;a5.cl与mqc上下文解码器类型的代码块相对应;a6.cl与重要性传播解码类型的代码块相对应;a7.cl与幅值细化解码类型的代码块相对应;a8.cl标志清除解码类型的代码块相对应。
4.根据权利要求1所述的基于opencl的jpeg2000中t1并行解码方法,其特征在于,所述将openjpeg定义的数据类型转换为opencl支持的数据类型包括:
对八个opencl文件内的文本内容进行全文字符串检索,若检索到OPJ_CHAR则替换为char;若检索到OPJ_CHAR*则替换为char*;若检索到OPJ_FLOAT32则替换为float;若检索到OPJ_FLOA32*则替换为float32*;若检索到OPJ_FLOAT64则替换为double;若检索到OPJ_FLOA64*则替换为float64*;若检索到OPJ_BYTE则替换为unsigned char;若检索到OPJ_BYTE*则替换为unsigned char*;若检索到OPJ_INT32则替换为int;若检索到OPJ_INT32*则替换为int*;若检索到OPJ_UINT32则替换为uint;若检索到OPJ_UINT32*则替换为uint*;若检索到opj_flag_t则替换为uint;若检索到opj_flag_t*则替换为uint*;若检索到OPJ_BOOL则替换为bool;若检索到OPJ_BOOL*则替换为BOOL*。
5.根据权利要求1所述的基于opencl的jpeg2000中t1并行解码方法,其特征在于,所述对opencl文件中的代码块进行优化包括:
对opj_mqc_state结构体进行优化,将其中指向opj_mqc_state结构体的指针修改为两个uint型成员;
对opj_mqc结构体进行优化,将其中指向opj_mqc_state的指针数组ctxs优化修改为一个uint型的数组,长度和原始相同;将其中指向opj_mqc_states的指针的二级指针curctx修改为一个uint型的数据;将其中char型指针lut_ctx_ctxno_zc_orient修改为一个uint型数据;
对结构体数组mqc_states进行优化,将结构体中的指针修改为uint数字后,其值只用为索引即可;
对mqc上下文解码器类型的代码块进行修改和优化。
6.根据权利要求5所述的基于opencl的jpeg2000中t1并行解码方法,其特征在于,所述对mqc上下文解码器类型的代码块进行修改和优化包括:
检索文档中的所有字符串,若出现了*curctx->则替换为mqc_state[curctx];若出现了opj_mqc_state_t**curctx则替换为uint curctx;
对函数opj_mqc_resetstates进行修改,将mqc的ctxs均初始化为0;
对opj_mqc_setstate进行修改,对mqc的ctxs的第ctxno赋值为mbs+prob*2。
7.根据权利要求1至6中任一项所述的基于opencl的jpeg2000中t1并行解码方法,其特征在于,所述主解码程序包含kernel函数,用于根据opencl文件中优化的代码块实现t1并行解码的过程包括:
所述kernel函数接收解码块的global参数,并根据解码块的global参数进行各项初始化;
初始化passno为0,passtype执行循环;
设需要进行的t1解码块为N个,配置kernel函数运算的global size为(N),local size为(1,1),执行编译好的代码进行并行解码。
8.根据权利要求7所述的基于opencl的jpeg2000中t1并行解码方法,其特征在于,所述kernel函数接收解码块的global参数,并根据解码块的global参数进行各项初始化包括:
kernel函数接收global参数:unsigned char*cblkdata_buffer表示每个解码块的原始图像压缩数据;int*t1_data_buffer表示解码后的数据存放空间;uint*len_buffer表示每个解码块的长度;uint*real_num_passes_buffer、uint*orient_buffer、int*bpno_plus_one_buffer表示每个解码块解码过程中用到的中间参数;uint*w_buffer、uint*h_buffer表示每个解码块的解码后图像块的宽和高;uint*idx1_buffer表示每个解码块解码后数据存放位置地址相对于t1_data_buffer地址偏移量;uint*idx2_buffer表示每个解码块原始数据相对于cblkdata_buffer的地址偏移量;
获取当前解码块的global_id,所述global_id对应每个解码块的global参数的索引,依据global_id依次获取每个解码块的对应global参数的值;
初始化一个uint数组,用于存放解码过程中的标志位;
初始化一个opj_mqc_t结构体mqc,将该mqc的lut_ctxno_zc_orient值初始化为global参数中的orient值的左移9位的值;
初始化一个opj_t1_t结构体t1,其中t1的data值初始化为idx1_buffer的第global_id个值的指针,表示该解码块的解码值的存放起始位置,t1的flags值初始化为uint数组,t1的mqc值初始化为指向opj_mqc_t结构体mqc的指针;
调用opj_t1_allocate_buffers函数进行二次初始化,其中,opj_t1_allocate_buffers传入的参数依次为指向t1的指针、w值和h值;
调用opj_mqc_resetstates函数,该函数传入t1的mqc值;
调用opj_mqc_setstate函数三次,该函数接收4个参数;第一次该函数传入4个参数依次为t1的mqc值、t1_CTXNO_UNI、0、46;第二次该函数传入4个参数依次为t1的mqc值、t1_CTXNO_AGG、0、3;第三次该函数传入4个参数依次为t1的mqc值、t1_CTXNO_ZC、0、4;其中t1_CTXNO_UNI、t1_CTXNO_AGG、t1_CTXNO_ZC为预定义值;
调用函数opj_mqc_init_dec初始化t1的mqc,该函数接收5个参数,依次为t1的mqc、cblkdata_buffer、idx2_buffer数组中的第globa_id个值、len、OPJ_COMMON_CBLK_DATA_EXTRA;其中,OPJ_COMMON_CBLK_DATA_EXTRA为预定义值。
9.根据权利要求8所述的基于opencl的jpeg2000中t1并行解码方法,其特征在于,所述passtype执行循环包括:
步骤F1:判断passno<real_num_passes且bpno_plus_one>1是否成立,若成立则执行步骤F2,不成立则结束循环;
步骤F2:判断passtype的值,若passtype的值为0则执行步骤F3;若passtype的值为1则执行步骤F4;若passtype的值为2则执行步骤F5;
步骤F3:执行opj_t1_dec_sigpass_mqc_generic_novsc函数,传入该函数两个参数,一个为t1,一个为bpno_plus_one;之后执行步骤F7;
步骤F4:执行opj_t1_dec_refpass_mqc_generic函数,传入该函数两个参数,一个为t1,一个为bpno_plus_one;之后执行步骤F7;
步骤F5:执行opj_t1_dec_clnpass_generic_novsc函数,传入该函数两个参数,一个为t1,一个为bpno__plus_one;之后执行步骤F6;
步骤F6:执行opj_t1_dec_clnpass_check_segsym函数,传入该函数一个参数,为t1;之后执行步骤F7;
步骤F7:passtype=passtype+1;
步骤F8:判断passtype的值是否等于3,若是则passtype=0,bpno_plus_one=bpno_plus_one–1,返回步骤F1;否则直接返回步骤F1。
10.一种基于opencl的jpeg2000中t1并行解码装置,其特征在于:
包括至少一个处理器和存储器,所述至少一个处理器和存储器之间通过数据总线连接,所述存储器存储能被所述至少一个处理器执行的指令,所述指令在被所述处理器执行后,用于完成权利要求1至9中任一项所述的基于opencl的jpeg2000中t1并行解码方法。
CN202311684975.6A 2023-12-11 2023-12-11 一种基于opencl的jpeg2000中t1并行解码方法和装置 Active CN117389571B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311684975.6A CN117389571B (zh) 2023-12-11 2023-12-11 一种基于opencl的jpeg2000中t1并行解码方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311684975.6A CN117389571B (zh) 2023-12-11 2023-12-11 一种基于opencl的jpeg2000中t1并行解码方法和装置

Publications (2)

Publication Number Publication Date
CN117389571A true CN117389571A (zh) 2024-01-12
CN117389571B CN117389571B (zh) 2024-04-12

Family

ID=89466952

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311684975.6A Active CN117389571B (zh) 2023-12-11 2023-12-11 一种基于opencl的jpeg2000中t1并行解码方法和装置

Country Status (1)

Country Link
CN (1) CN117389571B (zh)

Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20040190784A1 (en) * 2003-03-27 2004-09-30 Konica Minolta Business Technologies, Inc. JPEG2000 coding and/or decoding apparatus and method
US20130121421A1 (en) * 2010-07-06 2013-05-16 Fraunhofer-Gesellschaft Zur Foerderung Der Angewandten Forschung E.V. Video decoder and method of decoding a sequence of pictures
CN103260034A (zh) * 2013-05-14 2013-08-21 李小林 一种OpenCL J2K压缩方法
CN103959238A (zh) * 2011-11-30 2014-07-30 英特尔公司 使用gpu/cpu体系结构的rsa的高效实现
US20150347108A1 (en) * 2014-05-30 2015-12-03 Apple Inc. Language, Function Library, And Compiler For Graphical And Non-Graphical Computation On A Graphical Processor Unit
US20190182495A1 (en) * 2017-12-12 2019-06-13 Coherent Logix, Incorporated Low Latency Video Codec and Transmission with Parallel Processing
CN110244939A (zh) * 2019-05-20 2019-09-17 西安交通大学 一种基于OpenCL的RS码编解码方法
CN112385225A (zh) * 2019-09-02 2021-02-19 北京航迹科技有限公司 用于改进图像编码的方法和系统
US20220334851A1 (en) * 2021-04-15 2022-10-20 Nvidia Corporation Application programming interface to generate a representation of graph code
CN115794137A (zh) * 2022-12-05 2023-03-14 芯动微电子科技(武汉)有限公司 面向gpu的人工智能模型部署方法及设备

Patent Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20040190784A1 (en) * 2003-03-27 2004-09-30 Konica Minolta Business Technologies, Inc. JPEG2000 coding and/or decoding apparatus and method
US20130121421A1 (en) * 2010-07-06 2013-05-16 Fraunhofer-Gesellschaft Zur Foerderung Der Angewandten Forschung E.V. Video decoder and method of decoding a sequence of pictures
CN103959238A (zh) * 2011-11-30 2014-07-30 英特尔公司 使用gpu/cpu体系结构的rsa的高效实现
CN103260034A (zh) * 2013-05-14 2013-08-21 李小林 一种OpenCL J2K压缩方法
US20150347108A1 (en) * 2014-05-30 2015-12-03 Apple Inc. Language, Function Library, And Compiler For Graphical And Non-Graphical Computation On A Graphical Processor Unit
US20190182495A1 (en) * 2017-12-12 2019-06-13 Coherent Logix, Incorporated Low Latency Video Codec and Transmission with Parallel Processing
CN110244939A (zh) * 2019-05-20 2019-09-17 西安交通大学 一种基于OpenCL的RS码编解码方法
CN112385225A (zh) * 2019-09-02 2021-02-19 北京航迹科技有限公司 用于改进图像编码的方法和系统
US20220334851A1 (en) * 2021-04-15 2022-10-20 Nvidia Corporation Application programming interface to generate a representation of graph code
CN115794137A (zh) * 2022-12-05 2023-03-14 芯动微电子科技(武汉)有限公司 面向gpu的人工智能模型部署方法及设备

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
JAN G. CORNELIS等: "Heterogeneous Acceleration of Volumetric JPEG 2000", 《2015 23RD EUROMICRO INTERNATIONAL CONFERENCE ON PARALLEL, DISTRIBUTED, AND NETWORK-BASED PROCESSING》, 23 April 2015 (2015-04-23), pages 1 - 8 *
ROTO LE等: "High Performance Parallel JPEG2000 Streaming Decoder Using GPGPU-CPU Heterogeneous System", 《2012 IEEE 23RD INTERNATIONAL CONFERENCE ON APPLICATION-SPECIFIC SYSTEMS,ARCHITECTURES AND PROCESSORS》, 10 November 2012 (2012-11-10), pages 16 - 23 *
张小殊: "OpenCL并行编程语言及其矢量相加实例——一文带你快速入门", pages 1 - 7, Retrieved from the Internet <URL:《https://blog.csdn.net/qq_46009046/article/details/133777178》> *

Also Published As

Publication number Publication date
CN117389571B (zh) 2024-04-12

Similar Documents

Publication Publication Date Title
US20210303588A1 (en) Dynamic Field Data Translation to Support High Performance Stream Data Processing
US8572131B2 (en) Techniques for more efficient usage of memory-to-CPU bandwidth
US8902087B1 (en) Data decompression utilizing pre-expanded dictionaries during decompression
US11449761B2 (en) Efficient value lookup in a set of scalar intervals
CN113283613B (zh) 深度学习模型的生成方法、优化方法、装置、设备及介质
KR20140018881A (ko) 오토마톤의 진입 차수 및/또는 진출 차수를 제어하기 위한 양화 언롤링
US20230078918A1 (en) Devices and methods for efficient execution of rules using pre-compiled directed acyclic graphs
US9137336B1 (en) Data compression techniques
CN111104120A (zh) 神经网络编译方法、系统及相应异构计算平台
Yamamoto et al. Huffman coding with gap arrays for GPU acceleration
Volf Weighting techniques in data compression: Theory and algorithms
CN117389571B (zh) 一种基于opencl的jpeg2000中t1并行解码方法和装置
US6907516B2 (en) Compression of program instructions using advanced sequential correlation
CN112527272A (zh) 对接tvm的方法及相关设备
US6919827B2 (en) Method and apparatus for effectively decoding Huffman code
CN117216461A (zh) 一种搭建遗传优化算法计算平台的方法及平台使用方法
CN112199214A (zh) 一种gpu上的候选口令生成及应用破解方法
CN116090538A (zh) 一种模型权重获取方法以及相关系统
CN109992293B (zh) Android系统组件版本信息的组装方法及装置
Fuentes-Alventosa et al. Cuvle: Variable-length encoding on cuda
CN113592701B (zh) 将梯度压缩算法开发注册到深度学习框架中的方法及系统
CN117113351B (zh) 一种基于多重多级预训练的软件分类方法及设备
CN117498987B (zh) 一种应用于大规模网络数据传输的方法
Hildebrandt et al. LCTL: Lightweight Compression Template Library
Takafuji et al. GPU implementations of deflate encoding and decoding

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant