-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;
}
}
factorbase
とlogApprox
は
std::vector<float> logApprox(INTERVAL_LENGTH, 0);
std::vector<uint32_t> factorBase;
を次のように初期化さstd::vectors
あり、シーケンシャルおよびパラレル実行の間には大きな違いはありません。どのような最適化を行うことができますか?私はopenmpの初心者であり、どんな助けもありがたいです。ありがとう
プロファイラを使用してボトルネックを特定し、ボトルネックを分析してボトルネックを解消します。 –
よろしくお願い申し上げます。 –