Когда A [] было выделено с помощью malloc, ОС только обещала, что вы получите память, на которую указывает указатель.Фактическое выделение памяти не было выполнено, то есть страницы физической памяти еще не были назначены.Это происходит, когда вы выполняете первую параллельную область, где вы впервые касаетесь данных (см. Также «Политика первого касания»).Когда происходит первый доступ, ОС создает физическую страницу в том же домене NUMA, который выполняет трогательный поток.
Итак, в зависимости от того, как вы выберете c0
, вы получите определенное распределение страниц памяти по всемусистема.Приложив немного математики, вы можете определить, какое значение c0
приведет к тому, какое распределение страниц памяти.
Во втором цикле вы используете c1
, который потенциально отличается от c0
.Для определенных значений c1
(особенно, c1
, равных c0
) вы почти не увидите трафика NUMA в системе, в то время как для других вы увидите много.Опять же, просто определить эти значения математически.
Еще одна вещь, с которой вы можете столкнуться, это ложное разделение.Если c0
и c1
выбраны так, что данные, обрабатываемые чанком, меньше размера строки кэша, вы увидите, что строка кэша распределяется между несколькими потоками и, таким образом, отскакивает между различными кэшамисистема.