【发布时间】:2016-04-24 00:25:43
【问题描述】:
我正在尝试使 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];
}
我不需要 key 和数据一样长,但是当我添加 % 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;
}
确实得到了很好的矢量化,但是只有一个字节的密钥比我希望的要短。
有没有办法以取悦矢量化器的方式做这样的事情?
【问题讨论】:
标签: c++ clang vectorization auto-vectorization