Кэш побеждает, общая помощь в понимании
Я пытаюсь понять, как кешируется кэш, правильный ли следующий текст?
Взяв код ниже, чтобы быть примером.
long max = 1024*1024;
long a(max), b(max), c(max), d(max), e(max);
for(i = 1; i < max; i++)
a(i) = b(i)*c(i) + d(i)*e(i);
ARM Cortex A9 является четырехсторонней ассоциативной системой, каждая строка кэша имеет размер 32 байта, общий объем кэша равен 32 КБ. Всего в кэше 1024 строки. Для выполнения вышеуказанного расчета одна строка кэша должна быть смещена. Когда a(i) должен быть рассчитан, b(i) будет выброшен. Затем, когда цикл повторяется, b(i) необходим, и поэтому другой вектор смещается. В приведенном выше примере повторное использование кэша отсутствует.
Чтобы решить эту проблему, вы можете ввести отступ между векторами, чтобы разнести их начальный адрес. В идеале, каждый отступ должен быть размером не менее полной строки кэша.
Вышеупомянутая проблема может быть решена как таковая
long a(max), pad1(256), b(max), pad2(256), c(max), pad3(256), d(max), pad4(256), e(max)
Для многомерных массивов достаточно сделать начальное измерение нечетным числом.
Любая помощь, если вышеупомянутое верно или где я сделал ошибку.
Благодарю.
1 ответ
Каждому вектору требуется 8 МБ памяти (1024 * 1024 * 8B, при условии, что 8B долго). Таким образом, если эти векторы расположены непрерывно, то a (i), b (i), c (i), d (i) и e (i) будут отображаться в один и тот же набор кеша (не всегда в одну и ту же строку кеша, как она есть). 2 пути). Тем не менее в кеше может быть только два из них одновременно. Таким образом, когда строки кэша, содержащие d (i) и e (i), заносятся в кэш, строки кэша, содержащие b (i) и c (i), будут удалены.
Если вы уверены, что эти векторы расположены последовательно, вы можете просто заполнить их одним размером строки кэша, т.е. 32B. Это сделает свое дело. Таким образом, a (i), b (i), c (i), d (i) и e (i) будут находиться в смежных наборах кэшей. И после доступа к 4 элементам вектора каждая строка кэша будет удалена. Это связано с тем, что каждая строка кэша содержит 4 длинные переменные (a(0), a(1), a(2), a(3) будут в одной и той же строке кэша, как и (4), a(5), а (6), а (7)).
Таким образом, вы объявляете свои векторы как
long a(max),pad1(32),b(max),pad2(32),c(max),pad3(32),d(max),pad4(32),e(max)
Для связанных обсуждений, вы можете перейти по этой ссылке