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:5ms
DSP:25ms
DSP的目的是处理这样的简单算术运算,所以我希望它更快。我没有用DSP完成很多配置,因为我对它很缺乏经验。我相信缓存没有配置,所以我正在调查,但欢迎任何其他建议。
有人可以就可能的解决方案提出建议吗?
编辑 - 将LIM
值更改为5000以增加迭代次数。新的基准:
ARM:120ms
DSP:530ms
答案 0 :(得分:2)
我之前见过这种情况。仅在非常特定的情况下使用DSP才能获得回报。一百万个新增功能肯定不是用例 - 它不像ARM A8在添加数字时非常糟糕,因此您运行的代码在较慢的协处理器上对ARM非常有效。这根本不会加快速度。
您正在研究的特定OMAP具有带NEON的ARM Cortex A8内核,这意味着它具有单指令多数据Multiply/Accumulate指令。根据我的经验,这些甚至应该比让编译器尽可能高效地实现循环更快。但是,里程可能会有所不同,假设在线下某处您也在进行乘法运算。
如果您想释放手动优化的内在函数平台特定代码的强大功能,请查看VOLK,这是GNU Radio项目的衍生产品,提供了 V ector O 优化 L K ernels >,涵盖了大多数内核的通用实现x86 / MMX / SSE2 / AVX,以及其中一些内核的NEON实现。您的问题特别感兴趣的可能是16i_x5_add_quad_16i_x4
kernel。
总之:除非你确定C64x比相当强大的OMAP有很多优点,否则我不会使用它。你提到这是DSP上一个更大的循环的一部分,但你还没有办法计算你的算法在DSP上的周期 - 我建议你的开发设置进入一个容易决定的状态你的实施有多好。 ARM上的通用定时器肯定不是一个好的基准。