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.
das scheint wie eine ineffiziente Verwendung von Parallelität –
es ist, aber ich habe eine Beschränkung auf parallel_invoke verwenden, was ich bin ratlos ist, warum ist der Ausgang aus? – RRP
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}. –