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