2016-05-03 47 views
-2

私は、開いたmpを使って平行二次篩を実装しようとしています。ふるい分け段階で、私は対数近似を使って分裂性を調べています。これは私のコードです。私はこのコードを実行し、実行時間を比較するたびに、二次篩の最適化が得られないためのomp並列

ここ
#pragma omp parallel for schedule (dynamic) num_threads(4) 
    for (int i = 0; i < factorBase.size(); ++i) { 
     const uint32_t p = factorBase[i]; 
     const float logp = std::log(factorBase[i])/std::log(2); 

     // Sieve first sequence. 
     while (startIndex.first[i] < intervalEnd) { 
      logApprox[startIndex.first[i] - intervalStart] -= logp; 
      startIndex.first[i] += p; 
     } 

     if (p == 2) 
      continue; // a^2 = N (mod 2) only has one root. 

     // Sieve second sequence. 
     while (startIndex.second[i] < intervalEnd) { 
      logApprox[startIndex.second[i] - intervalStart] -= logp; 
      startIndex.second[i] += p; 
     } 
    } 

factorbaselogApprox

std::vector<float> logApprox(INTERVAL_LENGTH, 0); 
std::vector<uint32_t> factorBase; 

を次のように初期化さstd::vectorsあり、シーケンシャルおよびパラレル実行の間には大きな違いはありません。どのような最適化を行うことができますか?私はopenmpの初心者であり、どんな助けもありがたいです。ありがとう

+3

プロファイラを使用してボトルネックを特定し、ボトルネックを分析してボトルネックを解消します。 –

+0

よろしくお願い申し上げます。 –

答えて

0

私の意見では、スケジュールを静的にしてチャンクサイズ(https://software.intel.com/en-us/articles/openmp-loop-scheduling)にするべきです。

小さな最適化は次のようになりますループのための大きなの

外、CONSTを宣言し、1/STDに初期化::(2)、及び、ループの場合は、代わりにSTDで割るの内部ログ:: log(2)は、前のconstの乗算を行い、除算はCPUサイクルで非常に高価です。

関連する問題