c++ - OpenMP 虚假共享

标签 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 个内核左右,我认为这是错误共享和无法扩展的直接症状。

我还尝试使用 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/

相关文章:

c++ - 在着色器中动态变化

c++ - 通过 std::vector 的迭代似乎只在一个函数中被破坏

c++ - 将类型分配给 typename 关键字

linux - 如何强制单线程执行?

c++ - 更好地使用openmp

c++ - 在成员函数中测试 this 指针是否合法 C++?

c++ - 如何在函数typedef中使用result_of

作为属性的 C++ COM 对象

c++ - 遍历所有可能的位排列

c - OpenMP 循环对同一个串行循环给出不同的结果