Скажем, у меня есть стандартный x86-процессор defacto с 3 уровнями кэшей, L1/L2 private и L3, разделяемыми между ядрами. Есть ли способ выделить общую память, данные которой не будут кэшироваться в частных кэшах L1/L2, а скорее будут кэшироваться только на L3? Я не хочу извлекать данные из памяти (это слишком дорого), но я бы хотел поэкспериментировать с производительностью с использованием и без совместного использования общих данных в частных кэшах.
Предполагается, что L3 разделяется между ядрами (предположительно физически проиндексированным кешем) и, следовательно, не будет приводить к ложному обходу или недействительности строки кэша для сильно используемых общих данных.
Любое решение (если оно существует) должно выполняться программно, используя C и/или сборку для процессоров на базе процессоров Intel (относительно современные архитектуры Xeon (skylake, widewell), работающие на основе Linux.
Edit:
У меня есть чувствительный к задержке код, который использует форму разделяемой памяти для синхронизации. Данные будут в L3, но при чтении или записи на него будут переходить в L1/L2 в зависимости от политики включения кэша. Подразумевая проблему, данные должны быть недействительными, добавляя ненужный (я думаю) удар производительности. Я хотел бы посмотреть, можно ли просто хранить данные либо с помощью какой-либо политики страниц, либо с помощью специальных инструкций только в L3.
Я знаю, что можно использовать специальный регистр памяти для запрета кэширования по соображениям безопасности, но для этого требуется привилегия CPL0.
Edit2:
Я имею дело с параллельными кодами, которые работают на высокопроизводительных системах в течение нескольких месяцев. Системы представляют собой системы с большим числом ядер (например, 40-160 + ядер), которые периодически выполняют синхронизацию, которая должна выполняться в usec.