TMS320C3x汇编器中指令之间的并行性

时间:2014-07-19 16:26:25

标签: assembly embedded signal-processing texas-instruments

请考虑以下说明:

mpyf3 *ar0+, *ar1+, r0 || addf3 r0, r1, r1

第一条指令等于r0 = *ar0++ * *ar1++,第二条指令等于r1 = r0 + r1。但是,第二条指令中r0的值是多少?有两种选择:

  1. r0是并行指令
  2. 之前r0的值
  3. r0是第一条指令的结果
  4. 什么是正确的?


    此外,我如何并行化一个简单的过滤器,如下一个

    void emg_filter(int const* a0, int* a1)
    {
        int const N = ...;
        int result = 0;
        for (; N > 0; --N)
            result += *a0++;
        *a1 = result/N;
    }
    

3 个答案:

答案 0 :(得分:0)

根据MPYF3||ADDF3指令的TMS320C3x用户指南文档:

  

浮点乘法和浮点加法   并行执行。所有寄存器都在开头读取   在执行周期结束时加载。如果其中一个并行   操作(MPYF3)从寄存器读取并且操作正在进行   并行执行(ADDF3)写入相同的寄存器,然后写入MPYF3   在修改之前接受寄存器的内容作为输入   ADDF3。

答案 1 :(得分:0)

两者都是并行完成的,因此它是(1.):r0中的addf3 r0, x, x不是mpyf3 x, x, r0的输出。 通常,您在循环中使用它,因此如果您多次重复此指令,addf3正在使用r0在上一个周期中计算的multf3

不确定您对循环有什么问题,但您应该能够使用重复单指令(RPTS)。此外,最好乘以常数(1 / N),而不是除以N.

答案 2 :(得分:-2)

然后我认为这将是优先级的问题,在大多数情况下它们是从左到右的,我认为首先计算乘法,因为在C中,乘法比将指令加一个级别更多。< / p>