我和四边邻居写了经典的游戏“生活”。当我在调试中运行它时,它说:
连续版本:4.2s
并行版本:1.5s
Okey,很好。但是,如果我在发行版中运行它,它会说:
连续版: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
)。
主要部分放在StartSimulation
函数中。如果您运行该程序,您将在控制台中看到一些带有运行时间的俄语文本。
程序代码足够大,因此我将其与文件托管一起添加-main.cpp(l2对我来说意味着“实验室2”)
关于StartSimulation
函数的一些注释。我将带有单元的2D曲面切成小矩形。这是通过AdjustKernelsParameters
函数完成的。
最佳答案
我觉得这个比率并不奇怪。具有多个线程进行协作是一项复杂的业务,并且会产生开销。
对共享内存的访问需要进行序列化,这通常涉及某种形式的锁定机制和线程之间的争用,它们必须等待释放锁。
此类共享变量需要在处理器内核之间进行同步,这可能会显着降低速度。同样,编译器需要将这些关键区域作为“顺序点”进行不同的处理。
当使用共享变量时,所有这些减小了处理器硬件和编译器中每个线程的每个线程优化的范围。
在这种情况下,似乎并行化的开销超过了单线程情况下的优化可能性。
如果每个线程在需要访问共享变量之前需要做更多的工作,那么这些开销将变得不那么重要。