происходит ли ложный обмен при чтении данных в openmp?

Если у меня есть программа C ++ с распараллеливанием OpenMP, где разные потоки постоянно используют какой-то небольшой общий массив только для чтение данные из него, ложный обмен происходит в этом случае? другими словами, ложное совместное использование связано только с операциями записи в память, или это также может происходить с операциями чтения из памяти.

3

Решение

Обычно используются протоколы когерентности кэша, такие как МЭСИ (измененный, эксклюзивный, общий, недействительный), имеют определенное состояние для строк кэша, называемое «общий». Строки кэша находятся в этом состоянии, если они читаются несколькими процессорами. Каждый процессор затем имеет копию строки кэша и может безопасно читать с нее без ложного обмена. При записи все процессоры информируются об аннулировании строки кэша, которая является основной причиной ложного разделения

4

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

Ложный общий доступ — это проблема производительности, поскольку он вызывает дополнительное перемещение строки кэша, что требует времени. Когда две переменные, которые на самом деле не являются общими, находятся в одной и той же строке, и отдельные потоки обновляют каждую из них, строка должна перескакивать вокруг машины, что увеличивает задержку каждого доступа. В этом случае, если переменные находятся в отдельных строках, каждый поток будет хранить локально измененную копию «своей» строки, и перемещение данных не потребуется.

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

4

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