【问题标题】:How does this vectorized code not overwrite memory?这个矢量化代码如何不覆盖内存?
【发布时间】:2021-07-08 03:22:28
【问题描述】:

获取此代码。

#include <stdlib.h>

int main(int argc , char **argv) {
    int *x = malloc(argc*sizeof(int));
    
    for (int i = 0; i < argc; ++i) {
        x[i] = argc;
    }

    int t = 0;
    for (int i = 0; i < argc; ++i) {
        t += x[i];
    }

    free(x);
    return t;

这个循环

for (int i = 0; i < argc; ++i) {
        x[i] = argc;
}

向量化为

        movdqu  xmmword ptr [rax + 4*rdx], xmm0
        movdqu  xmmword ptr [rax + 4*rdx + 16], xmm0
        movdqu  xmmword ptr [rax + 4*rdx + 32], xmm0
        movdqu  xmmword ptr [rax + 4*rdx + 48], xmm0
        movdqu  xmmword ptr [rax + 4*rdx + 64], xmm0
        movdqu  xmmword ptr [rax + 4*rdx + 80], xmm0
        movdqu  xmmword ptr [rax + 4*rdx + 96], xmm0
        movdqu  xmmword ptr [rax + 4*rdx + 112], xmm0
        movdqu  xmmword ptr [rax + 4*rdx + 128], xmm0
        movdqu  xmmword ptr [rax + 4*rdx + 144], xmm0
        movdqu  xmmword ptr [rax + 4*rdx + 160], xmm0
        movdqu  xmmword ptr [rax + 4*rdx + 176], xmm0
        movdqu  xmmword ptr [rax + 4*rdx + 192], xmm0
        movdqu  xmmword ptr [rax + 4*rdx + 208], xmm0
        movdqu  xmmword ptr [rax + 4*rdx + 224], xmm0
        movdqu  xmmword ptr [rax + 4*rdx + 240], xmm0

https://godbolt.org/z/33vvonojd

按照我的阅读方式,它在 256 字节的内存块中进行矢量化。考虑到我的malloc 的大小argc*sizeof(int) 没有那么大,这怎么可能?这不会覆盖我分配的内存吗?

【问题讨论】:

    标签: c compiler-construction clang simd auto-vectorization


    【解决方案1】:

    如果它运行它会,这就是为什么它对于小型 argc。

    在到达那个大(过于激进)展开块之前,请注意所有条件分支,特别是 jmp .LBB0_12 在来自cmp ebx, 7 / ja .LBB0_4 的直通路径中。

    还要注意 .LBB0_10 处的较小循环,它由 2 个向量展开。 (完全没有 16 字节的汇总循环似乎是不明智的,只有 256、32 和标量,但这就是 clang 所做的。)

    有一些逻辑来运行(或不运行)循环的自动向量化版本是 100% 标准的,并且当在编译时无法证明循环甚至可以运行一个完整向量时是必要的。您只需找到最大的代码块即可查看 large 输入可能会发生什么,但如果您想检查正确性,您显然必须考虑哪些循环可能会运行 0 次迭代。

    【讨论】:

      猜你喜欢
      • 2013-01-05
      • 2021-01-28
      • 2015-12-08
      • 1970-01-01
      • 1970-01-01
      • 2018-03-15
      • 2013-12-14
      • 1970-01-01
      相关资源
      最近更新 更多