48、利用数据和线程级并行性提升多媒体内核性能

利用数据和线程级并行性提升多媒体内核性能

1. 引言

多媒体标准,如JPEG、JPEG2000、MPEG - 2/4和H26x等,是广大用户常用的重要应用。这些应用具有可使用细粒度和粗粒度并行性、数据重组量大、循环小、内存带宽要求高以及数据类型小等特点。这些特性给通用处理器(GPPs)处理多媒体内核和应用带来了限制。

为了提高多媒体应用的性能,GPPs供应商扩展了其指令集架构(ISAs),引入了单指令多数据(SIMD)扩展,利用子字级并行性,通过一条指令处理多个数据。同时,所有处理器基本都具备多核,可利用线程级并行性并行处理多个线程。

本文旨在通过数据级和线程级并行性提升多媒体内核的性能。数据级并行基于AVX2 SIMD技术、内在编程模型(IPM)和编译器自动向量化(CAV),线程级并行基于OpenMP编程。评估基于英特尔第六代多核处理器,使用ICC、GCC和LLVM编译器。结果表明,多线程能提升性能,而结合SIMD指令和多线程能力,性能显著提高。不同编译器在处理每个内核时表现不同,例如ICC和GCC编译器比LLVM更能有效地向量化内核并使用专用指令。虽然IPM性能大多高于CAV,但它耗时且易出错,因此应更多关注开发和扩展编译器自动向量化的能力。

2. SIMD技术

现代架构采用多种并行执行单元,如多核CPU执行多线程,SIMD单元通过单条指令同时处理多个数据。

SIMD技术与单指令单数据(SISD)相对,在其发展初期,多媒体扩展(MMX)技术是加速多媒体和通信应用的有力策略,可对8位、16位、32位和64位整数数据类型进行SIMD计算,数据存储在64位寄存器中。之后,流式SIMD扩展(SSE)及其系列将寄存器宽度扩展到128位,可处理固定和浮点数据。最终,高级矢量扩展(AVX)和AVX2将矢量寄存器扩展到256位,AVX - 512技术将其扩展到512位,相比旧的SIMD扩展,能处理更多数据。

为利用SIMD ISAs的能力,提出了多种SIMD编程模型,包括显式的内在编程模型(IPM)和隐式的编译器自动向量化(CAV)。IPM作为使用处理器上可用SIMD技术的主要参考,程序员负责算法向量化并使用合适的SIMD指令和函数,这可能繁琐且易出错,本文使用x86intrin库进行显式SIMD编程。而CAV中,编译器将高级语言代码转换为并行机器代码,由于不同处理器代码和指令延迟不同,不同编译器生成的机器代码性能差异较大,因此编译器对性能至关重要,其中循环优化尤为关键。

3. 多媒体内核

计算机和互联网应用大量使用多媒体概念,多媒体标准给硬件架构和软件算法带来实时执行多媒体处理任务的挑战。以下是一些常见的多媒体内核:
| 多媒体内核 | 应用 | 循环次数 |
| — | — | — |
| 矩阵操作 | 图像、视频和音频处理,3D渲染,计算机图形 | 2 - 3 |
| FIR滤波器 | 图像、视频和音频的不同类型滤波器,数字信号处理中的模式识别 | 2 - 3 |
| 运动估计 | 视频压缩标准,如MPEG和HEVC | 5 |

  • 矩阵操作 :包括矩阵加法、转置和乘法。矩阵加法是将对应元素相加并存储结果;矩阵转置是将元素索引互换,由于数据按行存储在内存中,小矩阵转置比大矩阵快,因为大矩阵缓存未命中的可能性更高;矩阵乘法计算量大且耗时,有多种算法,如矩阵乘法结合另一个矩阵转置算法,可改善内存访问。
  • FIR滤波器 :是多媒体处理领域(包括语音、图像、视频和模式识别)的重要算法,基于卷积概念,将系数与输出值相乘并求和存储在输出元素中。
  • 运动估计 :是视频处理的主要概念,可用于视频压缩、视频配准等。常用方法是比较前一帧和当前帧的块,估计最佳运动向量。最常用的解决方案是绝对差值和(SAD)和平方差值和(SSD),但计算量大且耗时。计算公式如下:
    [SAD(d_1, d_2) = \sum_{i = 0}^{n_1}\sum_{j = 0}^{n_2}|d_1[i, j] - d_2[i, j]|]
    [SSD(d_1, d_2) = \sum_{i = 0}^{n_1}\sum_{j = 0}^{n_2}(d_1[i, j] - d_2[i, j])^2]
