主要内容

生成SIMD代码金宝app

您可以从某些Simulink生成单指令、多数据(SIMD)代码金宝app®块使用英特尔®SSE和,如果你有嵌入式编码器®,英特尔AVX技术。SIMD是一种用一条指令处理多个数据的计算范式。许多现代处理器都有SIMD指令,例如,一次执行多个加法或乘法。对于受支持块上的计算密集型操作,SIMD intrinsic可以显著提高在Intel平台金宝app上生成的代码的性能。

支持SIMD代码生成的块金宝app

当满足一定条件时,可以使用Intel SSE或Intel AVX技术生成SIMD码。该表列出了支持SIMD代码生成的块。金宝app该表还详细说明了支持可用的条件。金宝app

条件
添加
  • 对于AVX, SSE和FMA,输入信号的数据类型为

  • 对于AVX2, SSE4.1和SSE2,输入信号的数据类型为int8int16int32,或int64

  • AVX512F输入信号的数据类型为

减去
  • 对于AVX, SSE和FMA,输入信号的数据类型为

  • 对于AVX2, SSE4.1和SSE2,输入信号的数据类型为int8int16int32,或int64

  • AVX512F输入信号的数据类型为

元素和
  • 对于AVX, SSE和FMA,输入信号的数据类型为

  • 对于AVX2, SSE4.1和SSE2,输入信号的数据类型为int8int16int32,或int64

  • AVX512F输入信号的数据类型为

  • 优化减少配置参数设置为

产品
  • 对于AVX, SSE和FMA,输入信号的数据类型为

  • 对于AVX2, SSE4.1和SSE2,输入信号的数据类型为int16int32

  • AVX512F输入信号的数据类型为

  • 乘法参数Element-wise (. *)

元素乘积
  • 对于AVX, SSE和FMA,输入信号的数据类型为

  • 对于AVX2, SSE4.1和SSE2,输入信号的数据类型为int16int32

  • AVX512F输入信号的数据类型为

  • 乘法参数Element-wise (. *)

  • 设置优化减少配置参数为

获得
  • 对于AVX和SSE,输入信号的数据类型为

  • 对于AVX2, SSE4.1和SSE2,输入信号的数据类型为int16,或int32

  • 对于Intel AVX512F,输入信号的数据类型为

  • 乘法参数Element-wise (. *)

输入信号的数据类型为
√6 输入信号的数据类型为
装天花板
  • 对于AVX2, AVX, SSE4.1, SSE2, SSE,输入信号的数据类型为

  • 不支持AVX512F。金宝app

地板上
  • 对于AVX2, AVX, SSE4.1, SSE2, SSE,输入信号的数据类型为

  • 不支持AVX512F。金宝app

极大极小
  • 输入信号的数据类型为

  • 的值金宝app支持:非有限数配置参数设置为

元素最小最大值
  • 输入信号的数据类型为

  • 的值金宝app支持:非有限数配置参数设置为

  • 优化减少配置参数设置为

MATLAB函数 MATLAB代码满足本课题规定的条件:生成MATLAB函数的SIMD代码(嵌入式编码)
每个子系统
  • 每个子系统Block包含本表中列出的满足指定条件的块。

  • 的值分区维度参数的值必须大于环展开阈值配置参数。

按位运算符
  • 的值操作符块参数必须为,或XOR

  • 对于SSE2,输入信号的数据类型为int8int16int32,或int64

  • 对于AVX2和AVX512F,输入信号的数据类型为int8int16int32,或int64

移位运算
  • 输入信号的数据类型为int32

如果您有DSP系统工具箱™,您还可以从某些DSP系统工具箱块生成SIMD代码。有关更多信息,请参见金宝appDSP系统工具箱中的Simulink块支持SIMD代码生成金宝app(DSP系统工具箱)

