如何使用 NEON 优化 a[i] = b[c[i]]

Posted

技术标签:

【中文标题】如何使用 NEON 优化 a[i] = b[c[i]]【英文标题】:how to optimize a[i] = b[c[i]] with NEON 【发布时间】:2015-07-15 07:07:21 【问题描述】:

我在这里得到了一个非常简单但很大(n 很大)的循环:

for (i=0; i<n; i++)

    dst[i] = src[table[i]];

我想使用 NEON 对其进行优化,但我不知道如何处理这部分:src[table[i]]。 是否可以优化?如果是,怎么做?

【问题讨论】:

这实际上是一个聚集负载,NEON 不支持。见:***.com/questions/11502332/… 如果这是 uint8_t table[n] 或此映射中的实例少于 256 个,则 vtbl 会派上用场。如果映射table[i] 是局部单调的,情况也是如此。对于一般情况,答案是否定的。投票重新开放以获取更多信息;除非这是一个临时加密功能,否则我会倾向于相信映射表中的可利用顺序。 @AkiSuihkonen:VTBL 仅处理(最多)输入的五个最低有效位。你有办法打破这个障碍吗? 使用链 vtbx.8 d0, d4,d5,d5,d6, d1; vadd.8 d1, d2; vtbx.8 d0, d7, d8, d9, d10, d1; 和 d2 填充 32 可以将表大小增加到 64。不幸的是,要获得 256 字节需要溢出一些寄存器。 【参考方案1】:

感谢@Paul R 和他的评论:

这实际上是一种聚集负载,NEON 不支持。请参阅: ***.com/questions/11502332/…

由于 NEON 无法优化,我尝试了OpenMP,并得到了显着的改进。而且代码也很简单:

#pragma omp parallel for
for (i=0; i<n; i++)

    dst[i] = src[table[i]];

【讨论】:

以上是关于如何使用 NEON 优化 a[i] = b[c[i]]的主要内容,如果未能解决你的问题,请参考以下文章

将代码转换为 Neon 程序集

使用 NEON/ARM 加载 8 位值

ARM 中的 NEON 实现

可以并行化 ARM NEON 的过滤器吗?

如何优化a [i] = -b [i] *(c [i] + d);

SSE/NEON 查表优化