Новый механизм когерентности кэшей основан на принципе «путешествий во времени»
Размер справочника растет в зависимости от количества ядер не линейно, а логарифмически: в 128-ядерном процессоре памяти понадобится втрое меньше, чем при использовании стандартного протокола.
Исследователи из Массачусетского технологического института предложили новый механизм когерентности кэшей для многоядерных процессоров, в котором размер справочника растет в зависимости от количества ядер не линейно, а логарифмически: в 128-ядерном процессоре памяти понадобится втрое меньше, чем при использовании стандартного протокола на основе справочника, а в тысячеядерном - уже на 96% меньше. Кроме того, механизму из МТИ не нужна широковещательная рассылка сообщений, благодаря чему возможно преимущество по производительности.
Разработчики назвали его Tardis, как телефонную будку из "Доктора Кто", поскольку механизм основан на концепции "путешествия во времени": соблюдается логический порядок выполнения операций, который может отличаться от реального.
Каждому ядру и элементу данных в памяти ставятся в соответствие счетчики, при запуске программы все они равны нулю. Когда ядро считывает элемент данных, оно "арендует" его, устанавливая счетчик, например, в 10 (важно не само число, а значение относительно других). А когда ядру надо перезаписать этот элемент, оно становится его "владельцем". Другие ядра могут продолжать работать с локальными копиями того же элемента, а перезаписывающее ядро увеличивает свой счетчик до значения большего, чем значение счетчика самого элемента.
Допустим, ядра от А до Г считали один и тот же элемент, установив свои счетчики в 1, а счетчик элемента - в 10. Ядру Д нужно перезаписать элемент: оно становится владельцем и устанавливает свой счетчик в 11. Отныне ядро Д работает в более "позднем" логическом времени ("11"), чем остальные ядра ("1"). Теперь если ядро A пытается снова арендовать тот же элемент, оно, выяснив, что его владелец - Д, отправляет тому сообщение. Ядро Д в ответ записывает элемент в общий кэш, и ядро A считывает его, устанавливая внутренний счетчик в 11.