int main()
{
const int STRIDE=2,SIZE=8192;
int i=0;
double u[SIZE][STRIDE];
#pragma vector aligned
for(i=0;i<SIZE;i++)
{
u[i][STRIDE-1]= i;
}
printf("%lf\n",u[7][STRIDE-1]);
return 0;
}
编译器在这里使用xmm寄存器。有步进2访问,我想让编译器忽略它并定期加载内存,然后屏蔽备用位,这样我就会使用50%的SIMD寄存器。我需要内在函数,可以用来加载然后按位掩码寄存器,然后再存储回内存
P.S:我从未在
之前完成汇编编码答案 0 :(得分:2)
蒙版商店,其掩码值为0xAA
(10101010)
答案 1 :(得分:0)
您无法执行蒙版加载(仅限蒙版商店)。最简单的替代方法是进行加载,然后自己进行掩码(例如使用内在函数)。
可能更好的选择是将数组更改为“double u [STRIDE] [SIZE];”所以你不需要掩盖任何东西,最终不会浪费半个XMM寄存器浪费/掩盖。
答案 2 :(得分:0)
没有AVX,半个SIMD寄存器只有一个双,所以普通的64位存储似乎没什么问题。
如果你想使用屏蔽存储(MASKMOVDQU / MASKMOVQ),请注意它们直接写入DRAM,就像MOVNTPS之类的非临时存储一样。这可能是也可能不是你想要的。如果数据适合缓存并且您计划很快读取它,则最好不要使用它们。
某些AMD处理器可以使用MOVNTSD从XMM寄存器执行64位非时间存储;与MASKMOVDQU相比,这可能会略微简化。