0

我正在尝试使 clang++ 自动矢量化一个简单的位加扰循环,它执行以下操作:

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

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

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

我不需要密钥与数据一样长,但是当我添加% 64矢量化器时,它会跑掉,剩下的就是一个正常的循环。即使% 8SIMD 寄存器的大小也会发生这种情况。我尝试的下一件事是:

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;
}

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

有没有办法以取悦矢量化器的方式做这样的事情?

4

1 回答 1

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];
于 2016-01-18T18:53:46.063 回答