主要内容

生成SIMD代码从金宝app

您可以生成单指令多数据(SIMD)代码从特定的仿真软件金宝app®块使用英特尔®上交所和,如果你有嵌入式编码器®,英特尔AVX技术。SIMD计算范式中,一个单一的指令处理多个数据。许多现代处理器SIMD指令,例如,执行几个补充或者乘法。对于计算密集型操作支持块,SIMD intrinsic可以显著提高在英特尔平台上生成的代金宝app码的性能。

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

在满足特定的条件下,可以生成SIMD代码通过使用英特尔SSE或英特尔AVX技术。此表列出了支持SIMD代码生成的块。金宝app桌上还详细的条件支持。金宝app

条件
添加
  • AVX, SSE,菲利普-马萨,输入信号的数据类型

  • AVX2、SSE4.1 SSE2,输入信号的数据类型,,int8,int16,int32,或int64

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

减去
  • AVX, SSE,菲利普-马萨,输入信号的数据类型

  • AVX2、SSE4.1 SSE2,输入信号的数据类型,,int8,int16,int32,或int64

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

元素的总和
  • AVX, SSE,菲利普-马萨,输入信号的数据类型

  • AVX2、SSE4.1 SSE2,输入信号的数据类型,,int8,int16,int32,或int64

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

  • 优化减少配置参数设置

产品
  • AVX, SSE,菲利普-马萨,输入信号的数据类型

  • AVX2、SSE4.1 SSE2,输入信号的数据类型,,int16int32

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

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

产品的元素
  • AVX, SSE,菲利普-马萨,输入信号的数据类型

  • AVX2、SSE4.1 SSE2,输入信号的数据类型,,int16int32

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

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

  • 设置优化减少配置参数

获得
  • AVX, SSE,输入信号的数据类型

  • AVX2、SSE4.1 SSE2,输入信号的数据类型,,int16,或int32

  • 对于英特尔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代码功能
为每个子系统
  • 为每个子系统块包含一个块表中列出满足指定的条件。

  • 的值分区维度块参数必须以上的价值循环展开阈值配置参数。

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

  • SSE2,输入信号的数据类型int8,int16,int32,或int64

  • AVX2, AVX512F,输入信号的数据类型int8,int16,int32,或int64

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

如果你有DSP系统工具箱™,你还可以从某些DSP系统工具箱生成SIMD代码块。有关更多信息,请参见金宝app仿真软件在DSP系统工具箱支持SIMD代码生成金宝app(DSP系统工具箱)

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

生成SIMD代码相比,普通的C代码

对于这个示例,创建一个简单的模型simdDemo有一个减去块和一个块。的减去块有一个输入信号的维数为240,输入的数据类型。的块有一个输入信号的维数为140,输入的数据类型

金宝app仿真软件模型包含减去块和分裂块。

平原为这个模型生成C代码是:

空白simdDemo_step (void) {int32_T我;(我= 0;我< 240;我+ +){simdDemo_Y。着干活[我]= simdDemo_U。In1[我]——simdDemo_U.In2[我];}(i = 0;我< 140;我+ +){simdDemo_Y。Out2[我]= simdDemo_U。In3[i] / simdDemo_U.In4[i]; } }
在平原(non-SIMD) C代码,每个循环迭代产生一个结果。

生成SIMD代码:

  1. 打开金宝app仿真软件编码器™应用程序或嵌入式编码器的应用。

  2. 点击设置>硬件实现

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

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

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

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

  7. 从模型中生成代码。

空白simdDemo_step (void) {int32_T我;(我= 0;< = 236;我+ = 4){_mm_storeu_ps (&simdDemo_Y。着干活[我],_mm_sub_ps (_mm_loadu_ps (&simdDemo_U.In1[我]),_mm_loadu_ps (&simdDemo_U.In2[我])));}(i = 0;< = 138;我+ = 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。这些函数过程的多个数据在一个迭代循环,因为循环增量由四个单一数据类型和由两个双数据类型。模型处理更多的数据和计算比这个更密集,SIMD指令的存在可以显著加快代码的执行时间。

为支持英特尔的内在功能仿真软件模块列表,明白了金宝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®不支持分析生成的代金宝app码,包括SIMD指令。禁用SIMD代码生成通过设置利用目标硬件指令集扩展参数没有一个

  • 减少操作,操作浮点值时支持启用非限定的数量。金宝app为减少生成SIMD代码操作,操作浮点值,设置配置参数金宝app支持:非谓语形式的数字

相关的话题