我试图通过使用AVX本质优化一些代码。一个非常简单的测试用例编译,但告诉我,我的循环没有向量化,因为许多原因,我不明白。
这是完整的程序,simple.c
#include <math.h>
#include <stdlib.h>
#include <assert.h>
#include <immintrin.h>
int main(void)
{
__m256 * x = (__m256 *) calloc(1024,sizeof(__m256));
for (int j=0;j<32;j++)
x[j] = _mm256_set1_ps(1.);
return(0);
}这是命令行: gcc simple.c -O1 -fopenmp -ffast- -lm -mavx2 -ftree-vectorize fopt-info-vec-错过
这是输出:
我有gcc 5.4版。
有人能帮我解释这些信息并理解发生了什么吗?
发布于 2016-07-28 14:40:27
你已经在用内嵌来手动矢量化了,所以gcc没有什么可以自动矢量化的了。这会导致无趣的警告,我认为这是试图自动向量化内部或循环计数器增量的结果。
我从gcc 5.3获得了很好的asm (如果我不做一些愚蠢的事情,比如编写一个优化函数,或者只用关于戈德波特编译器浏览器编译它)。
#include <immintrin.h>
void set_to_1(__m256 * x) {
for (int j=0;j<32;j++)
x[j] = _mm256_set1_ps(1.);
}
push rbp
lea rax, [rdi+1024]
vmovaps ymm0, YMMWORD PTR .LC0[rip]
mov rbp, rsp
push r10 # gcc is weird with r10 in functions with ymm vectors
.L2: # this is the vector loop
vmovaps YMMWORD PTR [rdi], ymm0
add rdi, 32
cmp rdi, rax
jne .L2
vzeroupper
pop r10
pop rbp
ret
.LC0:
.long 1065353216
... repeated several times because gcc failed to use a vbroadcastss load or generate the constant on the fly实际上,我从-O1那里得到了几乎相同的asm,但是使用-O1来优化事情并不是一个很好的方法来了解gcc到底会做什么。
https://stackoverflow.com/questions/38634899
复制相似问题