2016-05-03 5 views
-2

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

+3

Verwenden Sie einen Profiler, um den Engpass zu identifizieren, analysieren Sie den Engpass und beseitigen Sie den Engpass. –

+0

Ok, danke für deinen Vorschlag. –

Antwort

0

Meiner Meinung nach sollten Sie den Zeitplan zu statisch und geben Sie es Stückgröße (https://software.intel.com/en-us/articles/openmp-loop-scheduling).

sollte eine kleine Optimierung sein:

außerhalb des großen FOR-Schleife, eine const deklarieren und auf 1/std :: log (2) initialisieren, und dann in der FOR-Schleife, sondern durch std des Teilens :: log (2), mach eine Multiplikation der vorherigen const, Division ist sehr teuer in CPU-Zyklen.