Вопрос

Это часть кашегриндного выхода. Эта часть кода была выполнена в 1224 раза. ELMG1 - это массив без знака длинного размера 16 x 20. Мой машинный размер кэша L1 составляет 32 КБ, размер кэша кэша 64B и 8-ходовой набор.

  1. для (i = 0; i <20; i ++) 78,336 2448 2 50,184 0 0 1 224 0 0
  2. {
  3. telm01 = elmg1 [i]; 146 880 0 0 73 440 0 0 24 480 0 0
  4. telm31 = (telm01 << 3) ^ val1; 97,920 0 0 48 960 0 0 24 480 0 0
  5. telm21 = (telm01 << 2) ^ (val1 >> 1); 146 880 1,224 1 48 960 0 0 24 480 0 0
  6. telm11 = (telm01 << 1) ^ (val1 >> 2); 146 880 0 0 48 960 0 0 24 480 0 0
  7. }

A. Причина, по которой я поставил ее здесь, заключается в том, что в 3-й строке внутри цикла я вижу ряд пропущений I1 (а одна пропуская L2). Это несколько запутанно, и я не мог догадаться по причине?

B. Я пытаюсь оптимизировать (время) часть кода. Выше - это просто маленький фрагмент. Я думаю, что в моей программе памяти доступа к стоимости мне. Как и в приведенном выше приведенном выше примере ELMG1 - массив из 16 х 20 размеров беззнаков. Когда я пытаюсь использовать его в коде, всегда есть несколько промахов, а в моей программе эти переменные происходят много. Какие-либо предложения?

C. Мне нужно выделить и (иногда инициализировать) эти без знаки. Можете ли вы предложить, какой из них я должен предпочел, Calloc или массивную декларацию, а затем явную инициализацию. Кстати, будет ли какая-то разница в том, как кэш обрабатывает их?

Спасибо.

Это было полезно?

Решение

Вы пытались развернуть петлю?

  1. Я бы не беспокоился о L1 пропускает прямо сейчас. Также одна L2 пропускается из 1224 раза в порядке, ЦП должен загружать значения в кеш в какой-то момент.
  2. Какой процент L2 Miss по сравнению с остальной частью программы по сравнению с остальной частью программы?
  3. Используйте Calloc (), если размер массива всегда одинаково, и вы используете константы для размера, то компилятор может оптимизировать нулевое значение массива. Также единственным, что повлияет на использование линий кэша, является выравниванием, а не то, как оно было возбуждено.

Редактировать: номер, где трудно читать так и прочитать их неправильно.

Позвольте убедиться, что я читаю числа прямо для линии 5:

Ir    146,880
I1mr  1,224
ILmr  1
Dr    48,960
D1mr  0
DLmr  0
Dw    24,480
D1mw  0
DLmw  0

Кэш L1 разделен на два кэширования 32 КББИЭ для кода I1 и один из данных D1. IL & DL - это кеш L2 или L3, который передается как данные, так и инструкции.

Большое количество I1MR - это инструкция, а не пропускает данные, это означает, что код петли извлекается из кэша инструкций I1.

I1 пропускается в строке 1 и 5 всего 3672, которая составляет 3 раза 1224, поэтому каждый раз, когда цикл запускается, вы получаете 3 кэш-памяти кэша I1 с линиями кэша в 64бабите, что означает, что размер кода петли находится между 128-192 байтами, чтобы покрыть 3 строки кэша. Таким образом, эти I1 пропускают в строке 5, это связано с тем, где код петли пересекает последнюю строку кэша.

Я бы порекомендовал использовать Kcacchegrind для просмотра результатов Cachegrind

Редактировать: Подробнее о строках кэша.

Этот код петли не похож на собой, так называется 1224 раза сама по себе, так что значит, что существует больше кода, который выдвигает этот код из кэша I1.

Ваш кеш 32KBYTE I1 разделен на 512 строки кэша (64байт каждый). Часть «8-поддона» ассоциативная «ассоциативная» означает, что каждый адрес памяти сопоставлен только на 8 из этих 512 строк кэша. Если вся ваша программа вы являетесь профилем, был один непрерывный блок 32КББАМТА памяти, то все будет вписаться в кэш i1, и ни один из них не будет выброшен. Это все в порядке, а не в случае, и будет более 8 64байт блоков кода, содержащих контента для тех же 8 строк кэша. Позвольте сказать, что вся ваша программа имеет 1 Мбит кода (это включает в себя библиотеки), то каждая группа из 8 строк кэша будет иметь около 32 (1 мбайт / 32Кабайт), которые содержатся кода для тех же 8 строк кэша.

Прочитайте эту статью LWN.NET для всех деталей GRY о CPU Caches

Компилятор не всегда может обнаруживать, какие функции программы будут горячими точками (называются много раз), и которые будут кодированы (то есть код обработки ошибок, который почти никогда не работает). GCC имеет функциональные атрибуты горячий холодный Что позволит вам отметить функции как горячие / холодные, это позволит компилятору группировать горячие функции вместе в одном блоке памяти, чтобы получить лучшее использование кэша (т.е. холодный код не будет нажимать на горячее окно из кэшей).

В любом случае, эти I1 промахи действительно не стоят время беспокоиться.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top