2
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 寄存器。我需要可用于加载然后按位屏蔽寄存器的内在函数,然后再存储回内存

PS:我以前从未做过汇编编码

4

3 回答 3

2

0xAA掩码值为(10101010)的掩码存储

于 2012-11-07T22:38:23.913 回答
0

您不能进行屏蔽加载(仅屏蔽存储)。最简单的选择是进行加载,然后自己屏蔽它(例如使用内在函数)。

一个可能更好的选择是将您的数组更改为“double u[STRIDE][SIZE];” 这样您就不需要屏蔽任何东西,也不会浪费/屏蔽一半 XMM 寄存器。

于 2012-11-03T10:00:04.197 回答
0

如果没有 AVX,半个 SIMD 寄存器无论如何只有一个 double,因此常规 64 位存储似乎没有什么问题。

如果您想使用掩码存储 (MASKMOVDQU/MASKMOVQ),请注意它们直接写入 DRAM,就像 MOVNTPS 等非临时存储一样。这可能是也可能不是您想要的。如果数据适合缓存并且您打算很快读取它,最好不要使用它们。

某些 AMD 处理器可以使用 MOVNTSD 从 XMM 寄存器执行 64 位非临时存储;与 MASKMOVDQU 相比,这可能会稍微简化一些事情)。

于 2012-11-12T17:55:27.043 回答