3.24 ベクトル化診断を使用してコードを調整し、パフォーマンスを改善する

コンパイラから、ベクトル化による最適化が適用された場所およびベクトル化を適用できなかった場所を示す診断情報が提供されます。

この情報を取得するためのコマンドラインオプションは、--diag_warning=optimizations および --remarks です。
以下のサンプルは、配列に単純な累計演算を実装した 2 つの関数を示しています。このコードはベクトル化されません。
int addition(int a, int b)
{
    return a + b;
}
void add_int(int *pa, int *pb, unsigned int n, int x)
{
    unsigned int i;
    for(i = 0; i < n; i++) *(pa + i) = addition(*(pb + i),x);
    /* Function calls cannot be vectorized */
}
--diag_warning=optimizations オプションを使用すると、addition() 関数の最適化警告メッセージが表示されます。
armcc -O3 -Otime --vectorize --diag_warning=optimizations test.c
--remarks オプションを使用すると同じメッセージが生成されます。
__inline 修飾子を addition() の定義に追加するとこのコードをベクトル化できます。ただし、まだ最適化されていません。--diag_warning=optimizations オプションを再度使用すると、ループがベクトル化されたがポインタのエイリアスの生成の問題が存在する可能性があるという最適化の警告メッセージが表示されます。
コンパイラは、エイリアス生成のランタイムテストを生成し、コードのベクトル化されたコピーとスカラのコピーの両方を出力する必要があります。ポインタのエイリアスが生成されていないことがわかっている場合は、 restrict キーワードを使用してランタイムテストのオーバーヘッドを削減し、ベクトル化パフォーマンスを改善できます。
__inline int addition(int a, int b)
{
    return a + b;
}
void add_int(int * __restrict pa, int * __restrict pb, unsigned int n, int x)
{
    unsigned int i;
    for(i = 0; i < n; i++) *(pa + i) = addition(*(pb + i),x);
}
最後に、ループの繰り返し回数を示すための改善を行うことができます。前のサンプルでは、繰り返し回数は定まっておらず、NEON レジスタに正確に適合する倍数でない可能性があります。すなわち、ベクトル化されていないコードを使用して実行するために残りの繰り返しをテストする必要があります。繰り返し回数が NEON ユニットで並列に操作できる要素の数で割り切れることがわかっている場合は、そのことを __promise 組み込み関数を使用してコンパイラに指示できます。以下のサンプルは、ベクトル化によって最高のパフォーマンスを得る最終的なコードを示しています。
__inline int addition(int a, int b)
{
    return a + b;
}
void add_int(int * __restrict pa, int * __restrict pb, unsigned int n, int x)
{
    unsigned int i;
    __promise((n % 4) == 0);
    /* n is a multiple of 4 */
    for(i = 0; i < (n & ~3); i++) *(pa + i) = addition(*(pb + i),x);    
}
関連する概念
3.25 ベクトル化可能なコードの例
3.26 DSP のベクトル化可能なコードの例
関連する参考文書
8.192 --vectorize、--no_vectorize
8.60 --diag_suppress=tag[,tag,...]
8.62 --diag_warning=tag[,tag,...]
8.164 --restrict、--no_restrict
9.13 restrict
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.