【问题标题】:auto vectorization with modulo index?带模索引的自动矢量化?
【发布时间】:2016-04-24 00:25:43
【问题描述】:

我正在尝试使 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];
}

我不需要 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


    【解决方案1】:

    我可以使用 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];
    

    【讨论】:

    • @harold - 是的。根据dst / src 元素,它甚至会产生带有多个xorps 的内部循环。
    • 太棒了!我做了一个轻微的编辑,产生的性能等于 libc memcpy :)
    猜你喜欢
    • 2017-06-18
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多