OpenMP虚假共享

时间:2012-01-27 00:50:34

标签: c++ c++11 openmp false-sharing

我相信我正在使用OpenMP进行虚假共享。有没有办法识别并修复它?

我的代码是:https://github.com/wchan/libNN/blob/master/ResilientBackpropagation.hpp第36行。

与单线程1核心版本相比,使用4核CPU只能获得10%的额外性能。当使用NUMA 32物理(64虚拟)CPU系统时,CPU利用率大约停留在1.5个核心,我认为这是错误共享的直接症状,无法扩展。

我也尝试使用英特尔VTune分析器运行它,它表示大部分时间花在“f()”和“+ =”函数上。我相信这是合理的,并没有真正解释为什么我会变得如此糟糕...... ...

有任何想法/建议吗?

感谢。

2 个答案:

答案 0 :(得分:2)

使用reduction而不是根据线程ID显式索引数组。该阵列几乎可以保证虚假共享。

即。替换这个

#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 :(得分:1)

确定的一种方法是使用像cachegrind这样的工具查看缓存统计信息:

valgrind --tool=cachegrind [command]