Если у меня есть программа C ++ с распараллеливанием OpenMP, где разные потоки постоянно используют какой-то небольшой общий массив только для чтение данные из него, ложный обмен происходит в этом случае? другими словами, ложное совместное использование связано только с операциями записи в память, или это также может происходить с операциями чтения из памяти.
Обычно используются протоколы когерентности кэша, такие как МЭСИ (измененный, эксклюзивный, общий, недействительный), имеют определенное состояние для строк кэша, называемое «общий». Строки кэша находятся в этом состоянии, если они читаются несколькими процессорами. Каждый процессор затем имеет копию строки кэша и может безопасно читать с нее без ложного обмена. При записи все процессоры информируются об аннулировании строки кэша, которая является основной причиной ложного разделения
Ложный общий доступ — это проблема производительности, поскольку он вызывает дополнительное перемещение строки кэша, что требует времени. Когда две переменные, которые на самом деле не являются общими, находятся в одной и той же строке, и отдельные потоки обновляют каждую из них, строка должна перескакивать вокруг машины, что увеличивает задержку каждого доступа. В этом случае, если переменные находятся в отдельных строках, каждый поток будет хранить локально измененную копию «своей» строки, и перемещение данных не потребуется.
Однако, если вы не обновляете строку, перемещение данных не требуется, и при совместном использовании не происходит никакого влияния на производительность, за исключением того факта, что вы могли иметь возможность получать данные, которые нужны каждому потоку, а не данные, которые ему не нужны. т. Это небольшой эффект второго порядка. хоть. Так что, если вы не знаете, что объем кеша ограничен, игнорируйте его!