比方说,例如,我有2个变量__m256i
叫rows
和cols
,在他们里面的值是:现在从`__m256i`使用值来访问有效的阵列 - SIMD
rows: 0, 2, 7, 5, 7, 2, 3, 0
cols: 1, 2, 7, 5, 7, 2, 2, 6
,这些值表示为8个点的x
和y
位置,从而,在这种情况下,我将有以下几点:
p0: [0, 1], p1: [2, 2], p2: [7, 7], p3: [5, 5]
p4: [7, 7], p5: [2, 2], p6: [3, 2], p7: [0, 6]
我也有一个阵列称为lut
将具有的值int
类型:
lut: [0, 1, 2, 3, ..., 60, 61, 62, 63]
我想要做的,是从rows
和cols
变量使用这些位置值,用它访问lut
阵列并创建一个新__m256i
值与lut
访问值。
我知道该怎么做,这将是存储rows
和cols
值大小为8两个int
阵列,然后在同一时间从lut
阵列一个读出的值,然后使用_mm256_set_epi32()
创建新_m256i
价值的方式。
这有效,但在我看来是非常低效的..所以我的问题是如果有办法做得更快。
请注意,这些值仅仅是一个更具体的例子,并lut
并不需要有有序值或大小64
的感谢!
查找表通常在现代处理器上效率不高,因为它们总是创建数据依赖关系,所以如果您可以找到一种方法来用某种算术公式替换查找表,即使它有点复杂,它可以更快。否则,请参阅chtz的答案。 –
向我们显示您的代码。比它可能给你一个优化提示。 – xMRi
有时你可以将你的索引切分成4位的块,并用'pshufb'来获得一个16元的LUT。 (例如看看http://wm.ite.pl/articles/sse-popcount.html的SSE/AVX popcount实现。)但是当你的索引不是“可分离的”时,你必须用低字节进行多次混洗,并混合高字节,所以这是O(2 ^(n-4))适用于n位有效位,其中n> = 4。 –