如何使用 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]]的主要内容,如果未能解决你的问题,请参考以下文章