2016-07-15 2 views
0

У меня есть функция, которая очень мало читает, но много пишет в ОЗУ. Когда я запускаю его несколько раз на одном и том же ядре (основной поток), он работает примерно на 5 раз быстрее, чем если бы я запускал функцию в новом потоке каждый прогон (который не гарантирует, что одно и то же ядро ​​используется между прогонами), так как Я запускаю и соединяюсь между прогонами.Какова роль кеша при записи в память?

Это говорит о том, что кеш используется в основном для процесса записи, но я не понимаю, как это сделать. Я думал, что кеш полезен только для чтения.

+1

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

+0

Это звучит как «Ответ» на меня, EOF ... Что вы подразумеваете под «не временными магазинами» и т. Д. Похоже, у вас есть что сказать. **: -) ** –

ответ

0

Современные процессоры обычно имеют буферы записи. Причина в том, что записи в первом приближении являются чистыми поглотителями. Обычно процессору не приходится ждать, пока магазин достигнет иерархии согласованной памяти, прежде чем он выполнит следующую команду.

(За исключением:. Очевидно, магазины не чистые раковины Позже чтения из написанного к ячейке памяти должна вернуть записанное значение, так что процессор должен подглядывать от записи буфера, и либо срыв чтения или переслать записанное значение)

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

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



Есть способы, чтобы избежать загрузок старого cacheline, как не-временных магазины, пишет комбинирование памяти или cacheline-обнуление инструкции.

Невременные хранилища и память для записи объединяют смежные записи для заполнения всей строки в кеше, отправляя новую иерархию памяти в иерархию памяти, чтобы заменить старую.

POWER имеет инструкцию, которая обнуляет полную кеглину (dcbz), что также снимает необходимость загрузки старого значения из памяти.

x86 с AVX512 имеет cacheline размера регистров, что свидетельствует о том, что выравниваются zmm -зарегистрироваться магазин мог избежать загрузки старого cacheline (хотя я не знаю, делает ли это).

Обратите внимание, что многие из этих методов не согласуются с обычным порядком памяти соответствующих процессорных архитектур. Использование их может потребовать дополнительных ограждений/барьеров в многопоточной работе.

Смежные вопросы