自从 Microsoft 首次宣布 .NET 任务并行库 (TPL) 以来,我一直非常感兴趣地关注它的开发。
毫无疑问,我们最终会利用 TPL。我要质疑的是,当 Visual Studio 2010 和 .NET 4.0 发布时开始利用 TPL 是否有意义,或者等待一段时间是否有意义。
为什么现在开始?
- .NET 4.0 任务并行库似乎设计得很好,一些相对简单的测试表明它在当今的多核 CPU 上运行良好。
- 自从大约七年前购买我的第一个四核处理器 Dell Poweredge 6400 以来,我一直对使用多个轻量级线程来加速我们的软件的潜在优势非常感兴趣。当时的实验表明,这样做不值得,我将其主要归因于在每个 CPU 的缓存(当时没有共享缓存)和 RAM 之间移动数据的开销。
- 竞争优势——我们的一些客户永远无法获得足够的性能,毫无疑问,我们今天可以使用 TPL 构建更快的产品。
- 听起来很有趣。是的,我意识到有些开发人员宁愿用锋利的棍子戳自己的眼睛,但我们真的很喜欢最大化性能。
为什么要等?
- 随着多核支持的成熟,今天的 Intel Nehalem CPU 是否代表了我们的发展方向?您现在可以购买具有 4 个内核且共享一个 3 级缓存的 Nehalem CPU,并且很可能在 Visual Studio 2010 / .NET 4.0 发布时共享一个 3 级缓存的 6 核 CPU。显然,内核数量会随着时间的推移而增加,但架构呢?随着核心数量的增加,它们还会共享缓存吗?Nehalem 的一个问题是,即使内核之间的互连速度非常快,它们的内存访问 (NUMA) 也不一致,这会导致性能下降和结果的可预测性降低。未来的多核架构能否取消 NUMA?
- 同样,.NET 任务并行库是否会随着成熟而改变,需要修改代码才能充分利用它?
限制
- 我们的核心引擎是 100% C# 并且必须在没有完全信任的情况下运行,因此我们仅限于使用 .NET API。