【发布时间】:2019-08-27 22:31:26
【问题描述】:
我有以下循环:
float* s;
float* ap;
float* bp;
... // initialize s, ap, bp
for(size_t i=0;i<64;++i) {
s[i] = ap[i]+bp[i];
}
似乎是一个很好的矢量化候选者。虽然我打开了优化,但当我查看程序集输出时,clang(我正在使用 Xcode)似乎没有对循环进行矢量化:
LBB33_1: ## =>This Inner Loop Header: Depth=1
movss (%rax,%rsi,4), %xmm0 ## xmm0 = mem[0],zero,zero,zero
addss (%rcx,%rsi,4), %xmm0
movss %xmm0, (%rdx,%rsi,4)
Ltmp353:
incq %rsi
Ltmp354:
cmpq $64, %rsi
Ltmp355:
jne LBB33_1
如何让 clang/Xcode 向量化这个简单的循环?
【问题讨论】:
-
您是否尝试过使用
float *restrict s以便它知道输出不会与输入重叠?如果迭代次数很少,它可能会决定不值得发出代码来检查(缺少)重叠并拥有 2 个版本。 -
@PeterCordes 单独不会改变输出。也许我需要确保指针对齐?
-
它可能有助于承诺编译器它们与
ap = __builtin_assume_aligned(ap, 32)或类似的对齐,但通常这不是自动矢量化与否的决定因素。不过,它会在没有 AVX 的情况下为您提供更高效的代码生成。
标签: c clang vectorization compiler-optimization sse