2016-04-13 5 views
0

Ich habe Zweifel, wie die Maschinen ein zweidimensionales Array im Speicher speichert. Ich werde Ihnen meinen Code vorstellen, um klarer zu sein. Ich Definiere eine zweidimensionale Anordnung auf diese Weise in meiner Hauptschleife:Cache-Fehler in einem zweidimensionalen Array

int main() 
{ 
    int i; 
    internalNode**tab =(internalNode **)malloc(sizeof(internalNode *)* DIM); 
    for (i=0; i<DIM ; i++) 
     tab[i] = (internalNode *)malloc(sizeof(internalNode) * DIM); 

    //CODE 

    CalculusOnGrid(tab,DIM); 
} 

DIM Wo ein Benutzer definierte Variable ist und InternalNode ist eine Struktur. In der Funktion CalculusOnGrid Ich werde dieses Kalkül auf dem Gitter tun (meine zweidimensionale Matrix):

for(i=1;i<DIM-1;i++) 
    for(j=1;j<DIM-j;i++) 
     tab[i][j].temperature_new = 0.25*tab[i+1][j].temperature+tab[i-1][j].temperature + tab[i][j+1].temperature + tab[i][j-1].temperature); 

also die vier Nachbarn meines aktuellen Punktes (i, j) Ich gehe zur Suche des Gitters.

Hier ist meine Frage: Ich werde eine Cache Miss auf dem oberen und unteren Element (das heißt Registerkarte [i + 1] [] und Registerkarte [i-1] []) oder auf der rechte und linke Elemente? (Das heißt Tab [] [j + 1] und Tab [] [j-1])

Was ist Ihr Vorschlag für die Beschleunigung meines Codes und die Verringerung der Cache-Fehler?

Ich hoffe, dass die Frage in einer klaren Art und Weise vorgeschlagen wird. Wenn das nicht der Fall ist, frag mich, was du willst!

Vielen Dank!

Alessandro

+6

Das ist kein 2d-Array, sondern ein Array von Zeigern auf Arrays. – 2501

+0

differency zwischen Array von Arrays und 2 dimensionalen Array http://www.c-faq.com/aryptr/dynmuldimary.html – Boiethios

Antwort

1

Cache-Misses ist einer der vielen Gründe, warum Sie sollten mit Pointer-basierte Lookup-Tabellen vermeiden, um dynamische Arrays zu emulieren.

Verwenden Sie stattdessen ein 2D-Array:

internalNode (*tab)[DIM] = malloc(sizeof(internalNode[DIM][DIM])); 

free(tab); 

Nun wird der Speicher benachbart und Leistung sollte viel besser sein.

+0

Solange DIM nicht zu groß ist, denke ich, dass das erwähnt werden sollte. – 2501

+0

Danke! Auf diese Weise emuliere ich ein 2D Array mit 1D Array? –

+0

@AlessandroBertini Nein, ein 2D-Array zu emulieren wäre 'type * ptr = malloc (x * y * sizeof (* ptr))', auch bekannt als "mangled array". Dies ist ein echtes 2D-Array, ich habe die Syntax etwas vereinfacht, damit Sie "tab [x] [y]' anstelle des hässlichen '(* tab) [x] [y]' verwenden können. [Langwierige Erklärung, warum das oben genannte funktioniert] (http://StackOverflow.com/a/32050859/584518). – Lundin

Verwandte Themen