SIMD简介

来源:互联网 发布:舵手医药软件 编辑:程序博客网 时间:2024/06/04 18:50

本文总结本人工作中所接触到的SIMD资料。

SIMD: single instruction multiply data, 单指令多数据。

根据本人的熟悉程度分别为:

1、NEON:ARM cortex-A 系列

2、MMX、SSE、AVX: PC机

3、GPU:opecl 框架下

4、CEVA:DSP


1、NEON

参考资料:

1> 《Using the GNU Compiler Collection》

2> 《RealView 编译工具--编译器用户指南》

3> 本人的其他博文

4> 开源项目 Ne10

最近,公司推出了64位架构的SOC,大家发现ARM 32位架构和64位架构 ARM汇编指令有些不兼容,代码不能重用。而在我们的几款软解解码器中,我们写了很多基于32位ARM cortex- A系列处理器的NEON汇编代码。但在64位架构上面临着重新修改的问题(大家应该知道汇编代码的可读性吧,看着都头大,别说修改了)。所以建议对性能要求不是特别苛刻的读者优先选择VEC-C来写代码,这些API是NOEN汇编的C接口。32位处理器和64位处理器都会兼容,参考资料1,2当中有详细的指令解释。

使用汇编写优化函数的运行效率通常比使用C接口的要快一些。典型的NEON加速效率大概是:汇编 5倍,C接口 3倍。通常来说,如果使用neon能使运算效率提高3倍,那么就已经是比较成功的优化了。

NEON优化的几个注意:

1>  如果是初学者,很有必要了解一下必要的硬件知识(尤其是使用汇编语言的读者)。

2> 多参数的输入和输出方式(ARM汇编的基本知识)。

3> 多线程调用时,需要注意保护寄存器(ARM汇编的基本知识)。

4> 乱序优化的思想(ARM汇编的基本知识)。

5> 选择可以向量计算的代码进行优化(提高工作效率)。


2、MMX、SSE and AVX

参考资料:

1> 《Using the GNU Compiler Collection》

2> http://www.cnblogs.com/zyl910/archive/2012/04/23/simd_var_name.html

3> http://www.cnblogs.com/zyl910/archive/2012/10/22/simdsumfloat.html

MMX、SSE、AVX都是常见的PC机优化指令集。他们的寄存器长度分别是64bit、128bit、256bit。从寄存器的长度上看,就会体会到他们之间一脉相承的关系了。它的使用方式跟NOEN很相似。相比NEON,他们的指令集更为丰富。


3、GPU并行运算

PC平台: cuda 和opencl

移动式平台:arm、Imagination

未来发展:AMD APU

GPU和CPU相比:

1> GPU的运算逻辑单元数量要比CPU多得多。PC平台的GPU通常高达几百个运算单元,移动平台现在的数量也高达十几个到几十个。而CPU的运算单元只有几个:例如双核,四核,八核处理器。

2> GPU的每个运算单元性能要比CPU差很多。GPU每个运算单元的性能低,比较适合做简单的运算,毕竟GPU的正事就是像素渲染,而渲染所面临的计算通常也就是加减乘除之类的,不适合运行分支语句。GPU内核函数中的分支语句会大幅度地降低GPU的运行速度。GPU多核心加速的条件是多个相同的运算任务可以并发执行。相比之下,CPU的运算单元的性能自然要强悍很多,毕竟人家是职业运算单元嘛。CPU的计算单元要复杂得多,那么大一颗CPU,就几个核,可见硬件设计有多复杂,想想便知道了。CPU的运算单元适合做复杂的运算处理。它的性能强悍主要是通过运行频率高,指令集丰富,流水线预取,还有高速缓存等方式来实现的。CPU和GPU在运算能力上是有区别的,GPU只是过来帮帮忙而已,不是特别专业的计算资源。

3> GPU加速的瓶颈:分支语句和内存访问。使用GPU加速是否能够达到预期的目标,主要是受到两个方面的影响。一个是执行运算的内容,也就是说是不是给它分配了适合它的工作。这一点在前面提到过了。另一个是内存访问:内存访问的数据量和访问次数都将影响GPU运算的速度。通常情况下GPU和CPU的内存是不能共享的。即:cpu分配了一块内存,这个内存数据是不能够直接被GPU访问的。需要使用API进行操作。目前很多力推GPU运算的芯片商已经在这方面进行了改进。其中,最终极的目标便是内存共享,这也就是AMD的新一代APU方案。

4> GPU运算开发难点:case by case。目前不同的GPU在计算能力上差别很大,编程方式上也有很多不同,面向用户的函数种类和性能也各不相同。虽然有opencl这种规范存在,但实际上差异挺大的。PC平台上, AMD和Nvida的GPU有着全面的性能和支持。移动平台上,arm的GPU在内存共享上有着独到的性能优势。而和Imagination 的GPU运算上的合作给我们带来了很多不愉快的回忆。


4、DSP并行运算--CEVA

CEVA公司是以色列的一家DSP公司。它夺取了TI在移动设备上(尤其是手机,平板电脑)的大部分市场。它不生成芯片,只做IP授权,类似ARM公司。

DSP相当于一个专用的计算资源。芯片公司可以在他们的SOC芯片中加入DSP作为计算平台。例如,市面上高中端的手机芯片大部分都使用了CEVA的DSP,主要用做图像处理、wifi和蓝牙。典型的是MM3101。目前最新的是MM-X4。它的命名方式有些不同罢了,实际上是MM3XXX系列的下一代。简单来讲,使用DSP计算在编程上有些类似GPU,毕竟它们都有着另外一套和CPU不兼容的指令嘛。通常需要其他的编译器对代码进行单独编译。然后在将编译出来的库链接到用户代码中。

DSP通常要比上述其他的SIMD方式来地复杂。从集成电路的角度看,它可以被当成一个广义上的辅助处理器或者协处理器。相对其他的SIMD方式,DSP的硬件逻辑要复杂得多, 因此它所支持的指令通常很多,同时,成本也会高很多。当然啦,如果选择了合适的DSP,其效果也是非常明显的。和以上几种SIMD的方式相比,DSP是性能/功耗比最高的方式。不过,它会增加芯片的成本。而其NOEN、MMX、SSE、AVX本身就做在CPU里面了,而且它们是非常通用的计算单元,所以不会增加成本。使用GPU也不会增加硬件成本,反正它还要干GPU的正活(显示,渲染等)。

CEVA DSP处理器中有两类处理器:标量处理器和矢量处理器。(相对GPU,该DSP还有较为强大的标量处理器, 因此它可以从容处理函数中的分支部分和不能并行运算的部分)。

以CEVA最新的DSP MM-X4为例,这是一颗重点面向图像处理的DSP。在一定范围内,它支持图像2D的随机访问。这一点一定会让很多人吃惊吧。为了加速图像随机访问的速度,MM-X4当中的一块内存添加了许多条地址线,于是可以做到对图像一行一行的读取,也可以一列一列的读取。此外,相对上一代,MM-X4还将标量内存和矢量内存进行了统一。这样做主要是为了降低用户编程的难度。

CEVA还以算法开发合作的模式来销售DSP。如果用户愿意将在CEVA DSP上开发出来的算法成果共享出来给CEVA,那么CEVA可以大幅降低授权费用。


0 0
原创粉丝点击