组装内在的做一个蒙面负载

时间:2012-11-03 00:12:02

标签: c assembly sse simd intrinsics

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:我从未在

之前完成汇编编码

3 个答案:

答案 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相比,这可能会略微简化。