2

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];

基准:

  • 手臂:5毫秒

  • 数字信号处理器:25 毫秒

DSP 的重点是处理像这样的简单算术运算,所以我预计它会更快。我没有对 DSP 做太多配置,因为我对它非常缺乏经验。我相信缓存没有配置,所以我正在调查,但欢迎任何其他建议。

有人可以就可能的解决方案提出建议吗?

编辑- 将LIM值更改为 5000 以增加迭代次数。新基准:

  • 手臂:120毫秒

  • 数字信号处理器:530 毫秒

4

1 回答 1

2

我以前见过这种情况。仅在非常特定的场景中使用 DSP 才能获得回报。一百万个添加肯定不是用例——它并不是说 ARM A8 在添加数字方面非常糟糕,所以你运行的代码在 ARM 上会在较慢的协处理器上高效。那根本不会加快速度。

您正在查看的特定 OMAP 具有带 NEON 的 ARM Cortex A8 内核,这意味着它具有单指令多数据乘法/累加指令。根据我的经验,这些甚至应该比让编译器尽可能高效地实现你的循环更快。但是,假设您也在进行乘法运算,里程可能会有所不同。

如果您想释放手动优化的、富含内在函数的特定于平台的代码的力量,请查看VOLK它是 GNU Radio 项目的衍生产品提供一个向量优化内核,涵盖了通用实现,大多数内核的 x86/MMX/SSE2/AVX,以及其中一些内核的 NEON 实现。对您的问题特别感兴趣的可能是内核16i_x5_add_quad_16i_x4

结论:除非您确定 C64x 比功能强大的 OMAP 有很多优势,否则我不会使用它。您提到这是 DSP 上更大循环的一部分,但您还没有办法计算您的算法在 DSP 上花费的周期——我建议您将开发设置置于易于决定的状态你的实施有多好。ARM 上的通用计时器肯定不是一个好的基准。

于 2015-11-16T08:52:28.053 回答