模数索引自动矢量化?

时间:2016-01-18 18:15:32

标签: c++ clang vectorization auto-vectorization

我试图让clang ++自动矢量化一个简单的加扰循环,它做了这样的事情:

for(int i = 0; i < sz; ++i) {
   dst[i] = src[i] ^ key[i]
}

如果dstsrckey长度相同,编译器对此循环进行矢量化没有问题,但我真正想做的是:

for(int i = 0; i < sz; ++i) {
   dst[i] = src[i] ^ key[i % 64];
}

我不需要密钥与数据一样长,但是当我添加% 64时,矢量化器会跑掉,而我正常循环。即使使用% 8(这是SIMD寄存器的大小)也会发生这种情况。我接下来要做的就是:

char d = 0x80
for(int i = 0; i < sz; ++i) {
   dst[i] = src[i] ^ d;
   ++d;
}

但是矢量化器也不是这样的 但是这样做:

for(int i = 0; i < sz; ++i) {
   dst[i] = src[i] ^ 0x80;
   ++d;
}

确实得到了矢量化,但只有一个字节的密钥比我希望的要短。

有没有办法以满足矢量图的方式做这样的事情?

1 个答案:

答案 0 :(得分:2)

我可以用Apple的(Xcode)clang重现这一点。使用模64块似乎满足矢量化器:

int i = 0; /* current index. */

int szd = sz / 64;
int szm = sz % 64;
for (int j = 0; j < szd; j++)
{
    for (int k = 0; k < 64; i++, k++)
        dst[i] = src[i] ^ key[k];
}

for (int k = 0; k < szm; i++, k++)
     dst[i] = src[i] ^ key[k];