我相信我遇到了使用 OpenMP 的错误共享。有什么方法可以识别并修复它吗?
我的代码是:https://github.com/wchan/libNN/blob/master/ResilientBackpropagation.hpp第 36 行。
与单线程 1 核版本相比,使用 4 核 CPU 仅产生 10% 的额外性能。当使用 NUMA 32 物理(64 虚拟)CPU 系统时,CPU 利用率停留在 1.5 个内核左右,我认为这是错误共享和无法扩展的直接症状。
我还尝试使用 Intel VTune 分析器运行它,它表示大部分时间花在“f()”和“+=”函数上。我相信这是合理的,并不能真正解释为什么我的扩展性如此差......
有什么想法/建议吗?
谢谢。
最佳答案
使用缩减而不是根据线程 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;
关于c++ - OpenMP 虚假共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9027653/