2016-04-06 14 views
0

Ich arbeite an einem parallelen Matrix-Matrix-Multiplikator in MPI. Ich habe den Berechnungsteil, aber ich will auch CPU-Zeit berechnen. Ich bleibe stecken, weil es so aussieht, als ob einige Prozesse Start- und Endzeiten von 0 melden und für eine Aufgabe, die weniger als eine Sekunde dauern sollte (kleine Matrizen), meldet das Programm 1000+ zweite CPU-Zeiten (obwohl ich weiß, dass es läuft in weniger als einer Sekunde von der Beobachtung). Hier ist, was ich gerade mache:Berechnung der CPU-Zeit bei Verwendung von MPI

#include <time.h> 
#include "mpi.h" 
// other includes 
int main() 
{ 
    int start, end, min_start, min_end; 
    if (rank == 0) 
    { 
     // setup stuff 

     start = clock(); 
     MPI_Reduce(&min_start, &start, 1, MPI_INT, MPI_MIN, 0, MPI_COMM_WORLD); 

     // master computation stuff 

     end = clock(); 
     MPI_Reduce(&max_end, &end, 1, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD); 

     cout << "CPU time was " 
      << (double)(max_end - min_start)/CLOCKS_PER_SEC 
      << " seconds" << endl; 
    } 
    else if (rank != 0) 
    { 
     // setup stuff 

     start = clock(); 
     MPI_Reduce(&min_start, &start, 1, MPI_INT, MPI_MIN, 0, MPI_COMM_WORLD); 

     // slave computation stuff 

     end = clock(); 
     MPI_Reduce(&max_end, &end, 1, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD); 
    } 
} 

Ich bin mir nicht sicher, was die Quelle des Fehlers ist. Wenn ich in dieser Debugging-Ausgabe hinzugefügt (nach der if (rank == 0) und else if (rank != 0) Anweisung)

MPI_Barrier(MPI_COMM_WORLD); 
for (int i=0; i<size; i++) 
{ 
    if (rank == i) 
     cout << "(" << i << ") CPU time = " 
      << end << " - " << start 
      << " = " << end - start << endl; 
    MPI_Barrier(MPI_COMM_WORLD); 
} 

ich die folgenden Ausgabe

CPU time was 1627.91 seconds 
(1) CPU time = 0 - 0 = 0 
(2) CPU time = 0 - 0 = 0 
(0) CPU time = 1627938704 - 32637 = 1627906067 
(3) CPU time = 10000 - 0 = 10000 
+0

Zuerst würde ich 'clock()' überhaupt nicht verwenden. Sie können 'chrono' mit C++ 11 oder dessen Boost-Implementierung mit pre C++ 11 verwenden. –

Antwort

0

Zunächst holen sagt man 3 clock, dass „die Uhr() Funktion, um eine Annäherung des Prozessors zurückzugibt vom Programm verwendete Zeit ". Um die Zeit zu bestimmen, müssen Sie den Unterschied nicht berechnen. Dieses Missverständnis ist die Ursache des Fehlers. Sie müssen es nur nach Ihren intensiven Berechnungen aufrufen und die Zeit, die von setup stuff verbraucht wird, vernachlässigen.

Wenn Sie die Rüstzeit nicht berücksichtigen wollen, dann brauchen Sie den Unterschied. Verwenden Sie einfach die einfache und robuste MPI_Wtime-Funktion, die seit einem bestimmten Moment in der Vergangenheit eine präzise Anzahl von Sekunden erhalten hat.

Der Wert, den Sie durch Subtraktion minimale Startzeit von maximaler Endzeit erhalten, ist nicht die gesamte CPU-Zeit in allgemein akzeptierten Begriffen (d. H. In Bezug auf time Dienstprogramm). Diese Zeit ist real Zeit. Um tatsächlich die CPU-Zeit zu erhalten, sollten Sie alle Verarbeitungszeiten aufsummieren, d.h. MPI_Reduce mit Zeitdifferenzen und MPI_SUM aufrufen.

+0

Da 'MPI_Wtime' die Wandzeit angibt und nicht die CPU-Zeit, wenn andere Jobs auf dem Cluster laufen, wird die gemeldete Zeit erhöht, oder? Mein Ziel ist es, in der Lage zu sein, die Beschleunigung von der seriellen Ausführung zur parallelen Ausführung zu berechnen. – RagingRoosevelt

+2

@RagingRoosevelt Beschleunigung von der seriellen Ausführung sollte als Wandzeit auf 1 Maschine im Vergleich zur Wandzeit auf N Maschinen berechnet werden. Die CPU-Zeit berücksichtigt diese Berechnung nicht – NoseKnowsAll

+0

Zusätzlich zu dem, was @NoseKnowsAll gesagt hat, ist das Messen der CPU-Zeit nutzlos. Die meisten MPI-Implementierungen erzeugen zusätzliche Threads, um Netzwerkanforderungen zu verarbeiten, und wenn sich eine von ihnen beim Abruf nach Daten dreht, wird die gesamte CPU-Zeit, wie von "clock()" gemeldet, in den Himmel schießen. Außerdem ist "clock()" in hohem Maße nicht tragbar, z. Es gibt die Echtzeit unter Windows zurück. –

Verwandte Themen