我有一个关于硬件选择及其对软件开发的影响的应用程序级别(PThreads)问题。
我在一个多核的单CPU盒上测试了多线程代码。
我正在决定为我的下一台机器买什么:
我的问题是,如果我选择双CPU盒,这会严重影响代码的移植吗?或者,我可以分配更多的线程并让操作系统处理其余的线程吗?
换句话说,在PThreads应用程序的上下文中,多处理器编程与(单CPU)多线程有什么不同吗?
我认为这在这个级别上没有什么不同,但是当配置一个新的盒子时,我注意到每个CPU都需要购买单独的内存。就在那时我遇到了一些认知失调。
有关代码的更多细节(对于那些感兴趣的人来说):--我从磁盘读取了大量数据到一个巨大的内存块(~24 to,很快就会更多),然后我生成我的线程。最初的内存块是“只读”(由我自己的代码策略强制执行),因此我不会对该块进行任何锁定。当我看到4核双CPU盒时,我感到很困惑,因为它们似乎需要单独的内存。在我的代码中,如果我分配了一堆额外的线程,我不知道会发生什么。操作系统会将我的内存块从一个CPU的内存库复制到另一个内存库吗?--这将影响我必须购买多少内存(增加这种配置的成本)。理想的情况(按成本计算和编程方便)是让双CPU共享一个大内存库,但如果我正确理解,这在新的英特尔双核MOBO(比如惠普ProLiant ML350e)上是不可能的。
发布于 2012-10-05 04:32:39
对于您正在查看的x86盒,内存物理连接到不同的CPU套接字这一事实是一个实现细节。从逻辑上讲,机器的总内存显示为一个大池--您不需要更改应用程序代码就可以在两个CPU之间正确运行。
然而,表现则是另一回事。交叉套接字内存访问有速度上的损失,因此未经修改的程序可能无法充分发挥其潜力。
不幸的是,很难提前判断您的代码是在6核、单节点框还是8核双节点框上运行得更快。即使我们能看到您的代码,它最终也将是一个有教养的猜测。有几件事要考虑:
有很多变量,所以最好的做法是向你的惠普转卖商询问与你所考虑的配置相匹配的贷款机。然后,您可以测试您的应用程序,看看它在哪里表现最好,并相应地订购您的硬件。
发布于 2012-10-04 18:46:35
如果没有更多的细节,就很难给出详细的答案。但是,希望下面的内容能够帮助您解决这个问题。
如果您的线程代码是正确的(例如,正确地锁定共享资源),则不应该遇到硬件架构更改带来的任何错误。不正确的线程代码有时会被特定平台如何处理CPU缓存访问/共享之类的细节所掩盖。
由于在单芯片、多核和多芯片备选方案中的内存和缓存管理方法不同,每个等效核的应用程序性能可能会发生变化。
具体来说,如果您正在查看每个CPU都有单独内存的硬件,我将假设每个线程将被锁定到它启动的CPU上(否则,系统将不得不为将线程的内存移动到专用于不同内核的内存而产生巨大的开销)。这可能会降低系统的整体效率,这取决于您的具体情况。但是,每个核心单独的内存也意味着不同的CPU不会为给定的缓存线相互竞争(每个双CPU上的4个核心仍可能争夺缓存线,但这比6个核心争夺相同的缓存线的竞争少)。
这种类型的缓存线争用称为假共享。我建议阅读下面的内容来理解这是否是你面临的一个问题
http://www.drdobbs.com/parallel/eliminate-false-sharing/217500206?pgno=3
底线是,如果您遵循正确的线程开发实践,应用程序行为应该是稳定的(当然不是依赖于线程调度的细节),但是性能可能会随您正在做的事情而改变。
https://stackoverflow.com/questions/12733640
复制相似问题