Параллельное чтение разделяемой памяти в многоядерной среде

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

1

Решение

гарантированно только читать, и никто не пишет в него, тогда ты в порядке.

Проблема возникает, когда какой-либо поток читает из переменной, в то время как какой-то другой поток пишет в нее, что на практике встречается на удивление часто.

По какой-то причине когерентность кеша стала большой темой. Независимо от того, если у вас есть поток, у которого есть указатель на переменную, ваша скомпилированная программа разыменует этот указатель, чтобы получить адрес памяти переменной и будет читать из нее. Согласованность кэша не мешает чтению работать, даже если к нему обращаются 2 потока. Производительность может пострадать, в зависимости от того, как процессор управляет кэшированными страницами — процессору все равно придется читать страницу, содержащую переменную, и, вероятно, будет кешировать ее, здесь не будет никакой разницы, чем чтение глобальной переменной или той, которая размещена в куче. Ваша C ++ программа не знает о строках кэша, скомпилированные машинные инструкции не знают о C ++ переменных. Из того, что я понимаю, строка кэша в x86 составляет 64 байта, и хотя это правда, что запись в адрес памяти, который находится рядом с вашей общей переменной, заставит ЦП обновить свой кеш (т.е. перечитать переменную в кеш ЦП) все равно не хуже, чем использование любой другой глобальной переменной.

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

4

Другие решения


По вопросам рекламы [email protected]