This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C1294NCPDT:如何利用"组合乘法和累加指令"?

Guru**** 2540720 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1064875/tm4c1294ncpdt-how-to-take-advantage-of-combined-multiply-and-accumulate-instructions

器件型号:TM4C1294NCPDT

根据 TM4C1242的用户手册、它支持  

适用于单精度(C float)数据处理操作的■32位指令
■μ V 组合乘法和累加指令可提高精度(熔合 MAC)

在我的 FIR 滤波器中、  

  FIR_accum=0;
  对于(i=0、j=fir _selite_idx;i <FIRTAP; i++){
    FIR_accum=fir _accum+(float) fir _segment [j++]* fir _cof[i];
    如果(j==FIRTAP) j=0;
   }

其中、我使用循环缓冲器 fir_segment [FIRTAP]来保存最新数据、 fir_segment _idx 指向最早的数据


在这里、乘法和累加是瓶颈、是否有办法使编译器在不编写汇编代码的情况下对这部分代码使用"组合乘法和累加指令"?

感谢您的任何指示!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 David:

     我自己从未使用过内在函数指令。 请参阅 TI C 编译器用户指南中的5.14 ARM 指令内在函数、以使用内在函数来推断多累加指令。  另外、请注意、论坛回复将会延迟很多、因为我将要到明年才上任。  

    https://www.ti.com/lit/pdf/SPNU151V

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我知道 TI 的内在函数指令、只需知道我是否可以在 c 源代码级别执行一些操作、以使编译器使用它们

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="60659" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1064875/tm4c1294ncpdt-how-to-take-advantage-of-combined-multiply-and-accumulate-instructions 是否有方法使编译器在不编写汇编代码的情况下对这部分代码使用"组合乘法和累加指令"?

    您能否澄清一下是否需要 ARM Cortex-M4 FPU 指令集中列出的单精度浮点融合 MAC 指令

    查看 TI ARM C 编译器内在函数、我只能看到整数指令、而不能看到浮点指令。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你抓住了我,我确实需要单精度浮点,所以我的问题 似乎是无效的。。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我刚才在 TI ARM 编译 器 v20.2.5中尝试了以下附加的小示例:

    float coeffs[4] = {0.1f, 0.5f, 0.7f, 0.9f};
    float input[4] = {12.3f, 23.5f, 45.7f, 684.6f};
    
    int main(void)
    {
        float accum = 0.0f;
    
        int i;
        for (i = 0; i < 4; i++)
        {
            accum += coeffs[i] * input[i];
        }
    
    	return (int) accum;
    }

    刚刚使用的优化级别0 -寄存器优化。 有两个构建配置-使用 -fp_mode=relaxed 和 -fp_mode=strict。 已保存汇编器列表。 在这两种情况下,编译器都创建了一个使用 VMLA.F32“乘 法然后累加浮点”的循环:

         122 00000010           ||$C$L1||:    
         123                            .dwpsn  file "../main.c",line 17,column 9,is_stmt,isa 1
         124 00000010 0180EB02          ADD       A2, A3, A1, LSL #2    ; [DPU_V7M3_PIPE] |17|  ; [KEEP 32-BIT INS]
         125 00000014 0A00EDD1          VLDR.32   S1, [A2, #0]          ; [DPU_MERLIN_PIPE] |17|  ; [KEEP 32-BIT INS]
         126 00000018 0180EB03          ADD       A2, A4, A1, LSL #2    ; [DPU_V7M3_PIPE] |17|  ; [KEEP 32-BIT INS]
         127 0000001c 1A00ED91          VLDR.32   S2, [A2, #0]          ; [DPU_MERLIN_PIPE] |17|  ; [KEEP 32-BIT INS]
         128 00000020 0A20EE01          VMLA.F32  S0, S2, S1            ; [DPU_MERLIN_PIPE] |17|  ; [KEEP 32-BIT INS]
         129                            .dwpsn  file "../main.c",line 15,column 24,is_stmt,isa 1
         130 00000024 1C40              ADDS      A1, A1, #1            ; [DPU_V7M3_PIPE] |15|  ; [ORIG 16-BIT INS]
         131 00000026 2804              CMP       A1, #4                ; [DPU_V7M3_PIPE] |15|  ; [ORIG 16-BIT INS]
         132 00000028 DBF2              BLT       ||$C$L1||             ; [DPU_V7M3_PIPE] |15|  ; [ORIG 16-BIT INS]
         133                            ; BRANCHCC OCCURS {||$C$L1||}    ; [] |15| 

    不确定如何获取  使用的 VFMA.F32 "乘法(熔融)然后累加浮点"指令。

    e2e.ti.com/.../TM4C1294NCPDT_5F00_fused_5F00_mac.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="91588" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1064875/tm4c1294ncpdt-how-to-take-advantage-of-combined-multiply-and-accumulate-instructions/3939842 #39842"]不确定如何获取  使用的 VFMA.F32"乘法(融合)然后累加浮点"指令。[/quot]

    使用 ACLE 内在函数 __fmaf

    例如、我从 Chester 发布的项目开始(谢谢!)。  但我使代码变得更加通用。

    #include <arm_acle.h>
    
    extern float coeffs[];
    extern float input[];
    
    float fma_example(int length)
    {
        float accum = 0.0f;
    
        int i;
        for (i = 0; i < length; i++)
        {
            // accum += coeffs[i] * input[i];
            accum = __fmaf(coeffs[i], input[i], accum);
        }
    
        return  accum;
    }

    第1行、包括头文件 arm_acle.h。  此文件必须包含在使用 ACLE 内在函数的任何源文件中。  在第14行中、使用了内在函数_fmaf。   

    使用--opt_level=2进行构建,TI ARM 编译器生成此代码...

    ||$C$L1||:
    ;**     -----------------------g3:
    ;** 14  -----------------------    accum = fmaf(*U$15++, *U$11++, accum);
    ;** 11  -----------------------    if ( --L$1 ) goto g3;
            LDR       A4, [A3], #4          ; [DPU_V7M3_PIPE] |14|
            VMOV      S1, A4                ; [DPU_MERLIN_PIPE] |14|
            LDR       A4, [A2], #4          ; [DPU_V7M3_PIPE] |14|
            VMOV      S2, A4                ; [DPU_MERLIN_PIPE] |14|
            SUBS      A1, A1, #1            ; [DPU_V7M3_PIPE] |11|
            VFMA.F32  S0, S2, S1            ; [DPU_MERLIN_PIPE] |14|
            BNE       ||$C$L1||             ; [DPU_V7M3_PIPE] |11|

    第10行是使用指令 VFMA 的位置。  第2-4行是由于使用了-src_interlist 选项而插入的编译器的注释。  这些注释使汇编代码更易于理解。

    我认为编译器可以做得更好。  我认为 LDR/VMOV 说明可以替换为 VLDR。  但我对此并不肯定。

    RTS 库还提供一个名为 fmaf 的函数。  它执行相同的操作、但也进行了错误检查。  这在某些情况下可能是必要的。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    #include 无法与 CCS (版本10)和 TivaWare 2.1.4.178配合使用  

    但我在"C:\ti\ccs1031\ccs\tools\compiler\ti-cgt-arm_20.2.4.LTS \include"中找到它。

    因此、我添加了它的路径、  

    #include "C:\ti\ccs1031\ccs\tools\compiler\ti-cgt-arm_20.2.4.LTS \include\arm_成就.h"

    当我构建项目时、我遇到了这个错误

    "C:\ti\ccs1031\ccs\tools\compiler\ti-cgt-arm_20.2.4.LTS \include\arm_acue.h"、第47行:致命错误#35:#error 指令:"ARM C 语言扩展(ACLE) not enabled"

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您会看到...

    [引用 userid="60659" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1064875/tm4c1294ncpdt-how-to-take-advantage-of-combined-multiply-and-accumulate-instructions/3939977 #3939977"]致命错误#35:#ERROR 指令:"ARM C 语言扩展(ACLE)未启用"[/quot]

    (笑声) 因为未 定义编译器预定义的预处理器符号__ARM_ACLE。  我不知道这是怎么发生的。

    对于在看到此诊断时正在编译的源文件、请复制并粘贴整个编译器 armcl 调用的文本。  请勿使用屏幕截图。

    这...

    [引用 userid="60659" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1064875/tm4c1294ncpdt-how-to-take-advantage-of-combined-multiply-and-accumulate-instructions/3939977 #3939977"]#include [/报价]

    (笑声) 应按原样工作。  您需要更改此行的另一个指示器是错误的。  与另一个问题一样、我认为查看编译器的调用方式将有助于解释这一点。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="60659" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1064875/tm4c1294ncpdt-how-to-take-advantage-of-combined-multiply-and-accumulate-instructions/3939977 #3939977"]#include 无法与 CCS (版本10)和 TivaWare 2.1.4.178 配合使用[/引用]

    您使用的是哪个版本的 TI ARM 编译器?

    我不知道添加 ACLE 支持的 TI ARM 编译器的第一个版本、但查看安装示例:

    a. ti-cgt-arm_16.9.6.LTS 没有 arm_acle.h

    b. ti-cgt-arm_18.12.2.LTS 包含  arm_acle.h

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我安装了全新的 CCS 10、然后将我的项目从旧版 CCS 移到这里。 我要看一下  

    无论如何、即使在汇编代码中、我也看不到"SML"样式指令 、例如所有"组合乘法和累加指令的前缀

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    自我的项目在多年前开始、迁移到 CCS 10之后、它已经很旧了

    --include_path="C:/ti/ccsv6/tools/compiler/ti-cgt-arm_5.2.5/include

    但我的问题仍然是一样的。

    即使 在您的汇编代码中、我也看不到"SML"样式的指令 、例如所有"组合乘法和累加指令的前缀?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="60659" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1064875/tm4c1294ncpdt-how-to-take-advantage-of-combined-multiply-and-accumulate-instructions/3940012 #3940012"]即使 在汇编代码中,我也看不到 类似于所有"组合乘法和累加指令"前缀的"SML"样式指令?[/quot]

    我的示例使用了单精度浮点乘法和累加、因此使用 了 VMLA.F32。

    我认为 Cortex-M4 "SML"样式的指令只支持整数-请参阅 表3.2。 ARM 文档中的 Cortex-M4 DSP 指令集摘要。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="91588" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1064875/tm4c1294ncpdt-how-to-take-advantage-of-combined-multiply-and-accumulate-instructions/3939995 #3939995"]这是第一个添加 ACLE 支持的 TI ARM 编译器版本[/quot]

    17.9.0.STS。  David 使用版本5.2.5。  因此、不支持 ACLE。  因此、无法获取指令 VFMA。

    关于 SML 样式说明... ACLE 和 TI ARM 编译器都支持以 SML 开头的指令的多个内在函数。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我将启动一个新项目、看看我是否可以重复您的结果、谢谢