Почему memkind и numactl сильно улучшают производительность программы? - PullRequest
0 голосов
/ 11 июля 2020

Согласно курсу https://www.coursera.org/learn/parallelism-ia/home/welcome, есть один пример, который пытался проиллюстрировать улучшение API memkind с помощью hbw_posix_memalign((void**)&pixel, 64, sizeof(P)*width*height);. Я думаю, что этот API предоставляет нам только выровненное распределение памяти. Я не знаю, почему это может помочь так улучшить GPflops, как показано ниже. введите описание изображения здесь

Кодирование выполняется следующим образом. Здесь память, в которой хранится img_in, выделяется API memkind.

template<typename P>
void ApplyStencil(ImageClass<P> & img_in, ImageClass<P> & img_out) {
  
  const int width  = img_in.width;
  const int height = img_in.height;

  P * in  = img_in.pixel;
  P * out = img_out.pixel;

#pragma omp parallel for
  for (int i = 1; i < height-1; i++)
#pragma omp simd
    for (int j = 1; j < width-1; j++) {
      P val = -in[(i-1)*width + j-1] -   in[(i-1)*width + j] - in[(i-1)*width + j+1] 
    -in[(i  )*width + j-1] + 8*in[(i  )*width + j] - in[(i  )*width + j+1] 
    -in[(i+1)*width + j-1] -   in[(i+1)*width + j] - in[(i+1)*width + j+1];

      val = (val < 0   ? 0   : val);
      val = (val > 255 ? 255 : val);

      out[i*width + j] = val;
    }
  
}

Мои вопросы следующие:

  1. Это только потому, что мы можем использовать меньше операций с памятью, чтобы получить data, а затем мы можем улучшить производительность почти в 5 раз?
  2. С точки зрения numaclt, на основе документации linux, это позволяет нам связывать процессы с указанными c узлами или процессорами. Когда мы используем команду numactl -m 1, мы можем получить улучшение в 5 раз. Я не уверен, что улучшение связано с задержкой связи NUMA.
...