首页> 中国专利> 一种基于GPU加速的提高振动数据传输带宽方法

一种基于GPU加速的提高振动数据传输带宽方法

摘要

本发明公开了一种基于GPU加速的提高振动数据传输带宽方法,属于数据压缩算法和数据传输技术领域。该方法采用GPU压缩算法模块将数据体积进行压缩,数据在传输之后使用GPU解压缩算法模块将数据无损还原;GPU压缩算法模块根据振动数据的交变特性从而省去符号位,再根据采集器的分辨率和归一化记录方式进行大比例压缩数据;压缩的计算过程中将数据以图像RGBA的形式上传到显卡,利用OpenGL渲染的手段进行压缩计算,然后再将得到的图像传回本地内存,打包到数据结构中完成压缩;GPU解压缩算法将压缩数据包中记录的值根据压缩算法的逻辑对数据先进行模量还原,再进行符号还原。本发明能够使数据传输带宽提高一倍以上,从而降低数据传输过程出故障的几率。

著录项

说明书

技术领域

本发明涉及一种通过GPU加速的提高可靠性测试中振动数据传输带宽的方法,属于数据压缩算法、OpenGL图像渲染和数据传输技术领域。

背景技术

可靠性试验是可靠性工作的一个重要环节,在可靠性试验中有很重要的一部分就是振动测试。目前在振动测试实践中采集振动数据使用的数据为64位双精度浮点型数据,单个数据占内存8Bytes。通常一台采集器的传感器个数是64个,采样频率是5120HZ,那么单个传感器在1秒内产生的数据就达到40.96KB,所以单个采集器1秒的数据量要达到2.62MB,也就是说要求网络传输速度必须稳定地达到2.62M/s,即20.971Mbit/s。若单论速度,那么百兆网卡便可以轻松应对,然而在振动测试的实践中,都需要7*24小时长时间不间断工作,网卡负担越重越容易出现不稳定的情况,继而越容易导致数据积压或者传输中断导致测试失败;那么提高数据传输带宽就显得尤为重要。

目前用来提高带宽的方法主要有以下两种:一是提高硬件设施,例如用千兆网卡、千兆路由器等千兆级设备替换普通的百兆级设备;二是采用通用压缩算法压缩数据,使得保持传输数据速度不变的情况下能够传输更多数据。但是第一类方法成本高,因为替换设备需经历设备采购、旧设备拆卸、新设备安装和调试等步骤,大大地增加了时间、财力、人力成本;而第二类方法在压缩数据的过程中采用通用数据压缩方法,并没有抓住振动数据的特征,只是简单的数据复用,这样会导致遇到大量数据互不相等的情况下,很难进行有效压缩,因此通用算法压缩振动数据时压缩比不稳定;还有通用压缩算法占用CPU资源,增加CPU负担,这对于一个长时间高负荷工作的采集计算机来说是一个很大的挑战。

可靠性试验的成本高、耗时长,在传输过程中的任何故障都会导致整个试验过程的失败;现有技术在传输振动数据时需要的带宽较高,在长时间不间断工作时产生故障的几率会比较大。

发明内容

有鉴于此,本发明提供了一种基于GPU加速的提高振动数据传输带宽方法,该方法能够使数据传输带宽提高一倍以上,从而降低数据传输过程出故障的几率,同时减少由压缩算法增加的CPU负担,进一步保证可靠性试验的成功进行。

一种基于GPU加速的提高振动数据传输带宽方法,该方法采用GPU压缩算法模块将数据体积进行压缩,数据在传输之后使用GPU解压缩算法模块将数据无损还原;

所述GPU压缩算法模块根据振动数据的交变特性从而省去符号位,再根据采集器的分辨率和归一化记录方式进行大比例压缩数据;压缩的计算过程中将数据以图像RGBA的形式上传到显卡,利用OpenGL渲染的手段进行压缩计算,然后再将得到的图像传回本地内存,打包到数据结构中完成压缩;所述GPU解压缩算法是将压缩数据包中记录的值根据压缩算法的逻辑对数据先进行模量还原,再根据振动数据交变特性进行符号还原。

进一步地,所述GPU压缩算法模块实现的步骤包括:

第一步:写入用于识别数据包的起始位置包头信息(0x0A 0x55);

第二步:写入灵敏度,0x01表示16bit,0x02表示32bit;

第三步:写入首值符号,取源数据的第一个数的符号位直接写入;0x00表示‘+’,0x01表示‘-’;

第四步:写入绝对值的最大值,遍历源数据的绝对值计算出最大值以8字节Double类型写入,用|A|

