Источник: Christine Daniloff/MIT |
У каждого ядра многоядерного чипа обычно есть собственный кэш, и есть также кэш последнего уровня, который делится между всеми ядрами. Принцип кэширования основан на пространственно-временной локальности: если был запрос каких-то данных, то скорее всего они скоро будут запрошены еще раз, и с большой вероятностью будут запрошены соседние.
Но есть случаи, когда локальность нарушается, например, когда «рабочий набор» данных приложения (тех, к которым оно обращается на протяжении всего периода исполнения) больше, чем размер кэша ядра, а также если два ядра, работающие над одними и теми же данными, поддерживают постоянную связь для синхронизации кэшей. В обоих случаях происходит непроизводительный обмен данными.
Исследователи из Массачусетского технологического института предложили алгоритмы, повышающие эффективность кэширования. В частности, когда рабочий набор не помещается в кэш, его предлагается распределить между локальным кэшем ядра и кэшем последнего уровня. А чтобы ядра не выполняли лишнюю синхронизацию кэшей, в МТИ предлагают хранить их общие данные в кэше последнего уровня. Эксперименты показали, что при использовании этих методик обработка ускоряется в среднем на 15%, а экономия энергии достигает 25%.