В некоторых архитектурах есть инструкция «предварительной выборки записи», чтобы указать процессору, что вы собираетесь записывать в область памяти, прежде чем вы действительно это сделаете. Я понимаю, что на многоядерной машине это может использоваться ядром в качестве подсказки, что оно должно попытаться получить право владения данной строкой кэша сейчас, чтобы позже оно могло быстрее записывать в это место. Однако AFAICT имеет значение только в ситуациях, когда два ядра потенциально конкурируют за строку кеша. Для строки кэша, которая читается и записывается только одним ядром, имеет ли когда-либо применение предварительная выборка записи?
Влияет ли предварительная выборка на запись на одноядерную производительность?
Ответы (2)
При прочих равных условиях Prefetch-Write не имеет преимуществ перед Prefetch-Read для строк, к которым имеет доступ только одно ядро. После любой предварительной выборки ядро будет владеть линией в состоянии Эксклюзивное. При последующей записи строка переходит в состояние Изменено. Переход от эксклюзивного к измененному является бесплатным, поскольку по определению ни одно другое ядро не имеет этой линии. Изменение состояния E-> M завершается локально без отслеживания.
Помните, что у ядер есть собственная логика аппаратной предварительной выборки. Доступ к линии может привести к тому, что ядро автоматически захватит соседнюю линию (и). Если рядом находятся глобальные переменные или другие данные, система SMP может испытывать множество неожиданных перекрестных проверок.
Я бы подумал, что это может помочь, если строка кеша не находится в памяти, а флажки предварительной выборки записи будут необходимы через несколько циклов с этого момента. Такие домашние дела, как освобождение строки для записи, могли бы быть проще. Конечно, это должно позволить процессору завершить запись быстрее, чем если бы он просто выгружал запись неожиданно в кеш-память?
Или я что-то принципиальное упустил?