Кэш-дружественный код

Недавно я наткнулся на этот пример, когда читал введение в текст C. Не было никакого объяснения тому, почему приведенные ниже коды отличаются друг от друга, когда речь идет об удобстве кеша, и я не могу понять разницу. Текст звучит так:

Сравнивая эти два кода:

// cache-friendly
int i, j;
for (i = 0; i < 10; ++i)
{
    for (j = 0; j < 20; ++j)
    {
        a[i][j] += 10;
    }
}

VS

// not cache-friendly
int i, j;
for (j = 0; j < 20; ++j)
{
    for (i = 0; i < 10; ++i)
    {
        a[i][j] += 10;
    }
}

Кто-нибудь понимает, почему код A более удобен для кэширования по сравнению с кодом B?


person harogaston    schedule 25.09.2014    source источник
comment
Речь идет о местонахождении данных, на которые вы смотрите. Двумерный массив представляет собой непрерывный блок памяти, и доступ к нему осуществляется в виде строк. Таким образом, элементы в одной строке являются смежными, а элементы в столбце - отдельными.   -  person juanchopanza    schedule 26.09.2014
comment
Кэш инструкций вашего процессора может предсказать последовательный доступ к массиву лучше, чем то, что он считает случайным.   -  person Pieter21    schedule 26.09.2014
comment
@juanchopanza Спасибо, это все проясняет. Если вы хотите опубликовать это как ответ, я приму это.   -  person harogaston    schedule 26.09.2014
comment
(Несмотря на то, что он помечен как дубликат) В вашем случае массив настолько мал, что он удобно помещается в кеш L1, поэтому он не должен вызывать существенной разницы.   -  person Oliver Charlesworth    schedule 26.09.2014
comment
@OliverCharlesworth Я знаю, что в этом случае нет практических различий, но мой вопрос был более концептуальным. В любом случае, я уже рассмотрел вопрос, который вы указали как дубликат моего, спасибо.   -  person harogaston    schedule 26.09.2014