4. 性能评估
4.1 环境设置

所有提到的内核在英特尔多核处理器上使用OpenMP、IPM和CAV方法,通过ICC、GCC和LLVM编译器实现。评估环境规格如下表所示:
| 项目 | 详情 |
| — | — |
| CPU | Intel Corei7 - 6700HQ |
| 寄存器宽度 | 最大256位 |
| 缓存行大小 | 64字节 |
| L1数据缓存 | 32 KB,8路组相联,最快延迟:4周期,2x32B加载 + 1x32B存储 |
| L2缓存 | 256 KB,4路组相联,最快延迟:12周期 |
| L3缓存 | 每核心最多2 MB,最多16路,最快延迟:44周期 |
| 操作系统 | Fedora 27,64位 |
| 编译器 | ICC 18.0.1、GCC 7.2.1和LLVM 5.0.1,-O3优化级别 |
| 编程工具 | 标准C、OpenMP和x86 Intrinsics(x86intrin.h) |
| 评估基准编译器 | icc -O3 -xHOST -no - vec |
| 周期计数 | _rdtsc(); |
| 禁用向量化 | icc -O3 -xHOST -no - vec
gcc -O3 -march = native -fno - tree - vectorize -fno - tree - slp - vectorize
clang -O3 -march = native -fno - vectorize -fno - slp - vectorize |

为提升性能,每个算法多次执行并记录最小脉冲值进行评估。将并行模式与ICC编译器的标量模式进行比较,因为ICC编译器在标量模式下性能较好。

使用的缩写如下表:
| 缩写 | 含义 |
| — | — |
| OMP - MLT | 使用OpenMP无向量化的多线程执行 |
| IPM - MLT | 结合多线程和IPM,使用AVX2 SIMD指令的显式向量化 |
| CAV - MLT | 结合多线程和CAV,使用AVX2 SIMD指令的隐式向量化 |
| ADD和ADD - float | ADD是32位整数矩阵加法实现,ADD - float是浮点矩阵加法实现 |
| TRA和TRA - float | TRA是32位整数矩阵转置程序实现,TRA - float是浮点矩阵转置程序实现 |
| MUL和MUL - float | MUL是转置矩阵中32位整数矩阵乘法程序实现,MUL - float是浮点矩阵乘法程序实现 |
| FIR | 基于32位整数数组的FIR滤波器程序实现 |
| SAD | 基于8位整数矩阵的SAD内核实现 |
| SSD | 基于16位整数矩阵的SSD内核实现 |

4.2 评估实现结果

