OpenMP False Sharing
Я считаю, что я испытываю ложный обмен с использованием OpenMP. Есть ли способ идентифицировать и исправить это?
Мой код: https://github.com/wchan/libNN/blob/master/ResilientBackpropagation.hpp строка 36.
Использование 4-ядерного процессора по сравнению с однопоточным 1-ядерным вариантом дало лишь 10% дополнительной производительности. При использовании физической (64 виртуальной) процессорной системы NUMA 32 загрузка процессора составляет около 1,5 ядер, я думаю, что это является прямым признаком ложного совместного использования и невозможности масштабирования.
Я также попытался запустить его с помощью профилировщика Intel VTune, он заявил, что большую часть времени тратится на функции "f()" и "+=". Я считаю, что это разумно и не объясняет, почему у меня такое плохое масштабирование...
Есть идеи / предложения?
Благодарю.
2 ответа
Используйте сокращение вместо явной индексации массива на основе идентификатора потока. Этот массив фактически гарантирует ложное разделение.
т.е. заменить это
#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;
Один из способов узнать наверняка - посмотреть статистику кеша с помощью такого инструмента, как cachegrind:
valgrind --tool=cachegrind [command]