Ich versuche parallel quadratische Sieb mit offenem mp zu implementieren. In der Siebphase verwende ich Log-Approximationen, um die Teilbarkeit zu überprüfen. Das ist mein Code.omp parallel für keine Optimierung für quadratische Sieb erreicht
#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;
}
}
Hier factorbase
und logApprox
sind std::vectors
initialisiert als
std::vector<float> logApprox(INTERVAL_LENGTH, 0);
std::vector<uint32_t> factorBase;
folgt Jedes Mal, wenn ich diesen Code ausführen und die Laufzeit vergleichen, gibt es keinen großen Unterschied zwischen sequentiellen und parallelen Durchlauf. Was sind einige Optimierungen, die gemacht werden können? Ich bin ein Anfänger in openmp und jede Hilfe wird geschätzt. Danke
Verwenden Sie einen Profiler, um den Engpass zu identifizieren, analysieren Sie den Engpass und beseitigen Sie den Engpass. –
Ok, danke für deinen Vorschlag. –