【发布时间】:2015-11-26 06:54:27
【问题描述】:
我想用 SIMD 内部函数对以下 sn-p 代码进行矢量化,这可能吗?
unsigned char chain[3][3] = {
3, 2, 1, // y --> x
4, -1, 0, // |
5, 6, 7 // |
}; // v
std::vector<int> x;
std::vector<int> y;
//initialize x, y
std::vector<int> chain_code(x.size());
for(std::size_t i = 0; i < x.size(); ++i
chain_code[i] = chain[x[i]][y[i]];
编辑:
支持:SSE - SSE4.2 和 AVX
架构师:Sandy Bridge i5 2500
【问题讨论】:
-
是的,可以使用收集说明。
-
大多数 SIMD 架构都有
permute指令,可用于从多达 16 个甚至 32 个元素的表中进行快速查找。请指定您所针对的 CPU 架构和 SIMD 指令集以获得更具体的答案。 -
这怎么可能?
-
首先查看
_mm_shuffle_epi8。还可以考虑将所有类型设为 8 位整数,这将节省大量打包/拆包。我希望有人会在适当的时候提供更完整的答案,但如果没有,我会在有更多时间时进一步扩展。 -
考虑将整个数组打包成一个整数,然后进行寄存器内查找。不幸的是,您的数据包含 -1,否则您可以将其打包为 9 个适合 32 位整数的 3 位元素。寄存器内查找意味着您通过右移访问相关元素,然后使用 AND 进行屏蔽,这些都是可向量化的操作。