3
我想通过使用AVX intrinsics来优化一些代码。一个非常简单的测试用例编译,但告诉我,我的循环没有矢量化的原因有很多,我不明白。这个C矢量为什么不循环自动矢量化?
这是完整的程序,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-矢量化-fopt-信息-VEC错过
这是输出:
- simple.c:11:3:注意:不是矢量:不支持的数据类型
- simple.c: 11:3:注意:无法确定矢量化因子。
- simple.c:6:5:note:not vectorized:没有足够的data-refs在基本块中。
- simple.c:11:3:note:not vectorized:没有足够的data-refs在基本块中。
- simple.c:6:5:note:not vectorized:没有足够的data-refs在基本块中。
- simple.c:6:5:note:not vectorized:没有足够的data-refs在基本块中。
我有gcc版本5.4。
任何人都可以帮助我解释这些消息,并了解发生了什么?
是否有一个有用的详细文档解释GCC有关自动矢量化的信息和警告?我发现输出有时会令人困惑。 – Jens
@Jens:不知道;我总是只看asm输出来看看编译器做了什么。在复杂函数中,调试器中的单步可以帮助找到主循环(在去皮序言/结语未对齐迭代的噪声中)。 –
谢谢彼得。我认为这些消息意味着某些东西是错误的。到目前为止,您的回答和我的经验表明,真正无法替代对asm的一些熟悉。最好早点知道这一点,而不是晚点。 – ghostofsandy