第五步:写入数据量;遍历源数据,统计出源数据的个数N并写入;

第六步:GPU渲染准备;

第七步:GPU渲染完成后将数据写入数据结构中。

进一步地,所述第六步中GPU渲染准备的过程包括

①创建OpenGL渲染上下文,用来表示当前渲染所运行的环境;

②创建顶点,选用4个顶点用来创建两个三角形最终组成一个正方形;

③创建帧缓存,创建完成后设置该帧缓存为OpenGL渲染上下文的目标帧缓存;

④创建纹理对象,使用OpenGL创建纹理对象的函数创建,设置纹理的采样模式为近邻采样,重复模式可以取默认重复模式,然后绑定到对应的纹理单元GL_TEXTUREi上,其中i的取值0,1,……,31;

⑤创建顶点着色器和片元着色器对象,使用OpenGL对应的函数进行创建,并将着色器绑定到当前上下文。

进一步地,所述第七步中GPU渲染的过程包括

①将原始数据通过拷贝到图像中的像素而得到封装数据的图像,再调用OpenGL上传纹理数据的函数将图像上传到创建的对应纹理单元中,上传格式选择GL_RGBA32F_ARB;

②在片元着色器中,对输入的第i张纹理进行采样,得到像素值R,G,B和A四个值,再对这四个值进行计算,分别代入n=|D|/|A|

③使用OpenGL函数编译片元着色器开始渲染;渲染完成后得到的结果数据就在帧缓存的附件中,再使用OpenGL的下载数据的函数,将数据从显存拷贝到本地内存;

④改变i的值,将渲染、下载数据共进行32次;

⑤将得到的数据依次解出,写入数据结构中。

进一步地,所述GPU解压缩算法模块实现的步骤包括:

第一步:取两个字节,判断其是否为包头信息(0x0A 0x55),如果判断通过则表示DM是解压缩算法模块的数据包,可以进行解析,否则DM不是解压缩算法模块的数据包,不予解析;

第二步:取一字节,解析为8bit的short类型,设为sensi,则可得每个数据的长度是s=sensi*16;

第三步:取一字节,解析为8bit的short类型,设为sn,根据sn的值确定首位符号sign,当sn=0x00时sign=1,当sn=0x01时,sign=-1;

第四步:取八字节,解析为64bit的double类型,设为|A|

第五步:取八字节,解析为64bit的long long类型,设为N;

第六步:取s个bit,按照无符号的整型的方式解析,设为ds0;根据压缩算法的方式推算得出D0=sign*|A|

第七步:取s个bit,仍然按照无符号的整型方式解析,设为ds1;根据压缩算法的方式解出|D1|=|A|

其中,再求符号的过程包括:

第a)步,求出该点处的左导数Dleft

第b)步,当Dleft

第c)步,求出D1=sign*|D1|。

有益效果:

1、本发明根据采集器灵敏度实现了数据无损压缩,压缩算法的压缩率与采集卡灵敏度有关,对于确定的灵敏度则会有确定的压缩率,与数据本身无关,因此压缩率稳定。

2、本发明根据振动数据连续交变的特点进行特定数据解压缩,压缩算法专门针对振动数据进行的计算,与数据本身无关,压缩完毕后可以再进行通用压缩算法进行压缩,从而得到更高的压缩率。

3、本发明在压缩和解压运算时利用了GPU大规模并行计算的特点,提高了运算速度的同时还降低了采集器CPU负担。

附图说明

图1是设备振动数据图;

图2是本发明的硬件组成原理图;

图3是压缩算法的数据结构图;

图4是振动函数图像的符号交变位置示意图;

图5是数据转图像的操作过程示意图;

图6是GPU处理振动数据过程示意图;

图7是帧缓存的数据转为数据序列示意图。

具体实施方式

下面结合附图并举实施例,对本发明进行详细描述。

本发明提供了一种基于GPU加速的提高振动数据传输带宽方法,该方法针对的对象是如图1所示的振动数据,图1是一段加速度在x方向的分量关于时间的函数图像;图像清晰的揭示了在振动测试中振动加速度在任意方向的分量与时间的关系具有正负交变的特性。

图4是振动函数图像的符号交变位置示意图;左边是加速度某方向分量关于时间t的函数图像,用来比拟振动试验中振动数据与时间的关系,其中用黑色圆点标示了正负交替点和负正交替点;右图为左图加取模运算之后的对应图像,用来比拟振动数据被压缩之后的图像,图中的小黑圆点与左图的小黑圆点对应。从图中可以看出压缩后的数据左导数小于等于0,且右导数大于等于0时即为原函数正负或负正交替点。

