2017-08-24 1 views
0

Ich habe eine Matrix montieren unter Verwendung von zwei for-Schleifen, basierend auf Matrizen aus verschiedenen Bibliotheken, mit dem folgenden Algorithmus (hier auf Armadillo-basierte):Matrix Reduktion, individuelle Reduktionsoperator in OpenMP

inline void loop_over_matrix_serial(const size_t &size, arma::mat &matrix) 
{ 
    for (size_t i = 0; i < size; ++i) 
     for (size_t j = 0; j < size; ++j) 
      matrix(i, j) += position_function(i, j); 
} 

Um Um diesen Vorgang zu beschleunigen, möchte ich eine Reduktion mit OpenMP verwenden. Es gibt bereits benutzerdefinierte Reduktionsoperatoren in anderen Fragen, wie hier: C++ Armadillo and OpenMp: Parallelization of summation of outer products - define reduction for Armadillo matrix, aber es zielt auf vollständige Matrizen ab, nicht auf einzelne Elemente. Wie könnte ich einen benutzerdefinierten Operator für alle Matrizen definieren, auf die in der gezeigten Weise zugegriffen wird, aber von verschiedenen Bibliotheken für die Reduktion? Es wird immer ein Doppelwert sein, der von der rechten Seite hinzugefügt wird.

+2

Ich sehe keine Reduktion in Ihrem Code - nur die Einstellung jedes Elements in einem Array zu einem berechneten Wert. Reduktionen werden Reduktionen genannt, weil sie die Dimensionalität von Daten von Eingabe zu Ausgabe reduzieren. So reduziert zum Beispiel das 'dot_product' zwei Vektoren auf einen einzelnen Skalar. Eine zeilenweise Summierung in einer 2D-Struktur erzeugt eine 1D-Struktur. –

Antwort

-1

Wenn ich diesen Code optimieren wollte, werde ich zuerst die Größe der Matrix kennenlernen.

Wenn es groß ist, würde ich einen Cache-freundlichen Code schreiben.

in Ihrem Fall, wenn Ihre verschiedenen Matrizen nicht im Cache gehalten werden können, müssen Sie dies auch tun. siehe diesen Link, What is "cache-friendly" code?

omp-Reduktion kann nach Cache-Optimierung weniger wichtig sein.