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]
Другие вопросы по тегам