OpenMP False Sharing - PullRequest
       9

OpenMP False Sharing

1 голос
/ 27 января 2012

Мне кажется, что я испытываю ложный обмен при использовании OpenMP. Есть ли способ идентифицировать и исправить это?

Мой код: https://github.com/wchan/libNN/blob/master/ResilientBackpropagation.hpp строка 36.

Использование 4-ядерного ЦП по сравнению с однопоточной 1-ядерной версией принесло лишь 10% дополнительной производительности. При использовании физической (64 виртуальной) процессорной системы NUMA 32 загрузка ЦП ограничивается примерно 1,5 ядрами, я думаю, что это является прямым признаком ложного совместного использования и невозможности масштабирования.

Я также пытался запустить его с помощью профилировщика Intel VTune, в котором говорилось, что большую часть времени тратится на функции "f ()" и "+ =". Я считаю, что это разумно и не объясняет, почему у меня такое плохое масштабирование ...

Есть идеи / предложения?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 27 января 2012

Используйте сокращение вместо явной индексации массива на основе идентификатора потока.Этот массив фактически гарантирует ложное совместное использование.

, т. Е. Замените

#pragma omp parallel for 
    clones[omp_get_thread_num()]->mse() += norm_2(dedy);

for (int i = 0; i < omp_get_max_threads(); i++) {
     neural_network->mse() += clones[i]->mse();

следующим:

#pragma omp parallel for reduction(+ : mse)
     mse += norm_2(dedy);

neural_network->mse() = mse;
1 голос
/ 27 января 2012

Один из способов точно узнать статистику кэша с помощью такого инструмента, как cachegrind:

valgrind --tool=cachegrind [command]
...