下表展示了使用OpenMP无向量化以及结合OpenMP与向量化(IPM或CAV),采用AVX和AVX2技术对一些多媒体内核在多核处理器上针对两种图像大小(512×512和1024×1024)相对于标量实现的加速比。
| 内核 | 实现方式 | 512×512 | | | 1024×1024 | | |
| — | — | — | — | — | — | — | — |
| | | ICC | GCC | LLVM | ICC | GCC | LLVM |
| ADD | OMP - MLT | 3.42 | 3.54 | 0.97 | 1.22 | 1.21 | 1.10 |
| | IPM - MLT | 6.77 | 6.66 | 2.04 | 1.15 | 1.15 | 1.29 |
| | CAV - MLT | 6.59 | 6.84 | 1.99 | 1.16 | 1.18 | 1.29 |
| ADD - float | OMP - MLT | 3.38 | 2.86 | 0.96 | 1.31 | 1.32 | 1.13 |
| | IPM - MLT | 7.25 | 7.31 | 2.21 | 1.26 | 1.27 | 1.43 |
| | CAV - MLT | 7.16 | 7.39 | 2.13 | 1.26 | 1.26 | 1.42 |
| TRA | OMP - MLT | 1.80 | 1.80 | 0.46 | 2.42 | 2.47 | 0.74 |
| | IPM - MLT | 3.88 | 4.21 | 3.54 | 6.02 | 6.03 | 3.7 |
| | CAV - MLT | 1.79 | 1.8 | 0.45 | 2.46 | 2.47 | 0.74 |
| TRA - float | OMP - MLT | 1.76 | 1.76 | 0.44 | 2.53 | 2.54 | 0.80 |
| | IPM - MLT | 3.87 | 3.22 | 3.46 | 6.26 | 5.42 | 3.74 |
| | CAV - MLT | 1.75 | 1.75 | 0.44 | 2.53 | 2.56 | 0.78 |
| MUL | OMP - MLT | 2.67 | 2.17 | 0.88 | 2.59 | 1.88 | 0.86 |
| | IPM - MLT | 8.14 | 10.11 | 3.68 | 11.65 | 11.94 | 3.33 |
| | CAV - MLT | 13.24 | 13.51 | 3.36 | 13.86 | 12.53 | 3.34 |
| MUL - float | OMP - MLT | 2.47 | 1.88 | 0.28 | 2.42 | 1.83 | 0.27 |
| | IPM - MLT | 9.21 | 10.18 | 2.84 | 12.04 | 12.22 | 2.56 |
| | CAV - MLT | 15.44 | 14.48 | 3.84 | 15.67 | 12.88 | 3.73 |
| FIR | OMP - MLT | 3.53 | 3.58 | 1.02 | 3.53 | 3.59 | 1.02 |
| | IPM - MLT | 21.6 | 21.9 | 6.49 | 8.24 | 8.35 | 5.7 |
| | CAV - MLT | 3.52 | 16.66 | 1.01 | 3.53 | 7.98 | 1.01 |
| SAD | OMP - MLT | 3.43 | 3.43 | 1.21 | 3.50 | 3.50 | 1.23 |
| | IPM - MLT | 71.63 | 76.4 | 22.44 | 65.86 | 66.48 | 19.38 |
| | CAV - MLT | 71.05 | 73.06 | 9.59 | 64.43 | 67.13 | 9.58 |
| SSD | OMP - MLT | 2.94 | 2.59 | 1.05 | 3.01 | 2.65 | 1.05 |
| | IPM - MLT | 25.59 | 26.09 | 7.05 | 20.74 | 21.17 | 6.63 |
| | CAV - MLT | 12.33 | 11.96 | 4.17 | 13.16 | 13.3 | 4.14 |

从表中可以看出:
- 每个实现内核的第一行显示了无向量化的OMP - MLT多线程性能与标量实现的比较。由于有四个核心,不同内核和不同图像大小的最大多线程性能约为3.59,ICC和GCC编译器的性能优于LLVM编译器。对于计算量较大的内核(如乘法、SAD和SSD),小矩阵和大矩阵的性能差异不大;而对于内存依赖较大、计算量较小的内核(如ADD),小矩阵的性能优于大矩阵。多线程能力的使用取决于核心数量、算法和内存访问方式,数据类型对性能的影响较小。由于线程管理成本,多线程模式下的性能提升小于理论的4倍。并且,虽然处理器支持超线程技术,但由于这些内核相互独立,该技术对性能影响不大。
- 结合多线程和SIMD技术可以在线程和数据两个层面实现并行化。表中每个内核实现的第二行和第三行显示了多线程与IPM - MLT和CAV - MLT的SIMD技术结合相对于标量实现的效率。结果表明,这两种并行性的结合可使效率提高约76。使用IPM的多线程和SIMD技术组合的性能提升通常大于使用CAV编程的组合,但IPM编程耗时、繁琐且易出错。而在CAV - MLT中,编译器负责向量化,在许多内核中向量化效果良好。例如,在SAD内核中,使用ICC和GCC编译器进行自动向量化可获得更高性能,因为使用了SIMD技术中的专用SAD指令,性能提升约76,而无SIMD技术的多线程性能提升约为3.5。

