6

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

人们会推荐什么资源?

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

4

8 回答 8

6

其他几本书会有所帮助:

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

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

于 2008-08-09T22:13:12.233 回答
3

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

于 2008-08-09T16:59:53.190 回答
2

Jeffrey Richter 非常喜欢线程化。他的书中有几章是关于线程的,请查看他的博客:

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

于 2008-08-09T17:19:00.610 回答
2

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

对于其他环境:

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

于 2008-08-09T23:26:30.570 回答
1

FreeBSD 中的分配器最近获得了 FreeBSD 7 的更新。新的称为jemaloc,显然对于多线程而言更具可扩展性。

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

于 2008-08-09T18:51:36.803 回答
0

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

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

于 2008-08-10T13:45:43.970 回答
0

我将不得不在某个时候检查 Hoard、Google Perftools 和 jemalloc。目前,我们使用的是 Intel Threading Building Blocks 中的可扩展的_malloc,它的性能足够好。

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

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

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

于 2008-08-10T16:15:10.097 回答
0

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

http://concurrency.tumblr.com

于 2008-09-26T12:07:21.557 回答