自微软首次宣布以来,我就一直关注.NET任务并行库(TPL)的开发。
毫无疑问,我们最终会利用TPL。我要质疑的是,在Visual Studio 2010和.NET 4.0发布时是否开始利用TPL是否有意义,或者等待一段时间是否有意义。
为什么现在开始?
- .NET 4.0任务并行库似乎设计得很好,一些相对简单的测试表明它在当今的多核CPU上运行良好。
- 自从七年前购买我的第一台四核处理器Dell Poweredge 6400以来,我一直对使用多个轻量级线程加速我们软件的潜在优势非常感兴趣。当时的实验表明它不值得付出努力,我主要归因于在每个CPU的缓存(当时没有共享缓存)和RAM之间移动数据的开销。
- 竞争优势 - 我们的一些客户永远无法获得足够的性能,毫无疑问,我们现在可以使用TPL构建更快的产品。
- 听起来很有趣。是的,我意识到一些开发人员宁愿用尖锐的棍子捅自己的眼睛,但我们真的很喜欢最大化性能。
为什么要等?
- 今天的英特尔Nehalem CPU代表了我们的目标,因为多核支持成熟了吗?您可以购买具有4个内核的Nehalem CPU,它们共享单个3级缓存,并且在Visual Studio 2010 / .NET 4.0发布时,很可能是6核CPU共享单个3级缓存。显然,核心数量会随着时间的推移而增加,但架构呢?随着核心数量的增加,它们仍会共享缓存吗? Nehalem的一个问题是,即使内核之间存在非常快速的互连,它们也具有非均匀内存访问(NUMA),这会导致性能降低和结果可预测性降低。未来的多核架构是否能够取消NUMA?
- 同样,.NET任务并行库是否会随着成熟而发生变化,需要修改代码才能充分利用它?
限制
- 我们的核心引擎是100%C#,并且必须在没有完全信任的情况下运行,因此我们仅限于使用.NET API。
我现在就开始吧。我强烈怀疑我们已经看到了大部分的变化 - 即使候选版本中有一些调整,我相信它们会在 PFX团队博客,而且容易改变。即使芯片发生变化,我也希望TPL能够在未来的版本中进行适当的调整 - 我个人认为目前的TPL仍然可以比处理任何手工制作的线程代码更好地处理这些新芯片。我们可以写。
我现在看到的一个真正的缺点是,学习资源还没有真正存在。有一些文档,一些博客文章(其中一些将在现在过时)和一些示例代码 - 但没有专门用于PFX的书籍。我相信这些会及时到来 - 如果你在游戏初期,你甚至可以写一个:)
根据您的应用程序,您可能还需要查看 反应性扩展,与PFX携手合作。
我现在就开始吧。我强烈怀疑我们已经看到了大部分的变化 - 即使候选版本中有一些调整,我相信它们会在 PFX团队博客,而且容易改变。即使芯片发生变化,我也希望TPL能够在未来的版本中进行适当的调整 - 我个人认为目前的TPL仍然可以比处理任何手工制作的线程代码更好地处理这些新芯片。我们可以写。
我现在看到的一个真正的缺点是,学习资源还没有真正存在。有一些文档,一些博客文章(其中一些将在现在过时)和一些示例代码 - 但没有专门用于PFX的书籍。我相信这些会及时到来 - 如果你在游戏初期,你甚至可以写一个:)
根据您的应用程序,您可能还需要查看 反应性扩展,与PFX携手合作。
最后,如果您的核心引擎一般可以从并行性中受益,那就更重要了。
是否有很多需要用锁保护的共享状态?如果这是真的,那么可以轻松转移到以无锁数据结构为中心的设计吗?
我认为必须首先回答这些问题,以便他们能够更清楚地了解TPL是否可以提供帮助。
那么 - 你今天反对使用TPL的主要原因似乎如下:
您不知道TPL是否会在未来的多核CPU中占据最大值。
我会说(这只是猜测 - 特别是在计算机科学中你永远无法分辨下一步会发生什么):是的,它们会改变。是的,TPL将在某些方面进行更改,以最大限度地提高性能。但是,一些变化将“陷入困境” - 您将从优化中获益,而无需实际更改单行代码。
即使体系结构发生变化,只能在改变代码的组合中产生更高的性能:我认为这些变化不会影响整个代码 - 也许有一些百分比是每一毫秒非常重要。
替代品在哪里?使用Threadpool?好吧 - 然后TPL更新了。因此,使用它时,您的代码将更加面向未来。例如,VS 2010的调试功能的演示看起来相当不错。
此外,TPL在我看来似乎非常灵活 - 如果它不适合特定情况,你不必在那里使用它。另一方面,它简化了其他地方的开发。
我认为今天最重要的是 认为 关于并行化并将其包含在架构中。 TPL使这个过程更容易。
因此,我的结论是:使用它!
我也会去。我认为的一个重大变化是“范式”从“我们在过去8年中这样做”开发转变为更具功能性/副作用的自由编程。
如果你今天开始使用PFX,我猜它需要一些时间才能快速掌握它,并从字面上移植你的代码以从中获得最大收益。
另一方面,如果PFX在2年内消失或带来重大变化,我希望你的代码仍能更好地运用你所能达到的目标。我们不会再次减少核心数量,并且在很长一段时间内不会过时地完成扩展的大任务。
关于CPU架构的变化:我不能真正评论这些,除了在我看来你的投资现在将导致+ X个月之后的业务优势。 X可能比CPU开发发生重大变化的时间要小 - >你赢了。
我也不会等。
事实上,我会更进一步说不要等待VS2010 / .NET 4.0。 TPL现在可用作.NET 3.5的一部分 .NET的反应性扩展。