Я предполагаю, что даже чтение из общих данных в openmp вызывает некоторые параллельные издержки, так как в зависимости от архитектуры процессора (если разные ядра имеют свой собственный кэш ...) может потребоваться обновить кэш, чтобы гарантировать отсутствие других процессоров.изменил данные перед чтением.
Правильно ли я думаю об этом?
Если да, то есть ли способ сказать openmp (на fwiw компилятора intel), что некоторые из общих данныхконстанта, поэтому такое обновление кеша не требуется?
Если ответ c ++ const
, есть ли простой способ превратить неконстантные данные в константные данные, фактически не перераспределяя память, как только программапрошел определенную точку во время выполнения?
ОБНОВЛЕНИЕ
Ах, хорошо.Теперь я помню, откуда у меня сложилось впечатление, что const
была хорошей вещью в этом контексте: http://www.akkadia.org/drepper/cpumemory.pdf, раздел 6.4.1.Это связано с ложным разделением, когда переменные readonly, которые совместно используют строки кэша с переменными readwrite, несут штраф за то, что строка кэша помечается как исключительная переменная readwrite.В связанном документе рекомендуется, например, с помощью gcc, пометить эти переменные как __attribute__((section(something.else)))
, чтобы гарантировать, что они будут храниться в другом месте.
Как это происходит, это не имеет значения в моей собственной ситуации - большие массивы и контейнеры данных stlв котором гранулярность чтения / записи будет охватывать много строк кэша и которые в любом случае выделяются из разных пулов памяти.Так что они, естественно, будут расположены на разных строках кеша.Нет проблем!