Ich muss Katri Rao Produkt zwischen 2 Matrizen in C implementieren. Mathematisch ist dies eine Spalte wichtiger Zugriff von Daten und ich kann das nicht ändern. Aber wenn ich Preload (PLD-Anweisung in ARMv7) verwende, um jede nächste Schleifendatenvorabzuholen, wird das Problem der Leistung gelöst, anstatt einen Hauptzugriff auf Daten in der Reihe zu verwenden.Prefetch in ARMv7 in C
Wenn ja, wie man richtig vorlädt?
Bitte überprüfen Sie meine Vorbelastung Code unten,
void khatrirao_pref(double *C, double *A, double *B,
int nmax, int mmax, int pmax)
{
int i,k,l;
for (i=0;i<nmax;i++)
{
for (k=0;k<mmax;k++)
{
asm("PLD [%0]\n\t" :: "r" (A+i+((nmax+1)*k)));
for (l=0;l<pmax;l++)
{
asm("PLD [%0]\n\t" :: "r" (B+i+((nmax+1)*l)));
C[i+(nmax*((k*pmax)+l))]=A[i+(nmax*k)]*B[i+(nmax*l)];
}}}
}
Wenn Sie immer Spaltenreihenfolge verwenden möchten, überlegen Sie, ob Sie Spalten als Zeilen und Zeilen als Spalten behandeln können, indem Sie den Sinn von Arrayindizes umkehren, wo Sie 'A [Zeile] [Spalte]' verwendet haben 'A [Spalte] [Zeile]'. Dies gibt Ihnen den Caching-Vorteil des Zugriffs auf die Daten in der Speichersequenz. Es ist nicht leicht, etwas zu unternehmen - sorgfältig zu messen und zu testen. –
@ JonathanLeffler Hallo Jonathan, Danke für die Antwort. Aber ich kann es nicht tun. Ich muss mich strikt im Hauptsperrplatz aufhalten. Ich kann die innere Gleichung oder die Reihenfolge der 3 Schleifen oder die Dimensionen von Arrays nicht ändern. Ich kann Prefetch nur verwenden, um die nächsten Schleifendaten von A und B derselben Spalte zu erhalten. Ich weiß, das ist irgendwie merkwürdig, frage ich. Was denken Sie ? – karnajitsen
Wenn Sie mit Ihrem Speicherzugriffsmuster "gegen den Strich" gehen, wird die Leistung definitiv beeinträchtigt. Ein besserer Plan wäre, das gesamte Array vorab in den Cache zu laden, bevor es diesen Code erreicht. Wie Sie geschrieben haben, werden Sie Prefetching nicht helfen; Sie müssen der CPU einen Hinweis geben und ihm dann Zeit geben, das Lesen durchzuführen. – BitBank