Насколько я знаю, ни одна микроархитектура x86 не пытается зафиксировать сохранение из буфера хранилища в L1D путем чтения, пока оно все еще находится в Shared MESI. состояние и проверка соответствия значения.
Обычно это происходит редко и стоит только дополнительных циклов доступа к кешу для горячих общих переменных, поэтому для микроархитектуры нет смысла делать это по умолчанию. Большинство хранилищ не относятся к общим переменным, и в буфере хранилища не известно, какие хранилища относятся к общим переменным, а какие нет.
В тех случаях, когда это стоит сделать (например, иногда для общих переменных), вы должны сделать это самостоятельно с кодом, подобным if()
в вопросе. Это именно то, для чего предназначен этот код, и да, это может быть победой.
Рекомендуется избегать записи общих переменных, если есть большая вероятность того, что какой-то другой поток прочитал их позже, чем вы в последний раз записывали их, потому что это всегда делает недействительными все другие копии, чтобы перевести строку локального ЦП в состояние Modified.
В некоторых случаях стоимость неправильного прогноза нагрузки + ветвления может быть выше, чем экономия, особенно если он не дает хорошего прогноза. (Спекулятивный RFO может даже аннулировать другие копии до того, как будет обнаружен неправильный прогноз. Конечно, спекулятивное хранилище не может фактически зафиксировать L1D, но чтение для владения может произойти AFAIK.)
В качестве другого примера, в цикле повтора спин-блокировки вы всегда хотите вращаться с чистой нагрузкой (+ pause
), а не с xchg
. Вращение на xchg
или lock cmpxchg
будет продолжать забивать эту строку кеша и задерживать код, который фактически разблокирует ее.
руководство Intel по оптимизации даже предлагает эту оптимизацию в главе TSX, чтобы уменьшить прерывание транзакций в других потоках, которые обращаются к общей переменной, избегая ненужных хранилищ.
// Example 12-1
state = true; // updates every time
var |= flag;
vs.
if (state != true) state = true;
if (!(var & flag)) var |= flag;
При использовании TSX отмена транзакций требует еще больших затрат, чем просто дополнительное ожидание MESI, поэтому вероятность того, что оно того стоит, вероятно, выше.
person
Peter Cordes
schedule
17.10.2017