我對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(或稍微弱一點)來進行矢量化。 –