2017-11-15 3 views
0

Ich lerne ein wenig über openMP und versuche es hier zu verwenden, um zwei Matrizen zu multiplizieren.Optimierung für Matrix Multiply (OpenMP) - C

Noch ein wenig neu, also gibt es irgendwelche einfachen Änderungen, um die Leistung zu verbessern, oder habe ich das schon gemacht? Bin ich auch in irgendwelchen Datenrennen, indem ich Reduktion nicht verwende?

Antwort

2

Ihre aktuelle Implementierung kann wahrscheinlich nicht viel verbessert werden. An diesem Punkt kommt es auf die Compiler- und Cache-Nutzung an. Ein interessanter Punkt wird gemacht here by Intel, dass GCC erfordert, dass zwei Schleifen ausgetauscht werden, um die Multiplikationen zu vektorisieren (d. H. SIMD verwenden). Bei sehr großen Matrizen können Sie die Matrizen nicht in Streifen, sondern in Blöcken aufteilen. Dies führt zu Komplexität und Overhead, kann jedoch die Cache-Nutzung verbessern.

Die Reduktionsklausel wird nur benötigt, wenn Sie eine einzelne Variable mit mehreren Threads summieren, was hier nicht der Fall ist, da Sie nur über k summieren.

schließlich (aber das ist ganz persönlich) zur Kenntnis, dass Sie die beiden Richtlinien durch einen einzigen

#pragma omp parallel for 

die meiner Meinung nach sieht etwas sauberer ersetzen kann.

+0

Wenn dies eine pädagogische Übung ist (d. H. Lernen, OpenMP zu verwenden), gut. Wenn Sie eine Hochleistungsmatrix multiplizieren möchten, stoppen Sie jetzt. Suchen Sie stattdessen nach Bibliotheken wie Intel MKL, die viele weitere Optimierungen (z. B. Cache-Blockierung) enthalten. In der Tat könnte es für Sie interessant sein, die Leistung Ihrer naiven Parallelisierung mit der von MKL zu vergleichen ... –