言語サポートとディレクティブ

ここでは、コードをベクトル化するのに役立つ言語機能について説明します。__declspec(align(n)) 宣言は、ハードウェアのアライメント境界を克服します。restrict指示子とプラグマは、語彙スコープ、データ依存性、両義性の解決のために書きかたを処理します。

言語サポート

オプション 説明
__declspec(align(n)) 変数をnバイト境界にアライメントするようコンパイラに命令します。変数のアドレスはaddress mod n=0です。
__declspec(align(n,off)) 変数をnバイト境界にアラインするようコンパイラに命令します。 各nバイト境界内でのオフセット値は、nで指定します。変数のアドレスはaddress mod n = offです。
restrict エイリアス仮定を行うとき一義化機構に自由度を持たせます。これによってベクトル化の度合いがより高くなります。
__assume_aligned(a,n) 配列anバイト境界にアラインしていると見なすようコンパイラに指示します。 アライン情報が取得できなかった場合に使用します。

#pragma ivdep

ベクトル依存性が存在していると推定されてもそれを無視するようコンパイラに命令します。

#pragma vector
{aligned | unaligned | always}
ループをベクトル化するときの方法を指定し、効率の高いヒューリスティックについては無視したほうがよいことを示します。
#pragma novector ループをベクトル化しないよう指定します。

マルチ・バージョン・コード

不明な値のポインタにより、データ依存性の解析が、ループの独立性を証明できなかった場合に備えて、マルチ・バージョン・コードはコンパイラによって生成されます。この機能は、動的依存性のテストと呼ばれます。

プログラム・スコープ

「ベクトル化のサポート」を参照してください。

動的依存性のテスト例

サンプルコード

float *p, *q;

 

for(i=L; I<=U; i++)

{

   p[i]=q[i];

}

 

...

 

pL=p*4*L;

pH=p+4*U;

qL=q+4*L;

qH=q+4*U;

 

if(pH<qL || pL>qH)

{

 

   // Loop without data dependence

   for(i=L; i<=U; i++)

   {

      p[i]=q[i];

   {aligned | unaligned | always}

 

   for(i=L; i<=U; i++)

   {

      p[i]=q[i];

   }

}