在多核计算机上扩展多线程应用程序

时间:2020-03-05 18:38:46  来源:igfitidea点击:

我正在做一个项目,我们需要更高的性能。随着时间的流逝,我们一直在不断改进设计,使其可以并行工作(包括线程和分布式)。然后,最新的步骤是将其一部分移至具有16核的新计算机上。我发现我们需要重新考虑如何将事情扩展到共享内存模型中的那么多核心。例如,标准内存分配器不够好。

人们会推荐哪些资源?

到目前为止,我发现萨特专栏《多布斯博士》是一个不错的开始。
我刚收到《多处理器编程的艺术》和有关英特尔线程构建模块的O'Reilly书

解决方案

回答

我们可能要查看Google的效果工具。他们已经发布了用于多线程应用程序的malloc版本。它还包括一组不错的性能分析工具。

回答

杰弗里·里希特(Jeffrey Richter)投入了大量精力。他在书本中有关于穿线的几章内容,并查看他的博客:

http://www.wintellect.com/cs/blogs/jeffreyr/default.aspx。

回答

FreeBSD中的分配器最近对FreeBSD 7进行了更新。新的分配器称为jemaloc,显然可以在多个线程上扩展。

我们没有提到正在使用哪个平台,因此也许我们可以使用此分配器。 (我相信Firefox 3甚至在Windows上也使用jemalloc。因此端口必须存在于某个地方。)

回答

其他一些对我们有帮助的书籍包括:

  • 同步算法和并发编程
  • 并行编程模式
  • C. A. R. Hoare交流的顺序过程(该链接上的经典免费PDF)

另外,请考虑减少对并发进程之间共享状态的依赖。如果可以避免的话,我们将获得更大,更好的扩展,因为我们将能够分解出独立的工作单元,而不必在它们之间进行过多的同步。

即使我们需要共享某些状态,也请查看是否可以从实际处理中对共享状态进行分区。这样一来,我们就可以并行进行尽可能多的处理,而与将完成的工作单元集成回共享状态无关。显然,如果我们在工作单元之间有依赖关系,那么这是行不通的,但是值得研究,而不仅仅是假设状态总是要共享。

回答

正如monty python会说"现在要使用完全不同的东西"一样,我们可以尝试一种不使用线程,但使用进程和消息传递(无共享状态)的语言/环境。最成熟的语言之一是erlang(这本出色而有趣的书:http://www.pragprog.com/titles/jaerlang/programming-erlang)。可能与情况不完全相关,但是我们仍然可以学习很多可以在其他工具中应用的想法。

对于其他环境:

.Net具有F(用于学习函数式编程)。
JVM具有Scala(具有参与者,非常类似于Erlang,并且是功能混合语言)。此外,还有Doug Lea for Java的" fork join"框架,它为我们完成了许多艰苦的工作。

回答

如果我们要进行大量的内存分配,请看一下Hoard。

滚动我们自己的无锁列表。 C中有很好的资源,但是这些想法是可移植的。一旦习惯了它们的工作方式,我们就会开始看到可以使用它们的其他地方,而不仅仅是在列表中。

回答

我将不得不在某个时间结帐Hoard,Google Perftools和jemalloc。目前,我们使用的是Intel Threading Building Blocks的scalable_malloc,它的性能足够好。

不管是好是坏,我们在Windows上使用C ++,尽管我们的许多代码都可以使用gcc编译。除非有令人信服的理由迁移到redhat(我们使用的主要Linux发行版),否则我怀疑是否值得转移头痛或者政治麻烦。

我很想使用Erlang,但现在这里有很多方法可以重做。如果我们考虑在电信环境中开发Erlang的需求,那么这与我们的世界(电子交易)非常相似。阿姆斯特朗的书在我的书架上:)

在从4核扩展到16核的测试中,我学会了理解代码并行部分中任何锁定/争用的代价。幸运的是,我们有很大一部分可以随数据扩展,但是由于额外的锁定和内存分配器,即使一开始它也不起作用。

回答

我维护着一个并发链接博客,该博客可能会引起人们的持续关注:

http://concurrency.tumblr.com