如附图2所示,该方法采用的硬件包括传感器、采集器、网络接口、显卡和上位机;采集器包括采集卡、缓存、CPU、显卡和GPU压缩算法模块;上位机包括数据库和GPU解压缩算法模块;图中的传感器是振动试验中测量振动加速度的传感器,它可以根据自身的振动回传电压值给采集卡,采集卡被安装在采集器上;采集器将采集卡的中的数据用GPU压缩算法模块进行打包然后通过网口发送到上位机。上位机接收到数据包后,用所述解压缩算法进行数据还原,然后上传到数据库。

GPU压缩算法模块实现的步骤包括:

第一步:写入用于识别数据包的起始位置包头信息(0x0A 0x55);

第二步:写入灵敏度,0x01表示16bit,0x02表示32bit;

第三步:写入首值符号,取源数据的第一个数的符号位直接写入;0x00表示‘+’,0x01表示‘-’;

第四步:写入绝对值的最大值,遍历源数据的绝对值计算出最大值以8字节Double类型写入,用|A|

第五步:写入数据量;遍历源数据,统计出源数据的个数N并写入;这里建议使用固定数据量:32*1024*1024*4=128M的整倍数;这是因为OpenGL标准要求的最低纹理分辨率为1024*1024,纹理的最大数量是32张,每一个像素容纳的值最多是4个值;这样可以兼容所有显卡。

第六步:GPU渲染准备,①创建OpenGL渲染上下文,用来表示当前渲染所运行的环境,是OpenGL渲染必要的一步。②创建顶点,选用4个顶点分别是左上顶点(-1.0,1.0,0.0),右上顶点(1.0,1.0,0.0),右下顶点(1.0,-1.0,0.0),左下顶点(-1.0,-1.0,0.0),这四个顶点用来创建两个三角形(OpenGL的基本图形)最终组成一个正方形。③创建帧缓存,使用OpenGL创建帧缓存的函数便可以创建(OpenGL规定完整的帧缓存必须包含纹理附件,这里设置这个纹理的数据格式为GL_RGBA32F_ARB)。创建完成后设置该帧缓存为OpenGL渲染上下文的目标帧缓存,这样做是为了将输出的图像转到这块缓存中。(为了兼容所有的显卡,选用1024*1024尺寸的帧缓存,根据显卡的性能也可以选用更大尺寸的)④创建纹理对象,使用OpenGL创建纹理对象的函数创建,设置纹理的采样模式为近邻采样,重复模式可以取默认重复模式,然后绑定到对应的纹理单元GL_TEXTUREi(其中i的取值0,1,……,31)上。⑤创建顶点着色器和片元着色器对象,使用OpenGL对应的函数进行创建,并将着色器绑定到当前上下文。

优选使用OpenGL3.0以上版本;GPU处理的代码都是以字符串的形式放入程序中,然后使用OpenGL函数进行编译,编译后对应绑定到顶点着色器和片元着色器中,最后才能在渲染中使用;纹理设置近邻模式是因为采样的时候需要它采样图像中的原始值,如若选用其他采样模式,系统会在采样时自动插值,导致数据不准确;纹理选用重复模式时可以选用默认重复模式,是因为本发明使用的图像和帧缓存分辨率相同,因此纹理不需要重复就可以完全覆盖目标图形;设置帧缓存的格式为GL_RGBA32F_ARB,是因为默认的格式是每个数据都为uchar型,这儿要处理浮点型,因此要改为GL_RGBA32F_ARB。

第七步:GPU渲染(本步中本发明要进行32次渲染,渲染索引用i表示),本步的渲染管线控制部分的代码主要写到片元着色器代码中。①如图5一样,将原始数据通过拷贝到图像中的像素而得到封装数据的图像,再调用OpenGL上传纹理数据的函数将图像上传到第六步中创建的对应纹理单元中,上传格式选择GL_RGBA32F_ARB。②在片元着色器中,对输入的第i张纹理进行采样,得到像素值R,G,B和A四个值。再对这四个值进行计算,分别代入n=|D|/|A|

其中,图5是数据转图像的操作过程;先将4个数据拷贝到一个像素的红、绿、蓝和不透明度四个值中,再将这个像素拷贝到图像的第一个像素中;按照此法依次将所有数据拷贝到图像中,就形成了封装数据的图像。这里的图像数据格式选择OpenGL标准的GL_RGBA32F格式(Opengl允许的最高精确的浮点型)。

