2

请考虑以下说明:

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

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

  1. r0r0是并行指令之前的值
  2. r0是第一条指令的结果

什么是正确的?


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

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

3 回答 3

0

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

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

于 2014-08-04T03:05:27.633 回答
0

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

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

于 2014-07-19T22:55:48.873 回答
-2

然后我认为这将是优先级的问题,在大多数情况下它们是从左到右的,并且我认为首先会计算乘法,因为在 C 中,乘法比加法指令要优先一级。

于 2014-07-19T16:41:30.267 回答