我相信我正在使用OpenMP进行虚假共享。有没有办法识别并修复它?
我的代码是:https://github.com/wchan/libNN/blob/master/ResilientBackpropagation.hpp第36行。
与单线程1核心版本相比,使用4核CPU只能获得10%的额外性能。当使用NUMA 32物理(64虚拟)CPU系统时,CPU利用率大约停留在1.5个核心,我认为这是错误共享的直接症状,无法扩展。
我也尝试使用英特尔VTune分析器运行它,它表示大部分时间花在“f()”和“+ =”函数上。我相信这是合理的,并没有真正解释为什么我会变得如此糟糕...... ...
有任何想法/建议吗?
感谢。
答案 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]