【发布时间】:2009-06-12 15:12:02
【问题描述】:
VS 7.1 发布模式似乎无法正确并行化线程,而调试模式却可以。以下是正在发生的事情的摘要。
首先,就其价值而言,这是并行化的主要代码,但我认为这不是问题:
// parallelize the search
CWinThread* thread[THREADS];
for ( i = 0; i < THREADS; i++ ) {
thread[i] = AfxBeginThread( game_search, ¶llel_params[i],
THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED );
thread[i]->m_bAutoDelete = FALSE;
thread[i]->ResumeThread();
}
for ( i = 0; i < THREADS; i++ ) {
WaitForSingleObject(thread[i]->m_hThread, INFINITE);
delete(thread[i]);
}
THREADS 是我设置的全局变量,如果我想更改线程数,我会重新编译。为了提供一些背景信息,这是一个搜索游戏位置的游戏程序。
下面是发生的对我来说没有意义的事情。
首先,在调试模式下编译。如果我将 THREADS 设置为 1,则一个线程可以搜索大约 13,000 个位置。如果我将 THREADS 设置为 2,每个 线程将搜索大约 13,000 个位置。太好了!
如果我在发布模式下编译并将 THREADS 设置为 1,线程会设法搜索大约 30,000 个位置,这是我在从调试转移到发布时经常看到的典型加速。但这里是踢球者。当我用 THREADS = 2 编译时,每个线程只搜索大约 15,000 个位置。显然是 THREADS = 1 的一半,所以有效的发布编译没有给我任何有效的加速。 :(
当这些东西运行时观察任务管理器,当 THREADS = 1 我看到我的双核机器上的 CPU 使用率为 50% 时,当 THREADS = 2 我看到 100% 的 CPU 使用率。但是发布编译似乎给了我 50% 的有效 CPU 使用率。还是什么?!
有什么想法吗?我应该在属性页中设置什么吗?
更新:下面也发布了以下内容,但建议我更新此帖子。也有人建议我发布代码,但这是一个相当大的项目。我希望其他人过去自己也遇到过这种行为,并且可以对正在发生的事情有所了解。
我在四核系统上运行程序,得到了一致但仍然令人困惑的结果。我知道我即将摆脱特定的编程问题并变得有点抽象,但我真的很想听听您可能需要帮助解释我所看到的数字的任何 cmets。对于所有这些测试,我运行了 30 秒,根据任务管理器,所有线程在整个 30 秒内都在全力运行。
在调试模式下运行时,如果我使用 1 个线程运行,它会完成 X 量的工作。如果我运行 2 个线程,每个线程都会完成 X 量的工作。与 3 和 4 线程类似。缩放是完美的。
在发布模式下运行时,会发生以下情况:
使用 1 个线程:它完成了 Y 量的工作,其中 Y 几乎是 X 的两倍。
使用 2 个线程:每个线程完成 Y 量的工作。再次,完美缩放。
使用 3 个线程:1 个线程完成 Y 量的工作,其他 2 个线程完成 2/3 Y 量的工作。我已经损失了大约 2/3 的 CPU,即使一个可能完全空闲。任务管理器显示 75% 的 CPU 使用率。
使用 4 个线程:1 个线程完成 Y 量的工作。其他 3 个线程完成了 1/2 Y 的工作量。现在我损失了大约 1.5 个 CPU 的计算量。任务管理器显示 100% 的 CPU 使用率。
明显的问题是:
(1) 重复前面的问题,Debug 模式是否可以很好地扩展,但不是 Release?
(2) 为什么一个核心总是能得到充分利用,而其他核心似乎脱落了?这种缺乏对称性令人不安。
(3) 为什么其他的都掉下来了?内存带宽之前建议过,但这似乎是一个非常高昂的价格。
欢迎任何 cmet 或见解。而且,一如既往,谢谢!
【问题讨论】:
标签: c++ multithreading