Not sure, wie man einige der Leistungsergebnisse meines parallelisierten Matrixmultiplikationscodes erklärt

Ich führe diesen Code in OpenMP für die Matrixmultiplikation aus und habe die Ergebnisse gemessen:

#pragma omp for schedule(static)
for (int j = 0; j < COLUMNS; j++)
    for (int k = 0; k < COLUMNS; k++)
        for (int i = 0; i < ROWS; i++)
            matrix_r[i][j] += matrix_a[i][k] * matrix_b[k][j];

Es gibt verschiedene Versionen des Codes, je nachdem, wo ich das @ platzier#pragma omp -Anweisung - vor der j-Schleife, der k-Schleife oder der i-Schleife. Außerdem habe ich für jede dieser Varianten unterschiedliche Versionen für die statische Standardplanung, die statische Planung mit den Abschnitten 1 und 10 und die dynamische Planung mit denselben Abschnitten ausgeführt. Ich habe auch die Anzahl von DC-Zugriffen, DC-Fehlern, CPU-Takten, Anweisungen im Ruhestand und anderen Leistungsindikatoren in CodeXL gemessen. Hier sind die Ergebnisse für die Matrix der Größe 1000x1000 auf AMD Phenom I X4 945:

Ergebnisse von Leistungsmessungen

Womultiply_matrices_1_dynamic_1 ist eine Funktion mit#pragma omp vor der ersten Schleife und der dynamischen Planung mit Block 1 usw. Hier sind einige Dinge, die ich über die Ergebnisse nicht ganz verstehe, und ich würde mich über Hilfe freuen:

Die statische Standardversion mit Parallelisierung, bevor die innere Schleife in 2.512 Sekunden ausgeführt wird, während die sequenzielle Version in 31.683 Sekunden ausgeführt wird - trotz der Tatsache, dass sie auf einer 4-Kern-Maschine ausgeführt wird, stellte ich mir vor, dass die größtmögliche Beschleunigung 4x sein würde . Ist es logisch möglich, dass dies auftritt, oder ist dies ein Fehler? Wie kann ich das erklären?CodeXL sagt, dass die 3. Version mit statischer Planung eine viel geringere Anzahl von DC-Zugriffen (und Fehlschlägen) aufweist als die anderen Versionen. Warum das? Ist es nicht groß, weil alle parallelen Threads auf der gleichen Zelle der b-Matrix arbeiten? Ist es dasIch weiß, dass die 2. Version falsch ist, da die Threads möglicherweise in derselben Zelle der R-Matrix ausgeführt werden, was zu Race-Bedingungen führen kann. Warum ist die Leistung jedoch geringer? Verursacht Unrichtigkeit das irgendwie? Mir ist klar, dass die dynamische Planung einen Overhead verursacht, weshalb sich der Code bei der Verwendung verlangsamt. Außerdem wird in der 3. Version (mit Pragma vor der i-Schleife) die Planung viel häufiger ausgeführt (milliardenfach mit einer 1000x1000-Matrix), sodass der Algorithmus viel weniger leistungsfähig ist. Diese Planung scheint jedoch in der 2. Version (mit Pragma vor der 2. Schleife) keine Verlangsamung zu verursachen. Warum das

Auch ich bin verwirrt über das Verhältnis von TLB-Fehlern zu Cache-Fehlern. Wann wird DTLB speziell eingesetzt? Das Dokument meines Professors besagt, dass jeder DC-Zugriff eine DTLB-Anforderung ist, aber ich verstehe nicht, wie das funktioniert - die Anzahl der TLB-Fehlschläge ist oft größer als die Anzahl der DC-Zugriffe. Wie berechne ich das TLB-Miss-Verhältnis? Mein Professor sagt, es ist TBL Misses / DC-Zugriffe. Er sagt auch, dass ich die zeitliche Lokalität anhand der Cache-Trefferquote und die räumliche Lokalität anhand der TLB-Trefferquote berechnen kann. Wie funktioniert das genau?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage