AVX組み込み関数を使用していくつかのコードを最適化しようとしています。非常に単純なテストケースがコンパイルされますが、私のループは私が理解していないいくつかの理由でベクター化されていないことがわかります。なぜこの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:3:11注意:ベクトル化されません:サポートされていないデータ型を
- simple.c: 11:3:note:ベクトル化係数を決定できません。
- simple.c:6:5:メモ:ベクタライズされていません。基本ブロックに十分なデータがありません。
- simple.c:11:3:注:ベクトル化されていません。基本ブロックで十分なデータ参照がありません。
- simple.c:6:5:メモ:ベクタライズされていません。基本ブロックに十分なデータがありません。
- simple.c:6:5:メモ:ベクタライズされていません。基本ブロックに十分なデータがありません。
私はgccバージョン5.4を使用しています。
誰も私がこれらのメッセージを解釈し、何が起こっているのか理解する助けができますか?
GCCの情報と自動ベクトル化に関する警告を説明する有用で冗長な文書がありますか?出力が混乱することがありました。 – Jens
@Jens:いいえ。私はいつもコンパイラが何をしたかを見るためにasm出力を見ています。複雑な関数では、デバッガでのシングルステッピングは、メインループ(皮切りされたプロローグ/エピローグのアラインされていない繰り返しのノイズの中で)を見つけるのに役立ちます。 –
Peterに感謝します。私はこれらのメッセージが何かが間違っていたことを暗示していると仮定しましたこれまでのあなたの答えと私の経験は、本当にasmに精通していることに代わるものではないことを示唆しています。後でなく早くこれを知ることをお勧めします。 – ghostofsandy