使用模索引自动矢量化?
auto vectorization with modulo index?
我正在尝试让 clang++ 自动矢量化一个简单的位加扰循环,它执行如下操作:
for(int i = 0; i < sz; ++i) {
dst[i] = src[i] ^ key[i]
}
如果dst
、src
和key
长度相同,编译器对这个循环向量化没有问题,但我真正想做的是:
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;
}
向量化得很好,但是只有一个字节的密钥比我希望的要短。
有没有一种方法可以让矢量化器满意地做这样的事情?
我可以用 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];
我正在尝试让 clang++ 自动矢量化一个简单的位加扰循环,它执行如下操作:
for(int i = 0; i < sz; ++i) {
dst[i] = src[i] ^ key[i]
}
如果dst
、src
和key
长度相同,编译器对这个循环向量化没有问题,但我真正想做的是:
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;
}
向量化得很好,但是只有一个字节的密钥比我希望的要短。
有没有一种方法可以让矢量化器满意地做这样的事情?
我可以用 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];