1

我相信我正在使用 OpenMP 进行错误共享。有什么方法可以识别并修复它吗?

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

与单线程 1 核版本相比,使用 4 核 CPU 仅产生 10% 的额外性能。当使用 NUMA 32 个物理(64 个虚拟)CPU 系统时,CPU 利用率卡在 1.5 个内核左右,我认为这是错误共享和无法扩展的直接症状。

我还尝试使用英特尔 VTune 分析器运行它,它表明大部分时间都花在了“f()”和“+=”函数上。我相信这是合理的,并不能真正解释为什么我的缩放比例如此之差......

有什么想法/建议吗?

谢谢。

4

2 回答 2

2

使用归约而不是根据线程 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;
于 2012-01-27T00:54:13.293 回答
1

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

valgrind --tool=cachegrind [command]
于 2012-01-27T15:02:28.173 回答