在多核机器上扩展多线程应用程序
-
08-06-2019 - |
题
我正在开展一个项目,我们需要更多的性能。随着时间的推移,我们不断改进设计以实现更多的并行工作(线程和分布式)。最新的一步是将其一部分转移到一台具有 16 核的新机器上。我发现我们需要重新思考如何在共享内存模型中扩展到这么多核心。例如,标准内存分配器不够好。
人们会推荐哪些资源?
到目前为止我找到了萨特的专栏博士。多布斯是一个良好的开端。我刚刚收到《多处理器编程的艺术》和《O'Reilly》有关英特尔线程构建模块的书
其他提示
您可能想查看 Google 的性能工具. 。他们发布了用于多线程应用程序的 malloc 版本。它还包括一组很好的分析工具。
Jeffrey Richter 非常热衷于线程。他的书中有一些关于线程的章节,请查看他的博客:
正如 monty python 所说的“现在是完全不同的事情”——您可以尝试一种不使用线程,但使用进程和消息传递(无共享状态)的语言/环境。最成熟的之一是 erlang (以及这本优秀而有趣的书: http://www.pragprog.com/titles/jaerlang/programming-erlang)。可能与您的情况并不完全相关,但您仍然可以学到很多可以应用于其他工具的想法。
对于其他环境:
.Net 有 F#(用于学习函数式编程)。JVM 有 Scala(它有 actor,非常像 Erlang,并且是函数式混合语言)。另外还有 Doug Lea for Java 的“fork join”框架,它可以为您完成大量艰苦的工作。
FreeBSD 中的分配器最近获得了 FreeBSD 7 的更新。新的叫做 杰马洛克 并且对于多线程来说显然更具可扩展性。
您没有提到您正在使用哪个平台,所以也许这个分配器可供您使用。(我相信 Firefox 3 使用 jemalloc, ,即使在 Windows 上。所以端口一定存在于某个地方。)
我有时会去看看 Hoard、Google Perftools 和 jemalloc。目前,我们使用英特尔线程构建模块中的可扩展_malloc,它的性能足够好。
无论好坏,我们在 Windows 上使用 C++,尽管我们的大部分代码都可以用 gcc 编译。除非有令人信服的理由迁移到 redhat(我们使用的主要 Linux 发行版),否则我怀疑迁移是否值得头痛/政治麻烦。
我很想使用 Erlang,但现在有很多方法可以重做。如果我们考虑一下电信环境中 Erlang 开发的要求,就会发现它们与我们的世界(电子交易)非常相似。阿姆斯特朗的书在我的书架上:)
在从 4 核扩展到 16 核的测试中,我学会了了解代码并行部分中任何锁定/争用的成本。幸运的是,我们有很大一部分可以随数据扩展,但即使这样,由于额外的锁和内存分配器,一开始也不起作用。
我维护一个并发链接博客,可能会引起人们持续的兴趣: