2016-11-03 15 views
0

Ich implementiere derzeit einen parallelen Algorithmus zur Berechnung der maximalen Differenz zwischen zwei Elementen, so dass die kleinere Zahl vor der größeren Zahl erscheint. Ich verwende die parallel_invoke von der tbb-Bibliothek, um dies zu erreichen. Meine Implementierung ist wie folgtParallel Algorithmus zur Berechnung der maximalen Differenz

int calculateMaxDiff(int *src, int start, int end){ 
    int maxVal = -1; 
    int maxRight = src[end -1]; 

    for(int i = end - 2; i >= start; i--){ 
     if(src[i] > maxRight){ 
      maxRight = src[i]; 
     }else{ 
      int diff = maxRight - src[i]; 
      if(diff > maxVal){ 
       maxVal = diff; 
      } 
     } 
    } 


    return maxVal; 
}; 

int compute_max_diff(int *src, int size) 
{ 
    int half1_diff; 
    int half2_diff; 

    parallel_invoke([&]{ half1_diff = calculateMaxDiff(src, 0, size/2);}, 
        [&]{ half2_diff = calculateMaxDiff(src, size/2, size);}); 


    int maxDiff = half1_diff + half2_diff; 

    return maxDiff; 
} 

nun für das obige Codesegment i die folgenden als Probe Array bin mit

int src[] = {12, 9, 18, 3, 7, 11, 6, 15, 6, 1, 10}; 
int size = 11; 

Für das obige Beispiel die Ausgabe oder maximale Differenz muss 12 sein, aber ich scheine 18. Ich habe den Algorithmus sequentiell ausgeführt und das erwartete Ergebnis erhalten. Aber sobald ich parallel_invoke vorstellen kann ich nicht scheinen, das richtige Ergebnis zu bekommen.

+0

das scheint wie eine ineffiziente Verwendung von Parallelität –

+0

es ist, aber ich habe eine Beschränkung auf parallel_invoke verwenden, was ich bin ratlos ist, warum ist der Ausgang aus? – RRP

+0

Bevor Sie parallel arbeiten, versuchen Sie den Zwei-Hälften-Algorithmus seriell, d. H. Löschen Sie die Parallel-Invoke/Lambda-Boiler-Platte und machen Sie einfach zwei sequenzielle Aufrufe, um MaxDiff zu berechnen. Was bekommst du? Nachdem Sie das Problem gelöst haben, können Sie sich überlegen, wie Ihr Algorithmus mit dieser Eingabe aus vier Elementen umgehen würde: {0, 0, 100, 100}. –

Antwort

1

Sie erhalten 18 als Summe von 9 aus der ersten Hälfte (das ist 18-9) und 9 aus der zweiten Hälfte, die (15-6) ist. Wenn Sie sequentiell arbeiten, nehme ich an, dass Sie calculateMaxDif(src, 0, size) aufrufen, was gut funktionieren würde, weil es alle Elemente des Arrays durchläuft. Wenn Sie jedoch 2 Funktionen in Hälften aufrufen, erreicht es nicht das benötigte Paar (3, 15), weil 3 in der ersten Hälfte und 15 in einer anderen Hälfte ist.

+0

Sie haben Recht, jedes Unterproblem wird eine andere Paarung und unterschiedliche max diff haben, würde also sagen, ich muss die Logik ändern, um das Paar zu bekommen (3,15). – RRP

+0

Nun, wenn Sie eine strenge Anforderung für 2 Prozesse haben, können Sie min Wert von der ersten Hälfte, max Wert von der rechten Hälfte speichern und 3 Werte überprüfen - max diff von links, max diff von rechts und diff zwischen max rechts und min links –

+0

Sie sagen also, ich brauche den maximalen Wert von der rechten Seite und den minimalen Wert von links. Aber was genau macht das hier genau? – RRP

Verwandte Themen