图6是GPU处理振动数据的过程;首先将封装数据的图像作为纹理上传到显卡,存入OpenGL中的GL_TEXTUREi所对应的纹理存储区;然后建立帧缓存(Framebuffer Object)和着色器载入纹理;最后设置此帧缓为当前输出目标,为由GPU通过OpenGL规定的渲染管线执行着色器代码对纹理数据进行采样计算。当渲染结束后,我们就得到了显卡中数据,再使用OpenGL提供的读取缓存的函数将数据下载到本地内存。

图7是将帧缓存的数据转为数据序列;首先将数据从显卡下载到本地内存后,数据格式为RGBA图像数据格式,然后将这些像素数据依次放入数据序列即得到从帧缓存转化为数据序列。

片元着色器是控制渲染流水线的重要对象,这其中的代码逻辑,将被分配到GPU阵列中的每一个GPU单元中去;渲染工作一旦开始,所有的GPU单元就同时开始工作,各自取采样各自对应坐标的像素值进行计算。GPU也就是这样提高运算速度的。

假设变量即为终止,从网络接口读入的数据包为DM;解析后的第一个数为D0,第二个数为D1,……Dn;解析后的每个数的左导数为Dleft

GPU解压缩算法模块实现的步骤包括:

第一步:取两个字节,判断其是否为包头信息(0x0A 0x55),如果判断通过则表示DM是解压缩算法模块的数据包,可以进行解析,否则DM不是解压缩算法模块的数据包,不予解析;

第二步:取一字节,解析为8bit的short类型,设为sensi,则可得每个数据的长度是s=sensi*16;

第三步:取一字节,解析为8bit的short类型,设为sn,根据sn的值确定首位符号sign,当sn=0x00时sign=1,当sn=0x01时,sign=-1;

第四步:取八字节,解析为64bit的double类型,设为|A|

第五步:取八字节,解析为64bit的long long类型,设为N;

第六步:取s个bit,按照无符号的整型的方式解析,设为ds0;根据压缩算法的方式推算得出D0=sign*|A|

第七步:取s个bit,仍然按照无符号的整型方式解析,设为ds1;根据压缩算法的方式解出|D1|=|A|

其中,再求符号的过程包括:

第a)步,求出该点处的左导数Dleft

第b)步,当Dleft

第c)步,求出D1=sign*|D1|。

在实际的物体和工程结构中,其质量和弹性是连续分布的,系统有3个自由度,在工程测试分析中通常可以简化为多自由度振动系统。根据牛顿第二定律可以得出具有6个自由度的无阻尼系统的自由振动的微分方程具有以下形式:

其中:M为系统的质量矩阵,K为刚度矩阵,x为位移矢量,

从通解可以看出位移矢量是多个正弦函数的叠加。x(t)是连续可导函数,并且它的二阶导数与x(t)有相同的形式。从形式上看该振动的加速度-时间的函数是连续可导的,也就是说振动传感器的信号源是关于时间的连续可导函数。根据连续函数的性质可知:该函数具有对于每个点左导数都与有倒数相等。

在压缩算法结束时,函数x(t)被压缩算法模块处理后变成了|x(t)|,但是函数|x(t)|并不是连续函数,那么在不连续的点处即为符号交变的位置;考虑到实际的值为皆为离散值,在x(t)中函数上的每一点的左导数和右导数也不能严格相等,他们的差距取决于采样的密集程度;但是在采样频率足够高的情况下,|x(t)|的左导数<0则表示该点的左边值是下降的,同时|x(t)|在该点处的右导数>=0则表明右侧是不变或者增长的,那么该点必然是不连续的,也就是说此点为原函数x(t)符号变化的点。

给定的每一组数据最终都会以图3所示的数据结构进行打包压缩。Head是对数据包的识别,只要与众不同就行;Sensitivity表示灵敏度,取值为0x01、0x02,对应灵敏度16bit、32bit;First Sign表示给定一组数据中的第一个值的符号,取值为0x00、0x01,分别对应‘+’、‘-’符号;Abs Max表示给定一组数据中模量最大值;数据总量表示给定的一组数据的数量;Data0、Data1……表示对给定一组数据的存储。

根据图3所示的压缩算法的数据结构可以看出,当采集卡灵敏度为16bit时,存放一个数据需要2Byte,比目前使用的8Byte的数据可以节省空间75%,对于大量数据进行压缩的情况下,数据结构中固定长度16bytes可以忽略,那么带宽可以提高300%。

综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号