c++ - 游戏 "Life"中发布版本和调试版本之间的加速比奇怪

标签 c++ multithreading parallel-processing openmp

我和四边形邻居一起写了经典游戏“生活”。当我在调试中运行它时,它说:

  • 连续版本:4.2s
  • 并行版本:1.5s

好的,很好。但是如果我在 release 中运行它,它会说:

  • 连续版本:0.46s
  • 并行版本:1.23s

为什么?我在有 4 个内核的计算机上运行它。我在并行部分运行 4 个线程。答案是正确的。但是有些地方有泄漏,我不知道那个地方。谁能帮帮我?


我尝试在 Visual Studio 2008 和 2012 中运行它。结果是一样的。在项目设置中启用了 OMP。

要重复我的问题,您可以找到定义的常量 PARALLEL 并将其设置为 1 或 0 以相应地启用和禁用 OMP。答案将在 out.txt 中(out.txt - 正确答案示例)。输入必须在 in.txt 中(我的输入 - in.txt )。有一些俄语符号,你不需要理解它们,但是 in.txt 中的第一个数字表示并行部分要运行的线程数(它是 4 in示例)。

主要部分放在StartSimulation函数中。如果您运行该程序,您将在控制台中看到一些带有运行时间的俄语文本。

程序代码够大,我加了文件托管-main.cpp (l2 对我来说是“实验室 2”)

关于StartSimulation 函数的一些评论。我将带有单元格的 2D 表面切割成小矩形。它由 AdjustKernelsParameters 函数完成。

最佳答案

我不觉得这个比例很奇怪。让多个线程协作是一项复杂的业务,并且会产生开销。

对共享内存的访问需要序列化,这通常涉及某种形式的锁定机制和线程之间的争用,线程之间必须等待锁被释放。 此类共享变量需要在处理器内核之间同步,这可能会显着降低速度。此外,编译器需要将这些关键区域区别对待为“序列点”。

当每个线程使用共享变量时,所有这些都减少了处理器硬件和编译器中每个线程优化的范围。

在这种情况下,并行化的开销似乎超过了单线程情况下的优化可能性。

如果每个线程在需要访问共享变量之前有更多的工作要独立完成,那么这些开销就会不那么重要。

关于c++ - 游戏 "Life"中发布版本和调试版本之间的加速比奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22269538/

相关文章:

c++ - 在 MASM 中调用 C++ 函数

c++ - 从 64 位窗口的 user32.dll 的 translatemessage() api 抛出的第一次机会异常

c++ shared_ptr 从 char* 到 void*

c - 如何将MPI阻塞发送和接收修改为非阻塞

linux - 并行 gnu 命令与管道结合使用

java - 使用 ConcurrentHashMap 实现并行性

c++ - 搜索具有多个匹配项的元素

c++ - Floyd-Warshall STP 实现

java - 为什么这个类不是线程安全的?

c# - 尽管是try/catch,但是异常会结束线程吗?