Вон оно что, да, я понял неправильно.
MESI мне вцелом нравится, но непонятно, как синхронно бродкастить в чужие кеши по уникастовой сети и избежать квадратичной скорости деградации системы с ростом числа вычислителей.
Как вариант хранить одну структуру MESI в общей памяти для всех блоков общей памяти и использовать атомарные операции модификации её (читать можно и обычными) или другие методы синхронизации доступа. Зависимость от количества вычислителей линейная, за исключением модификации блока, который есть у других в их кэше, тут уж без широковещательности не обойтись, впрочем её можно организовать как список в общей памяти изменившихся блоков (которые были в состоянии S и только нём), который каждый вычислитель проверит по получении сигнала или по таймауту, модификация его тоже должна быть защищена, блок из него удалять когда он меняет состояние с M на другое (E или I). Причём сверхлинейная зависимость будет кажется лишь для операций чтения списка, записи в него останутся линейными. Ну и размер списка на практике не будет сильно превышать количество вычислителей, а часто и вообще пустой, ведь в нём хранятся лишь блоки, перешедшие S->M и только пока остаются в состоянии M. Может даже имеет смысл разделить состояние M на два по типу перехода в него: из S или из E/I. Тогда и список не нужен, можно по таймауту проверять состояние блоков из своего кэша, не стали ли они вдруг S->M, тут уж смотря что проще проверить, список блоков в состоянии S->M или таблицу MESI для всех блоков в кэше.
Да, смысл M тут несколько другой, не как в MESI протоколе, это скорее флаг что данный блок кем-то изменяется в его локальном кэше. После сброса изменений в общую память блок перейдёт в E (если останется в кэше писавшего в него) или I. Подразумевается что блок в состоянии M может быть лишь у одного вычислителя, остальные должны у себя его молча удалить (не трогая MESI инфу о нём) при первой возможности. Да и I тоже означает что блок никем не используется.
Ой, что-то я уже запутываюсь ...