Каким образом круговое планирование OpenMP может повлиять на производительность ccNUMA? - PullRequest
0 голосов
/ 01 июля 2019

Я пытаюсь понять системы ccNUMA, но меня немного смущает то, как планирование OpenMP может снизить производительность. Допустим, у нас есть следующий код. Что происходит, если c1 меньше, чем c0 или больше? Я понимаю общая идея о том, что разный размер чанка приводит к удаленному доступу, но я где-то читал, что для маленьких чанков что-то происходит со строками кэша, и я действительно запутался.

#pragma omp parallel for schedule(static,c0)
  for(int i=0;i<N;i++)
      A[i]=0;
#pragma omp parallel for schedule(static,c1)
  for(int i=0;i<N;i++)
      B[i]=A[i]*i;

1 Ответ

2 голосов
/ 01 июля 2019

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

Итак, в зависимости от того, как вы выберете c0, вы получите определенное распределение страниц памяти по всемусистема.Приложив немного математики, вы можете определить, какое значение c0 приведет к тому, какое распределение страниц памяти.

Во втором цикле вы используете c1, который потенциально отличается от c0.Для определенных значений c1 (особенно, c1, равных c0) вы почти не увидите трафика NUMA в системе, в то время как для других вы увидите много.Опять же, просто определить эти значения математически.

Еще одна вещь, с которой вы можете столкнуться, это ложное разделение.Если c0 и c1 выбраны так, что данные, обрабатываемые чанком, меньше размера строки кэша, вы увидите, что строка кэша распределяется между несколькими потоками и, таким образом, отскакивает между различными кэшамисистема.

...