我对SIMD相当新颖,想试试看能否让GCC为我引导一个简单的动作。矩阵乘法的自动矢量化
所以我看着this post,想要做更多或更少的相同的事情。 (但在Linux 64位GCC 5.4.0,对于KabyLake处理器)
我基本上是有这个功能:
/* m1 = N x M matrix, m2 = M x P matrix, m3 = N x P matrix & output */
void mmul(double **m1, double **m2, double **m3, int N, int M, int P)
{
for (i = 0; i < N; i++)
for (j = 0; j < P; j++)
{
double tmp = 0.0;
for (k = 0; k < M; k++)
tmp += m1[i][k] * m2[k][j];
tmp = m3[i][j];
}
return m3;
}
其中我编译-O2 -ftree-vectorize -msse2 -ftree-vectorizer-verbose=5
,但我没有看到任何消息矢量已完成。
如果有人能帮助我,那将非常感激。
'-fopt-info-all-vec'(详见doc文档)给出了更多信息。 '-fopt-info-missed-vec'输出中的一个关键要素是“减少:不安全的fp数学优化:tmp_40 = _16 + tmp_49;”这实质上意味着你需要-ffast-math(或稍微弱一点)来进行矢量化。 –