LINUX.ORG.RU

Invalidate queues

 ,


0

2

Добрый день. Разбираюсь с синхронизацией кешей многоядерного процессора. Допустим, что процессор работает по MESI протоколу https://en.wikipedia.org/wiki/MESI_protocol и, грубо говоря, имеет:
1. store buffer
2. invalidate queues
Запускаем код:

int a = 0, b = 0;
void cpu_0()
{
    a = 4;
    ...
}
void cpu_1()
{
    b = 3;
    ...
}
Представим следующую последовательность событий:
1. a и b находятся умещаются в одну кеш линию. Оба процессора имеют свою копию кеш линии, её статус - shared
2. cpu_0 выполняет a = 4, посылает запрос на инвалидацию кеш линии cpu_1, записывает a в store buffer.
3. cpu_1 помещает запрос на инвалидацию invalidate queues и отвечает подтверждением.
4. cpu_1 выполняет b = 3.
5. cpu_1 решает обработать invalidate queues.
6. ...

Вопрос: как обрабатывать запрос invalidate queues? Если кеш линию заинвалидить, то мы потеряем b. Мы не можем скинуть в память, так как кеш линия cpu_1 содержит невалидную a. Как не потерять b?

★★

ты свою ссылку перед написанием поста читал или просто для солидности прицепил?

anonymous
()

как обрабатывать запрос invalidate queues?

Думаю что на x86 никак. Программист может очень мало делать операций над кэшами т.к. они управляются апартно почти без возможности вмешаться.

Прочитай вот этот цикл статей о lock-free программировании: http://habrahabr.ru/company/ifree/blog/195770/, там раскрыт вопрос синхронизации и атомарных операций.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Думаю да, программисто не может обрабатывать nvalidate queue, интересует как это реализовано в принципе. Сейчас читаю всё подряд, этого пока не понял.

pavlick ★★
() автор топика
Ответ на: комментарий от pavlick

как это реализовано

Я не понимаю что именно ты спрашиваешь. Возможно, тебе нужен cache snooping.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

На x86, вообще, нет invalidate queue как таковой только store buffer если я ничего не путаю.

placement_new ★★
()

Думаю, что тут надо смотреть на модель памяти каждой конкретной архитектуры cpu в документации.

placement_new ★★
()
Последнее исправление: placement_new (всего исправлений: 1)

Вначале упустил деталь:
4. cpu_1 выполняет b = 3 - кеш линия ведь имеет shared, нужно заинвалидить в других кешах. Скорее всего, cpu_1 не сможет этого сделать (в его очереди запрос на инвалидацию этой линии) и будет писать в store buffer.

Конечно, ответы на такие вопросы нужно искать гораздо «ниже», это так, для примерной, целостной картины.

pavlick ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.