生成SIMD代码金宝app块
您可以从某些Simulink生成单指令、多数据(SIMD)代码金宝app®块使用英特尔®SSE和,如果你有嵌入式编码器®,英特尔AVX技术。SIMD是一种用一条指令处理多个数据的计算范式。许多现代处理器都有SIMD指令,例如,一次执行多个加法或乘法。对于受支持块上的计算密集型操作,SIMD intrinsic可以显著提高在Intel平台金宝app上生成的代码的性能。
支持SIMD代码生成的块金宝app
当满足一定条件时,可以使用Intel SSE或Intel AVX技术生成SIMD码。该表列出了支持SIMD代码生成的块。金宝app该表还详细说明了支持可用的条件。金宝app
块 | 条件 |
---|---|
添加 |
|
减去 |
|
元素和 |
|
产品 |
|
元素乘积 |
|
获得 |
|
分 | 输入信号的数据类型为单 或双 . |
√6 | 输入信号的数据类型为单 或双 . |
装天花板 |
|
地板上 |
|
极大极小 |
|
元素最小最大值 |
|
MATLAB函数 | MATLAB代码满足本课题规定的条件:生成MATLAB函数的SIMD代码(嵌入式编码). |
每个子系统 |
|
按位运算符 |
|
移位运算 |
|
如果您有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的输入信号和一个输入数据类型双
.
这个模型的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代码:
打开Simulin金宝appk Coder应用程序或嵌入式Coder应用程序。
点击设置>硬件实现.
设置设备供应商参数
英特尔
或AMD
.设置设备类型参数
Windows x86 - 64 (64)
或Linux x86 - 64 (64)
.在优化窗格,用于利用目标硬件指令集扩展参数,选择处理器支持的指令集扩展。金宝app例如,选择
SSE2
.如果你使用嵌入式编码器,你也可以从指令集中选择上交所
,SSE4.1
,AVX
,AVX2
,菲利普-马萨
,AVX512F
.有关更多信息,请参见https://www.intel.com/content/www/us/en/金宝appsupport/articles/000005779/processors.html.可选地选择优化减少参数生成简化操作的SIMD代码。
从模型生成代码。
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支持:非有限数来
从
.
相关的话题
- 生成MATLAB函数的SIMD代码(嵌入式编码)
- 在DSP系统工具箱中的Simulink块上生成高性能的SIMD代码金宝app(DSP系统工具箱)
- 从MATLAB算法在DSP系统工具箱中生成高性能的Intel SIMD代码(DSP系统工具箱)