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

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

2 ответа

Решение

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

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

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

Другие вопросы по тегам