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

时间:2008-08-09 15:42:18

标签: performance multithreading scalability malloc

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

人们会推荐哪些资源?

到目前为止,我发现Sutter的专栏Dobbs博士是一个好的开始。 我刚刚获得了多处理器编程的艺术和关于英特尔线程构建模块的O'Reilly书籍

8 个答案:

答案 0 :(得分:6)

其他一些有用的书籍是:

此外,请考虑减少并发进程之间的共享状态。如果可以避免它,你会扩展得更好,更好,因为你将能够分割出独立的工作单元,而不必在它们之间进行同样多的同步。

即使您需要共享某个状态,也可以查看是否可以将共享状态与实际处理进行分区。这将使您可以并行执行尽可能多的处理,而不必将已完成的工作单元集成回共享状态。显然,如果您在工作单元之间存在依赖关系,则这不起作用,但值得研究,而不是仅仅假设状态总是将被共享。

答案 1 :(得分:3)

您可能想查看Google's Performance Tools。他们发布了他们用于多线程应用程序的malloc版本。它还包括一组很好的分析工具。

答案 2 :(得分:2)

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

对于其他环境:

.Net有F#(学习函数式编程)。 JVM有Scala(有演员,非常像Erlang,是功能混合语言)。还有来自Doug Lea for Java的“fork join”框架,它为你做了很多艰苦的工作。

答案 3 :(得分:2)

杰弗里·里希特(Jeffrey Richter)经常穿线。他在书中有几个关于线程的章节,并查看他的博客:

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

答案 4 :(得分:1)

FreeBSD中的分配器最近获得了FreeBSD 7的更新。新的一个叫做jemaloc,对于多个线程来说显然更加可扩展。

您没有提到您正在使用的平台,因此也许您可以使用此分配器。 (我相信Firefox 3 uses jemalloc,即使在Windows上也是如此。所以端口必须存在于某个地方。)

答案 5 :(得分:0)

我维护一个可能持续感兴趣的并发链接博客:

http://concurrency.tumblr.com

答案 6 :(得分:0)

如果您正在进行大量内存分配,请查看Hoard

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

答案 7 :(得分:0)

我必须在某个时候退房Hoard,Google Perftools和jemalloc。目前我们正在使用英特尔线程构建模块中的scalable_malloc,它运行良好。

无论好坏,我们在Windows上使用C ++,虽然我们的许多代码都可以使用gcc进行编译。除非有令人信服的理由转向使用redhat(我们使用的主要Linux发行版),否则我怀疑移动会带来头痛/政治麻烦。

我很想使用Erlang,但现在有很多方法可以重做它。如果我们考虑在电信公司环境中围绕Erlang开发的要求,它们与我们的世界(电子交易)非常相似。阿姆斯特朗的书在我看书堆:)

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