多核编程:硬件

Jon*_*rop 14 .net c# parallel-processing f# multicore

我正在写一本关于使用.NET 4进行多核编程的书,我很想知道人们发现多核编程的哪些部分难以理解或预计难以理解?

Ira*_*ter 7

什么是并行化的有用工作单元,以及如何查找/组织一个?

如果你分叉一个小于分叉开销的工作,那么所有这些并行原语都没有用; 事实上,这会给你一个很好的减速而不是你期望的.

因此,一个重大问题是找到明显比并行原语更昂贵的工作单元.这里的一个关键问题是没有人知道执行任何成本,包括并行原语本身.明确校准这些成本将非常有帮助.(顺便说一句,我们设计,实现并且每天使用并行编程语言,PARLANSE,其目的是通过允许编译器生成和优化它们来最小化并行原语的成本,目标是缩小工作量"更多可并行化的").

人们也可以考虑讨论大哦符号及其应用.我们都希望并行原语花费O(1).如果是这种情况,那么如果您发现成本为O(x)> O(1)的工作,则该工作是并行化的良好候选者.如果您提出的工作也是O(1),那么它是否有效取决于常数因素,我们将重新校准如上所述.

如果没有足够大的部件,那就是将工作收集到足够大的单元中的问题.代码运动,算法替换,...​​都是实现这种效果的有用的想法.

最后,存在synchnonization的问题:我的并行单元何时必须交互,我应该使用什么原语,以及这些原语花费多少?(超出预期!).


Bri*_*ian 6

我想其中一些取决于这本书/观众的基本或高级程度.当你第一次从单线程编程转到多线程编程时,你通常会从一个巨大的悬崖上掉下来(许多人永远无法恢复,看看所有关于Control.Invoke的混乱问题).

无论如何,添加一些关于编程本身的想法,以及更多关于软件过程中的其他相关任务:

  • 测量:确定您要改进的度量标准,正确测量它(很容易意外地测量错误的东西),使用正确的工具,区分信号与噪声,解释结果并理解它们的原因.

  • 测试:如何编写容忍不重要的非确定性/交错的测试,但仍然确定正确的程序行为.

  • 调试:工具,策略,"难以调试"意味着反馈,以改善您的代码/设计和更好的分区可变状态等.

  • 物理与逻辑线程关联:理解GUI线程,了解例如F#MailboxProcessor/agent如何封装可变状态并在多个线程上运行但总是只有一个逻辑线程(一个程序计数器).

  • 模式(以及它们适用时):fork-join,map-reduce,producer-consumer,...

我希望会有大量的观众,例如"帮助,我有一个CPU利用率为12%的单线程应用程序,而且我希望学到足够的东西,使其在没有太多工作的情况下快4倍"和更小的受众例如"我的应用程序在我们添加内核时会进行次线性扩展,因为这里似乎存在争用,是否有更好的使用方法?",因此可能会为每个受众提供一些挑战.


Yin*_*Zhu 5

因为你在.Net中编写了一本完整的多核编程书.

我想你也可以超越多核心.

例如,您可以使用在.Net中的分布式系统中讨论并行计算的章节.不太可能,.Net中还没有成熟的框架.DryadLinq是最接近的.(另一方面,Hadoop及其在Java平台上的朋友真的很棒.)

您还可以使用演示某些GPU计算内容的章节.


Ric*_*ard 3

理解:低级内存细节,例如内存获取和释放语义之间的差异。

其余的大部分概念和想法(任何东西都可以交织、竞争条件……)只要稍微使用一下就不那么困难了。

当然,实践非常困难,特别是有时出现故障时,因为您需要在多个抽象级别上工作才能了解正在发生的情况,因此请保持设计简单,并尽可能设计出锁定等的需要。 (例如使用不可变数据和更高级别的抽象)。