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:
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?