2016-07-28 8 views
3

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を使用しています。

誰も私がこれらのメッセージを解釈し、何が起こっているのか理解する助けができますか?

答えて

3

すでに組み込み関数を使用して手作業でベクトル化しているので、gccが自動ベクトル化するためのものは何も残っていません。これは、面白い警告につながります。私は、内蔵またはループカウンタのインクリメントを自動ベクトル化しようとしていると仮定します。

私はgcc 5.3(on the Godbolt compiler explorer)から良いasmを取得します。離れて最適化する関数を書くか、-O1でコンパイルしようとすると愚かなことをしないとします。

#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参照するには良い方法ではありませんありません。

+0

GCCの情報と自動ベクトル化に関する警告を説明する有用で冗長な文書がありますか?出力が混乱することがありました。 – Jens

+0

@Jens:いいえ。私はいつもコンパイラが何をしたかを見るためにasm出力を見ています。複雑な関数では、デバッガでのシングルステッピングは、メインループ(皮切りされたプロローグ/エピローグのアラインされていない繰り返しのノイズの中で)を見つけるのに役立ちます。 –

+0

Peterに感謝します。私はこれらのメッセージが何かが間違っていたことを暗示していると仮定しましたこれまでのあなたの答えと私の経験は、本当にasmに精通していることに代わるものではないことを示唆しています。後でなく早くこれを知ることをお勧めします。 – ghostofsandy

関連する問題