【发布时间】:2015-11-15 19:34:58
【问题描述】:
OMAP3530 实现了一个 ARM 处理器和一个 C64x+ DSP。我有一个测试循环,我希望在 DSP 上比在 ARM 上运行得更快,但事实并非如此。
循环:
#define DIM 4
#define LIM 1000
#define MASK 3
int i, j;
uint32 arr[DIM][DIM] = {0};
uint32 rand[DIM][DIM] = {1, 5, 2, 7,
5, 4, 3, 8,
1, 2, 9, 3,
6, 6, 8, 4};
for (i = 0; i < LIM; i++)
for (j = 0; j < LIM; j++)
arr[i & MASK][j & MASK] += rand[i & MASK][j & MASK];
基准测试:
ARM:5 毫秒
DSP:25 毫秒
DSP 的重点是处理像这样的简单算术运算,所以我预计它会更快。我没有对 DSP 做太多配置,因为我对它非常缺乏经验。我相信缓存没有配置,所以正在调查,但欢迎任何其他建议。
有人可以就可能的解决方案提出建议吗?
编辑 - 将 LIM 值更改为 5000 以增加迭代次数。新基准:
ARM:120 毫秒
DSP:530 毫秒
【问题讨论】:
-
您的基准测试如何?您是在 ARM 端测量 DSP 时间,还是使用 DSP 上的处理器周期寄存器?从 ARM 到 DSP 以及返回的转换需要 很多 时间,而且你的函数并没有那么大,我希望代码花费任何时间。 _itoll(TSCH, TSCL) 将为您提供 DSP 上过期的周期数作为 64 位结果。
-
是的,您肯定希望启用缓存,除非您仅依赖紧密耦合的内存并使用 DMA 执行其他所有操作。一次高速缓存未命中很容易花费超过 400 个周期。你也可以在这段时间内执行 3200 条指令(每个时钟 8 条指令)。
-
@NilsPipenbrinck 在 ARM 端使用 GP 计时器模块进行基准测试。从 ARM 到 DSP 并返回大约需要 3.5 毫秒(这是在 DSP 上没有进行循环的时间,只是使用 IPC 发送“开始”消息和“完成”消息)。我更新了问题以使循环更长(将 LIM 更改为 5000)。我认为我们可以忽略 IPC 时间
-
@NilsPipenbrinck 关于 TCM:这个测试用例是一个更大的循环的一部分,该循环从数组 A(在 ARM 上定义)中的行中进行 EDMA,与它们一起修改数组 B 和 C(定义DSP),然后将 memcpys B 和 C 返回到 ARM。我是新手,但我认为我们没有明确使用 TCM,它可能会显示一些基准改进。您对如何合并它有任何参考吗?
标签: signal-processing benchmarking omap