我有一个稀疏数组a(大多数为零):
unsigned char a[1000000];
Run Code Online (Sandbox Code Playgroud)
我想b在a使用AVX2的Intel x64架构上使用SIMD指令的非零元素创建一个索引数组.我正在寻找有效如何做到的提示.具体来说,是否有SIMD指令来获取SIMD寄存器中连续非零元素的位置,是否连续排列?
在为另一个问题编写查询表相关的答案时,我想起了一些我一直想知道的事情:在函数旁边找到函数所需的少量非代码数据是否明智,而不是传统的方法把它放在另一个部分?
假设您有一个小函数,它使用一个小的只读查找表.通常的方法似乎是将查找表定位在数据部分中,例如.rodata通常将其放置在距函数本身的文本一定距离处.
例如,一个使用16项LUT计算字节奇偶校验的简单函数:
GLOBAL parity
SECTION .text
parity:
mov eax, edi
shr edi, 4
xor eax, edi
and eax, 15
movzx eax, byte [lut + eax]
ret
SECTION .rodata
lut:
db 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
Run Code Online (Sandbox Code Playgroud)
现在,该方法恰好是大约16个字节的代码,查找表也是16个字节.因此,它们可以很容易地适应相同的缓存行.这看起来像是一个双赢 - lut 总是在函数中访问,并且只能由函数访问,因此我们可以通过放置代码和代码来降低调用此函数的成本.数据并排:
GLOBAL parity
SECTION .text
parity:
mov eax, edi
shr edi, 4
xor eax, edi
and eax, 15
movzx eax, byte [lut + …Run Code Online (Sandbox Code Playgroud)