2017-10-05 13 views
-1

とデコード機能を並列化し、私は(intにバイナリコードから)、次のデコード機能を並列化しようとしています:は、OpenMP

int decodePrimeFactorization(int code){ 
    int prod = 1; 
    #pragma omp parallel for 
    for (int j=0; j<PF_NUMBER ; j++){ 
     #pragma omp critical 
     { 
      if ((code & 1) == 1){ 
       prod = prod * prime_factors[j]; 
      } 
      code = code/2; 
     } 
    } 
    return(prod); 
} 

ループ部分が重要ですが、結果はまだ間違っています。

ご協力いただければ幸いです。

+0

質問をdownvotingする代わりに、改善方法を教えてください。 –

+1

私は落選しませんでしたが、私は並列ループのすべてのラインをカバーする重要なプラグマを置くのはナンセンスだと思います。どのような並列化が必要ですか? – Abolfazl

+0

私は同意します。 2つの命令で2つのアトミック命令を使用することから始めましたが、それは機能しませんでした。だから私はこれを試してみましたが(それは利点がありません)、それが正しい結果を与えるかどうかを確認するだけで、まだ動作しませんでした! –

答えて

3

code変数の値が現在のループの反復に依存するため、書き込まれたループを並列にすることはできません。ループを並列化する場合、ループの各反復は独立していなければなりません。 codeのような値の場合は、ループ外部値を定数のままにして、ループイテレータjに依存するループ内部値を使用するように書き換える必要があります。また、クリティカルセクションをできるだけ小さくする必要があります。ここで唯一の重要なアクションはprodの更新です。

int decodePrimeFactorization(int code){ 
int prod = 1; 
#pragma omp parallel for 
    for (int j=0; j<PF_NUMBER ; j++){ 
    int code_tmp = (code >> j); // replaces code = code/2 
    if ((code_tmp & 1) == 1){ 
     #pragma omp critical 
     { 
     prod = prod * prime_factors[j]; 
     } 
    } 
    } 
    return(prod); 
} 

は私が必要なもの、それをより明確にするためにループ内部値code_tmpを使用しますが、あなたはまた、単にif (((code >> j) & 1) == 1)...とif文を置き換えることができます。

これは、シリアルバージョンの各ループ反復間で実行される値を置き換えるために、各ループで計算を増やさなければならない多くの並列ループの典型です。

+0

それはあまりにも意味をなさない、私は従属反復を引き起こしてはいけません。ありがとうございました! –