2016-04-13 2 views
0

У меня есть сомнения в том, как машины хранят двумерный массив в памяти. Я представлю вам свой код, чтобы быть более четким. я определяю двухмерного массива в этом случае, в моем главном цикле:Cache Misses на двумерном массиве

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 является определенной пользовательской переменной и internalNode является структурой. В функции CalculusOnGrid я буду делать это исчисление на сетке (мой двумерный массив):

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); 

Так я буду искать для 4 соседей моей текущей точки (I, J) сетки.

Вот мой вопрос: я собираюсь сделать миссию кэша на верхнем и нижнем элементах (это означает вкладку [i + 1] [] и вкладку [i-1] []) или на правый и левый элементы? (т. е. вкладка [] [j + 1] и вкладка [] [j-1])

Какое у вас предложение ускорить мой код и уменьшить количество промахов кэш-памяти?

Я надеюсь, что этот вопрос предлагается в ясной форме. Если это не так, спросите меня, что вы хотите!

Спасибо!

Алессандро

+6

Это не 2d-массив, а массив указателей на массивы. – 2501

+0

отличия между массивами массивов и 2 размерными массивами. Http://www.c-faq.com/aryptr/dynmuldimary.html – Boiethios

ответ

1

промах является одной из многих причин, почему вы должны избегать использования указателей на основе таблицы поиска для имитации динамических массивов.

Вместо этого используйте 2D массив:

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

free(tab); 

Теперь память смежное и производительность должна быть намного лучше.

+0

Пока DIM не слишком большой, я думаю, это следует упомянуть. – 2501

+0

Спасибо! Итак, таким образом я emulare 2D-массив, используя 1D-массив? –

+0

@AlessandroBertini Нет, эмуляция 2D-массива была бы 'type * ptr = malloc (x * y * sizeof (* ptr))', иначе называемый «искаженный массив». Это настоящий 2D-массив, я немного упростил синтаксис, чтобы вы могли использовать 'tab [x] [y]', а не уродливый '(* tab) [x] [y]'. [Долгосрочное объяснение того, почему вышеприведенные работы] (http://stackoverflow.com/a/32050859/584518). – Lundin

Смежные вопросы