请考虑以下说明:
mpyf3 *ar0+, *ar1+, r0 || addf3 r0, r1, r1
第一条指令等于r0 = *ar0++ * *ar1++
,第二条指令等于r1 = r0 + r1
。但是,第二条指令中r0
的值是多少?有两种选择:
r0
是并行指令r0
的值
r0
是第一条指令的结果什么是正确的?
此外,我如何并行化一个简单的过滤器,如下一个
void emg_filter(int const* a0, int* a1)
{
int const N = ...;
int result = 0;
for (; N > 0; --N)
result += *a0++;
*a1 = result/N;
}
答案 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>