一种分布式数据向量化处理方法和装置的制造方法_2

文档序号:8512463阅读:来源:国知局
如反序列化,需要将网络传输的字符串数据流转换为实际运算所需要的各个对象。在各个对象被生成后,再调用函数进行函数计算或者结合若干函数进行表达式计算等。
[0034]在本申请方案中,对于反序列化采用如下操作步骤:
[0035]步骤Al、创建缓存以存储多行的数据对应的字节数组(Bytes Array),例如512行数据;
[0036]步骤A2、将该类按行存储的数据进行编解码生成按列存储的列值数组,列值数组里的每个元素对应一行记录生成的列值;
[0037]步骤A2、生成 Java Objects (对象)。
[0038]由于JVM的函数调用开销是固定的,多行数据的处理开销仍然是毫秒级,因此平均分配到每条记录的开销就是纳秒级。因此对每行记录的序列化、反序列化时间就从毫秒级降到了十或百纳秒级。
[0039]在本申请方案中,对于列值计算采用如下操作步骤:
[0040]步骤B1、判断当前数据是否为向量化数据,如果不是则添加一个多行数据缓冲(buffer)来保存多行数据;
[0041]步骤B2、通过代码生成器来生成CPU向量化指令,并将基于行的字节数组转换为基于列的字节数组;
[0042]步骤B3、按照基于列的字节数组调用向量化的函数来生成Java Object数组。
[0043]由于整个过程都可以向量化,列值计算的延时能够极大的降低,而函数调用的固定开销对多行记录只调用一次,因此平均到每条记录以后开销就降到十纳秒级别。
[0044]在本申请方案中,对于表达式求值采用如下操作步骤:
[0045]步骤Cl、工作线程对该列的512个数组全部做类型转换,可以通过CPU的SSE指令来完成,延时只有纳秒级;
[0046]步骤C2、通过函数调用固定的毫秒级延时找到执行代码入口,在计算逻辑中完成对数组中数据的计算;
[0047]步骤C3、批量的做输出类型的转换,同样可以利用CPU的SSE指令集来向量化。
[0048]由于多组数据分摊了函数调用开销,每条记录的平均延时就降到十纳秒级,并且由于SSE指令的使用,计算延时能够降低一个数量级,因此每条记录的平均计算延时降到十纳秒级别。
[0049]进一步,所述向量化处理模块103包括:
[0050]变量抽取子模块1031,用于从原函数中抽取输入变量、临时变量和全局变量;
[0051]输入变量子模块1032,用于将基于单个字节的所述输入变量转换为基于字节数组的向量化输入变量;
[0052]临时变量子模块1033,用于保持所述临时变量不变;
[0053]全局变量子模块1034,用于保持所述全局变量不变。
[0054]在此,对于现有的普通标量代码指令,都包含以下任意至少一项:输入变量、临时变量、全局变量、常数。首先通过变量抽取子模块1031从原函数中识别并抽取各个输入变量、临时变量或全局变量,然后进行代码转换。对于临时变量、全局变量和常数,均保持不变。而对于输入变量将其转换于代码指令的循环体内,从而将普通标量代码指令转换为向量化代码指令。
[0055]进一步,所述装置还包括:
[0056]优化模块205,用于按照预设条件对所述代码指令进行优化。
[0057]其中,所述优化模块405包括:展开子模块2051和合并子模块2052。
[0058]展开子模块2051,用于对所述代码指令进行循环展开处理以减少调用指针的次数;合并子模块2052,用于对所述代码指令进行合并处理。
[0059]在此,对于已经转换的向量化代码指令,可以根据预设规则进一步进行优化。例如,对于循环体:
[0060]For(i = 0 ;i<100 ;i++)
[0061]{
[0062]Sum = a[i]+b[i]
[0063]}
[0064]该循环体需要循环100次,每次都需要进行I次函数调用,因此共需要调用100次指令以完成计算。因此可以对该循环体进行展开,每10组数据的进行I次循环,以减少函数调用次数,虽然代码更为复杂,但是仅需要10次函数调用,代码指令的执行时间缩短了。然后进行合并处理以进一步减少函数调用次数。
[0065]图3示出本发明实施例三的分布式数据向量化处理方法的流程示意图,如图3所示,本发明实施例三的分布式数据向量化处理方法包括:
[0066]步骤S301,建立多行数据缓存以存储多行基于行的字节数组;
[0067]步骤S302,将基于行的字节数组转换为基于列的字节数组;
[0068]步骤S303,对代码指令进行向量化处理;
[0069]步骤S304,以所述向量化处理后的代码指令对所述基于列的字节数组进行向量化计算。
[0070]在此,建立多行数据缓存以存储多行基于行的字节数组,缓存可以采用CPUcache(高速缓存),从而节省了从磁盘读取数据的时间。将基于行的字节数组转换为基于列的字节数组,改变了现有技术中对指令代码逐行执行的模式,将按行存放的数据结构转换为按列存放,然后对按列存放的数据批量进行读出、序列化、反序列化以及编解码操作,最后参与实际运算,以批量执行方式来减少函数调用开销,可以有效的利用磁盘带宽的利用率,并且能充分利用CPU cache的快速存储读取功能。对代码指令进行向量化处理。向量化处理是指对原计算代码自动进行二次编译,以生成可向量化执行的代码或指令。向量化处理后的代码指令能够应用在向量上而不是单个数据上。例如对于聚合算法,现有的普通标量代码指令只能基于单个数据进行各个数据的逐级累加聚合,每当单个数据发生变化时,都需要进行一次运算。而采用向量化代码指令可以一次应用在批量数据上,而不是逐个数据进行聚合,一次调用向量化代码指令,就可以对相同数据结构下的同类数据进行整体运算,从而减少了代码调用次数,也就相应减少了代码调用时间。最后以所述向量化处理后的代码指令对所述基于列的字节数组进行向量化计算,现有的CPU提供了单指令多数据的指令集以进行向量化计算,如x86的SSE指令集,最多可以在一条指令中对512bit的数据完成计算。相对于标量代码指令中的一条指令一次只能计算32bit的数据,向量化指令的性能提升能够高达8倍。本发明的技术方案,将函数操作的数据从单个数据变成数组,这样可以极大的减少函数调用的开销。另外由于一次操作批量数据,CPU cache能够被有效的利用起来,cache miss rat1 (高速缓存命中率)会有效的降低。从高级语言生成x86汇编时,由于操作的数据都是批量的,通过有效的组织数据并通过代码生成器生成向量化指令能够加速计算。
[0071]进一步,基于行的字节数组中,各行数据的数据结构为按照对象进行排列;
[0072]步骤S302中将基于行的字节数组转换为基于列的字节数组包括:
[0073]将按照对象排列的各行基于行的字节数组,转换为按照所述对象的属性排列的所述基于列的字节数组。
[0074]在此,基于行的字节数组中,各行数据的数据结构为按照各个对象进行分类排列;基于列的字节数组中,各行数据的数据结构为按照对象的各个属性进行分类排列,从而将同一数据结构下的同类数据按类存储,便于基于向量化指令进行批量运算。以结构化查询语言(SQL,Structured Query Language)为例进行更加详细的说明。在SQL分布式计算过程中,一般需进行序列化和反序列化、列与表达式计算、自定义函数计算等。例如反序列化,需要将网络传输的字符串数据流转换为实际运算所需要的各个对象。在各个对象被生成后,再调用函数进行函数计算或者结合若干函数进行表达式计算等。
[0075]在本申请方案中,对于反序列化采用如下操作步骤:
[0076]步骤Al、创建缓存以存储多行的数据对应的字节数组(Bytes Array),例如512行数据;
[0077]步骤A2、将该类按行存储的数据进行编解码生成按列存储的列值数组,列值数组里的每个元素对应一行记录生成的列值;
[0078]步骤A2、生成 Java Objects (对象)。
[0079]由于JVM的函数调用开销是固定的,多行数据的处理开销仍然是毫秒级,因此平均分配到每条记录的开销就是纳秒级。因此对每行记录的序列化、反序列化时间就从毫秒级降到了十或百纳秒级。
[0080]在本申请方案中,对于列值计算采用如下操作步骤:
[0081]步骤B1、判断当前数据是否为向量化数据,如果不是则添加一个多行数据缓冲(buffer)来保存多行数据;
[0082]步骤B2、通过代码生成器来生成CPU向量化指令,并将基于行的字节数组转换为基于列的字节数组;
[0083]步骤B3、按照基于列的字节数组调用向量化的函数来生成Java Object数组。
[0084]由于整个过程都可以向量化,列值计算的延时能够极大的降低,而函数调用的固定开销对多行记录只调用一次,因此平均到每条记录以后开销就降到十纳秒级别。
[0085]在本申请方案中,对于表达式求值采用如
当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1