如果你有ARM的嵌入式编码器支持包金宝app®皮质®——一个处理器,可以生成针对ARM Cortex A处理器优化的SIMD代码代码替换库(嵌入式编码)参数GCC ARM Cortex-A.您还需要设置设备供应商参数手臂兼容设备类型参数手臂Cortex-A

生成SIMD代码与普通C代码相比

对于本例,创建一个简单的模型simdDemo它有一个减去Block和a块。的减去块具有一个维度为240的输入信号和一个输入数据类型为.的块具有一个维数为140的输入信号和一个输入数据类型

金宝appSimulink模型包含减法块和除法块。

这个模型的C代码是:

void simdDemo_step(void) {int32_T i;For (i = 0;I < 240;i++) {simdDemo_Y。Out1[i] = simdDemo_U。In1[i] - simdDemo_U.In2[i];} for (i = 0;I < 140;i++) {simdDemo_Y。Out2[i] = simdDemo_U。In3[i] / simdDemo_U.In4[i]; } }
在普通(非simd) C代码中,每次循环迭代产生一个结果。

生成SIMD代码:

  1. 打开Simulin金宝appk Coder应用程序或嵌入式Coder应用程序。

  2. 点击设置>硬件实现

  3. 设置设备供应商参数英特尔AMD

  4. 设置设备类型参数Windows x86 - 64 (64)Linux x86 - 64 (64)

  5. 优化窗格,用于利用目标硬件指令集扩展参数,选择处理器支持的指令集扩展。金宝app例如,选择SSE2.如果你使用嵌入式编码器,你也可以从指令集中选择上交所SSE4.1AVXAVX2菲利普-马萨,AVX512F.有关更多信息,请参见https://www.intel.com/content/www/us/en/金宝appsupport/articles/000005779/processors.html

  6. 可选地选择优化减少参数生成简化操作的SIMD代码。

  7. 从模型生成代码。

void simdDemo_step(void) {int32_T i;For (i = 0;I <= 236;i += 4) {_mm_storeu_ps(&simdDemo_Y。着干活[我],_mm_sub_ps (_mm_loadu_ps (&simdDemo_U.In1[我]),_mm_loadu_ps (&simdDemo_U.In2[我])));} for (i = 0;I <= 138;i += 2) {_mm_storeu_pd(&simdDemo_Y。Out2[我],_mm_div_pd (_mm_loadu_pd (&simdDemo_U.In3[我]),_mm_loadu_pd (&simdDemo_U.In4[我])));}}

此代码用于SSE2指令集扩展。SIMD指令是以标识符开始的内在函数_mm.这些函数在循环的一次迭代中处理多个数据,因为循环对于单个数据类型增加4,对于双数据类型增加2。对于处理更多数据且计算量比这个模型更大的模型,SIMD指令的存在可以显著加快代码执行时间。

有关支持的Simulink块的Intel内部函数的列表,请参见金宝app金宝apphttps://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html

限制

如果出现以下情况,生成的代码不会通过SIMD进行优化:

  • 的代码MATLAB函数块在循环体之外包含标量数据类型。例如,如果a、b,c都是标量,所生成的代码是不是优化操作之类的c = a + b

  • 的代码MATLAB函数块包含间接索引的数组或矩阵。例如,如果A, B, C,D是矢量,生成的代码不是矢量化的操作,如D (A) = C (A) + B (A)

  • 可重用子系统中的块可能没有得到优化。

  • 如果代码在MATLAB函数块包含并行的for循环(parfor),parfor的循环体内的循环不是用SIMD代码优化的parfor循环可以优化SIMD代码。

  • Polyspace®不支持对包含SIM金宝appD指令的生成代码进行分析。方法禁用SIMD代码生成利用目标硬件指令集扩展参数没有一个

  • 在启用对非有限数的支持时,对浮点值进行操作的归约操作。金宝app若要为操作浮点值的约简操作生成SIMD代码,请设置配置参数金宝app支持:非有限数

相关的话题