Издержки Spin Loop с точки зрения согласованности кэша - PullRequest
5 голосов
/ 10 сентября 2011

Скажем, поток в одном ядре вращается вокруг переменной, которая будет обновляться потоком, работающим на другом ядре.У меня вопрос, что такое накладные расходы на уровне кэша.Будет ли ожидающий поток кэшировать переменную и, следовательно, не будет вызывать какой-либо трафик на шине до тех пор, пока записывающий поток не выполнит запись в эту переменную?

Как уменьшить эти издержки.X86 pause инструкция помогает?

Ответы [ 4 ]

3 голосов
/ 10 сентября 2011

Я полагаю, что все современные процессоры x86 используют протокол MESI . Таким образом, вращающийся поток «считывателя», скорее всего, будет иметь кешированную копию данных в «эксклюзивном» или «общем» режиме, не генерируя трафик шины памяти во время вращения.

Только когда другое ядро ​​записывает данные в местоположение, оно должно будет осуществлять связь между ядрами.

[обновление]

Подобная «спин-блокировка» - хорошая идея, если вы не будете крутиться очень долго. Если может пройти некоторое время, прежде чем переменная будет обновлена, используйте вместо нее переменную условия mutex +, которая переведет ваш поток в спящий режим, чтобы он не добавлял накладных расходов во время ожидания.

(Кстати, я подозреваю, что многие люди, в том числе и я, задаются вопросом "что вы на самом деле пытаетесь сделать?")

1 голос
/ 10 сентября 2011

Если вы закручиваете блокировку на короткие промежутки времени, у вас все нормально.Однако в Linux есть прерывание по таймеру (и я предполагаю, что аналогичное в других ОС), поэтому, если вы закрутите блокировку на 10 мс или приблизитесь к ней, вы увидите нарушение кеша.

Я слышал, что возможно изменитьЯдро Linux для предотвращения всех прерываний на определенных ядрах, и это нарушение исчезает, но я не знаю, что связано с этим.

0 голосов
/ 01 марта 2012

Я тщательно протестировал это в этом посте .Обычно служебные данные возникают из-за компонента блокировки шины спин-блокировки, обычно инструкции «xchg reg, mem» или некоторого ее варианта.Поскольку этих особых издержек избежать невозможно, у вас есть возможность сэкономить на частоте, с которой вы вызываете спин-блокировку, и выполнить абсолютно минимальный объем необходимой работы - после того, как блокировка установлена ​​- перед ее снятием.

0 голосов
/ 12 сентября 2011

В случае двух потоков служебные данные могут быть проигнорированы, в любом случае было бы неплохо сделать простой тест. Например, если вы реализуете спин-блокировки, сколько времени потратит нить на спин. Этот эффект для кеша называется отскок строк кеша .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...