2012-03-10 15 views
0

私はC言語(2次元ポアソンソルバー)でプログラムを書いていますが、大きなforループを高速化するためにopenMPを使っています。私が観察したことは、OpenMP並列ブロックの中で、#pragma always vector指示文を含める場合でも、forループがベクトル化されないことです。コンパイルのために私はpathscaleコンパイラを使用しています。OpenMPでのループのベクトル化

私はベクトル化するコードは次のようになります。

#pragma omp parallel shared(in, out, lambda,dim,C) private(k) 
    { 
      #pragma omp for schedule(guided,dim/nthreads) nowait 
      for(k = 0;k < dim; k++){ 
        in[k] = C*out[k]*lambda[k]; 
      } 
    } 

はどこ出て、ラムダとでは、倍精度配列です。

しかし、私は常にベクトルをの#pragmaが含まれていても、どのようなコンパイラの答えは次のとおりです。このため任意の回避策がある場合は、

warning: ignoring #pragma always vector 

知っていますか?

ありがとうございました。

+2

私は、ループをベクトル化/並列化することで多くのことを得ることはできないと思っています。たくさんのメモリアクセスのための仕事はほとんどありません。 – Mysticial

+0

@Mysticial、これはコンテストのエントリーの一部であり、助けになりました。 :) – Konstantinos

答えて

3

the User Guide for the PathScale compilerを調べたところ、#pragma always#pragma vectorも見つかりませんでした。だから私はコンパイラがこのプラグマを認識しないとあなたに伝え、それを無視すると思います。

ただしセクション7.4.5で私はベクトル化のお手伝いをする必要があり、次のオプションが見つかりました:ユーザーコードの

ベクトル化を...内部ループのベクトル化を有効または無効にフラグ-LNO:simd[=(0|1|2)]、によって制御されます。 0はベクタライザをオフにし、1(デフォルト)は、準最適なアラインメントによって望ましくないパフォーマンスの影響がないと判断できる場合にのみコンパイラをベクトル化し、2は制約なしにベクトル化します(これが最も積極的です)。

-LNO:simd_verbose=ONは、ベクタライザ情報(ユーザコードのベクトル化から)をstdoutに出力します。サイドノート(あなたからその#pragma always vectorを取ることができる場所を推測する)として

alwaysIntel's compiler has #pragma vectorがプラグマに一つの可能​​なパラメータです。しかし、プラグマは一般に、コンパイラに特有のものですが、複数のベンダがサポートする拡張機能(OpenMPは1つです)はほとんどありません。

+0

ありがとうアレクセイ。私はちょうどそれを自分で見つけてそれを試しましたが、神秘的な人は言ったように、仕事は十分ではありません。 – Konstantinos