Согласно курсу 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;
}
}
Мои вопросы следующие:
- Это только потому, что мы можем использовать меньше операций с памятью, чтобы получить data, а затем мы можем улучшить производительность почти в 5 раз?
- С точки зрения numaclt, на основе документации linux, это позволяет нам связывать процессы с указанными c узлами или процессорами. Когда мы используем команду
numactl -m 1
, мы можем получить улучшение в 5 раз. Я не уверен, что улучшение связано с задержкой связи NUMA.