不同编译器在处理向量化时表现不同:
- ICC能对所有内核进行向量化,但对TRA和FIR内核的向量化效率不高。
- GCC无法对TRA内核进行向量化,而是对标量代码进行多线程处理。
- LLVM无法有效利用OpenMP的多线程能力,大多数实现的性能提升通过自动向量化实现。

平台有四个核心,每个核心内部有各种SIMD单元。理论上,多线程应实现4倍加速,AVX2和32位整数的向量化加速应为8倍(256/32),但实际性能提升与理论值不同,原因如下:
1. 内存指令的延迟大于计算指令,无论是标量还是向量化实现,大部分时间都用于将数据加载到L1数据缓存,向量元素从L1D缓存加载的延迟比标量元素大。
2. 线程管理需要时间,包括创建、管理和销毁线程。
3. 平台上的标量算术逻辑单元(ALU)比执行SIMD指令的SIMD ALU多。
4. 处理器前端是SIMD指令的瓶颈,前端每个周期只能提供4个微操作(µops),而大多数SIMD指令的微操作数多于1个,因此标量实现能更有效地利用指令级并行性(ILP)。

5. 结论

本文旨在在具有多核和SIMD技术的通用处理器上提取一些多媒体内核的线程级和数据级并行性。每个核心既能处理线程,又能通过单条指令处理多个数据,从而实现线程和数据级并行。使用多线程编程模型OpenMP,以及SIMD的显式向量化内在编程模型(IPM)和隐式向量化的编译器自动向量化(CAV),通过ICC、GCC和LLVM编译器来提高多媒体内核的性能。

实验结果表明,结合线程级和数据级并行性可显著提高性能。不同编译器在处理内核向量化时表现不同,ICC和GCC在许多情况下比LLVM更有效。虽然IPM性能通常高于CAV,但由于其编程难度大,应更多关注开发和扩展编译器自动向量化的能力。

综上所述,通过合理利用多核处理器的线程级并行性和SIMD技术的数据级并行性,并选择合适的编译器和编程模型,可以有效提升多媒体内核的性能。

【永磁同步电机】基于模型预测控制MPC的永磁同步电机非线性终端滑模控制仿真研究(Simulink&Matlab代码实现)内容概要:本文围绕永磁同步电机(PMSM)的高性能控制展开,提出了一种结合模型预测控制(MPC)与非线性终端滑模控制(NTSMC)的先进控制策略,并通过Simulink与Matlab进行系统建模与仿真验证。该方法旨在克服传统控制中动态响应慢、鲁棒性不足等问题,利用MPC的多步预测滚动优化能力,结合NTSMC的强鲁棒性有限时间收敛特性,实现对电机转速电流的高精度、快速响应控制。文中详细阐述了系统数学模型构建、控制器设计流程、参数整定方法及仿真结果分析,展示了该复合控制策略在抗干扰能力动态性能方面的优越性。; 适合人群:具备自动控制理论、电机控制基础知识及一定Matlab/Simulink仿真能力的电气工程、自动化等相关专业的研究生、科研人员及从事电机驱动系统开发的工程师。; 使用场景及目标:①用于深入理解模型预测控制与滑模控制在电机系统中的融合应用;②为永磁同步电机高性能控制系统的仿真研究与实际设计提供可复现的技术方案与代码参考;③支撑科研论文复现、课题研究或工程项目前期验证。; 阅读建议:建议读者结合提供的Simulink模型与Matlab代码,逐步调试仿真环境,重点分析控制器设计逻辑与参数敏感性,同时可尝试在此基础上引入外部扰动或参数变化以进一步验证控制鲁棒性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值