【发布时间】:2013-11-22 10:07:53
【问题描述】:
我最近实现了一个递归 negamax 算法,我使用 OpenMP 对其进行了并行化。
有趣的是:
#pragma omp parallel for
for (int i = 0; i < (int) pos.size(); i++)
{
int val = -negamax(pos[i].first, -player, depth - 1).first;
#pragma omp critical
if (val >= best)
{
best = val;
move = pos[i].second;
}
}
在我的 Intel Core i7(4 个物理内核和超线程)上,我观察到一些非常奇怪的现象:在运行算法时,它并没有使用所有 8 个可用线程(逻辑内核),而只使用了 4 个。
谁能解释为什么会这样?我理解算法无法很好扩展的原因,但为什么它不使用所有可用的内核?
编辑:我将 thread 更改为 core,因为它可以更好地表达我的问题。
【问题讨论】:
-
您的临界区似乎太小了。尝试同时更改
best的两个线程可能会输入错误的数字。 -
@Leeor,实际上该算法产生了正确的结果。我的问题是为什么不所有线程都被激活。
-
我知道这不能回答你的问题,它只是一个评论。每次您尝试时它都会返回正确的结果这一事实并不意味着它总是会这样做。
-
@Leeor,为什么我的临界区太小了?我认为只涵盖了更改共享数据的代码。
-
@gg.kaspersky,你的测试也应该被覆盖,即
if (val >= best)在你的关键部分你修改best,但是测试在外面..
标签: c++ performance openmp