2011-07-06 9 views
2

Iは、内側4つの命令が容易コンパイラによってSSE命令に変換することができるよう、この内部ループ内でSSE命令を生成するためにICCコンパイラをどのように取得しますか?

for(i=0 ;i<n;i++){ 
x[0] += A[i] * z[0]; 
x[1] += A[i] * z[1]; 
x[2] += A[i] * z[2]; 
x[3] += A[i] * z[3]; 
} 

として内部ループを有します。現在のコンパイラはこれを行いますか?彼らは私がコンパイラでこれを強制するために何をしなければならないのですか?

答えて

4

ポインタが互いにエイリアスする可能性があります。つまり、xの配列がAまたはzと重複する可能性があるため、これをベクトル化することはできません。

コンパイラを手放す簡単な方法は、x__restrictと宣言することです。もう一つの方法は、そのようにそれを書き換えることであろう。

for(i=0 ;i<n;i++) 
{ 
float Ai=A[i]; 
float z0=z[0], z1=z[1], z2=z[2], z3=z[3]; 
x[0] += Ai * z0; 
x[1] += Ai * z1; 
x[2] += Ai * z2; 
x[3] += Ai * z3; 
} 

は、私が実際に自動ベクトル化コードにコンパイラを取得しようとしましたことがありませんので、それはそれを行うかどうかは分かりません。ベクタライズされていなくても、ロードとストアをより効率的に、ロード・ヒット・ストアを発生させることなく発注することができるため、高速化する必要があります。

コンパイラよりも多くの情報がある場合(たとえば、ポインタが16バイト境界になっているかどうかなど)、それをあなたの利点(たとえば、整列したロードを使用)で使用できるはずです。私は、あなたがそれ以上のことを知っているときだけ、いつもコンパイラを打ち負かすべきだと言っているわけではありません。

さらにリーディング:

0

ICCのデフォルトでSSE2については、以下のコードスニペットを自動的にベクトル化:

void foo(float *__restrict__ x, float *__restrict__ A, float *__restrict__ z, int n){ 
for(int i=0;i<n;i++){ 
x[0] += A[i] * z[0]; 
x[1] += A[i] * z[1]; 
x[2] += A[i] * z[2]; 
x[3] += A[i] * z[3]; 
} 
return; 
} 

を使用すると、が制限されます。キーワードでは、メモリエイリアシングの前提は無視されます。ベクトル化レポートが生成されます。

$ icpc test.cc -c -vec-report2 -S 
test.cc(2): (col. 1) remark: PERMUTED LOOP WAS VECTORIZED 
test.cc(3): (col. 2) remark: loop was not vectorized: not inner loop 

SSE命令が生成されているかどうかを確認するには、ASMを開く(test.s)を生成し、次の手順を見つける:

..B1.13:      # Preds ..B1.13 ..B1.12 
     movaps (%rsi,%r15,4), %xmm10       #3.10 
     movaps 16(%rsi,%r15,4), %xmm11      #3.10 
     mulps  %xmm0, %xmm10         #3.17 
     mulps  %xmm0, %xmm11         #3.17 
     addps  %xmm10, %xmm9         #3.2 
     addps  %xmm11, %xmm6         #3.2 
     movaps 32(%rsi,%r15,4), %xmm12      #3.10 
     movaps 48(%rsi,%r15,4), %xmm13      #3.10 
     movaps 64(%rsi,%r15,4), %xmm14      #3.10 
     movaps 80(%rsi,%r15,4), %xmm15      #3.10 
     movaps 96(%rsi,%r15,4), %xmm10      #3.10 
     movaps 112(%rsi,%r15,4), %xmm11      #3.10 
     addq  $32, %r15          #2.1 
     mulps  %xmm0, %xmm12         #3.17 
     cmpq  %r13, %r15         #2.1 
     mulps  %xmm0, %xmm13         #3.17 
     mulps  %xmm0, %xmm14         #3.17 
     addps  %xmm12, %xmm5         #3.2 
     mulps  %xmm0, %xmm15         #3.17 
     addps  %xmm13, %xmm4         #3.2 
     mulps  %xmm0, %xmm10         #3.17 
     addps  %xmm14, %xmm7         #3.2 
     mulps  %xmm0, %xmm11         #3.17 
     addps  %xmm15, %xmm3         #3.2 
     addps  %xmm10, %xmm2         #3.2 
     addps  %xmm11, %xmm1         #3.2 
     jb  ..B1.13  # Prob 75%      #2.1 
           # LOE rax rdx rsi r8 r9 r10 r13 r15 ecx ebp edi r11d r14d bl xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 
..B1.14:      # Preds ..B1.13 
     addps  %xmm6, %xmm9         #3.2 
     addps  %xmm4, %xmm5         #3.2 
     addps  %xmm3, %xmm7         #3.2 
     addps  %xmm1, %xmm2         #3.2 
     addps  %xmm5, %xmm9         #3.2 
     addps  %xmm2, %xmm7         #3.2 
     lea  1(%r14), %r12d        #2.1 
     cmpl  %r12d, %ecx         #2.1 
     addps  %xmm7, %xmm9         #3.2 
     jb  ..B1.25  # Prob 50%      #2.1 
関連する問題