H2O*_*aCl 6 .net parallel-processing
我怀疑我将很快耗尽单个计算机中多核处理线程的速度提升.
这个.NET桌面程序员需要学习什么才能将并行可行的问题转移到多台计算机上?我倾向于最小化整个生命周期编程工作,因此如果内部部署和外部部署之间的变化很小,则首选.
关于程序员工时,在Windows上对于这样的应用程序,Linux,LAMP还是其他一些堆栈方式比C#.NET更好?
编辑: 下面我自己的评论中的一些其他信息.问题的计算密集型部分可以任意大,因此分配/重新组合的开销不用担心,因为开销只占您必须等待结果的一小部分时间.这是一个单人开发团队.只是一个建议,我不知道它是否有任何好处:WCF和XML如何以完全本地Azure无知的方式分发问题,并相信它(有一天)将在Azure上工作改变,没有Azure感知的好处.这只是一个未经研究的想法,我希望有人有更好的想法,即使它不是Windows解决方案.
另一个编辑: Digipede提供了性能改进和关于群集和网格之间区别的论文.
http://www.digipede.net/downloads/Digipede_CCS_Whitepaper.pdf
由于我的问题比集群更像网格,我想要便宜地做,我只是尝试WCF方法.
从多线程转移到分布式计算时要注意的主要事项是,与在当前计算机上的另一个线程进行假脱机相比,在远程计算机上更换作业的开销增加.工作项的粒度需要足够大,以证明节点之间的通信速度明显较慢 - 同一台计算机上的线程之间的消息传递比通过网络的不同计算机之间的消息传递快许多个数量级.
跨机器共享资源更加困难.在同一进程中的多个线程中共享内存中的对象很简单,但需要一些工程来实现跨机器的类似.锁定基本上不存在于机器之间.期待使用消息队列服务/服务器来协调多台机器之间的工作,将结果返回到聚合器等.
你提到"内部与场外".如果您正在考虑外部计算资源,请务必搜索云计算或弹性计算服务提供商.奇怪的是,这些并不像你想象的那样与并行编程同时使用.云计算为您提供了将并行性扩展到数百或数千个计算节点的选项,只有在您实际使用它们时才需要付费.当您的计算完成,或者要分析的数据的实时源在一天结束时回家时,您可以"点亮"您的云节点并停止计费时钟,直到您再次启动它们.
亚马逊,谷歌和微软是云服务的三大提供商(其中包括),每个都有不同的特点,优势和劣势.我在微软的Azure工作.Azure的内置消息队列非常灵活,可以大规模运行生产者/消费者工作流程.
无论您使用LAMP还是.NET作为您的平台,都不是关于性能问题,而是更多关于开发团队中的工具和技能.故意选择与开发团队技能组合不匹配的目标平台,这是为项目进度安排增加大量时间和重新培训成本的好方法.
与C++或其他环境中的脚本相比,C#/ .NET在编写并行系统方面效果很好.在评估哪种平台最适合您的技能组合和所需的系统设计时,请考虑语言功能,调试工具以及可用的预构建库和服务.
在我看来,使用 WCF 创建计算场机制非常简单。由于您已经在 Windows 上使用 C#,因此与切换语言或技术堆栈相比,这是一个自然的进展。
此过程的早期步骤是设计一种机制,使计算工作者可以向主机通告其可用性。主机要么对工作人员有先验知识,要么(更好)他们需要一致的机制来“定位”服务器,例如在众所周知的域中。将主机放在 www.all-your-cycles-belong-to-us.org 上,您是否希望拥有一个 WCF 服务来提供计算时间的传入服务。如果你的委托机制可以根据工作人员的数量进行自我调整,那就更好了。
在 Master 和 Worker 之间定义服务、数据和故障契约可能需要一些实验才能实现编程优雅、计算吞吐量和灵活性/面向未来的最佳平衡。
根据经验,这种(和其他)方法面临的挑战是:
工人安静下来。
在重新建立与主站的通信之前,很难判断是由于网络问题、长时间“忙碌”还是实际停机。在我的日常工作中,我们有数千台机器定期“打电话回家”,并且一小时不打电话回家就被认为是“停机”。您是否应该让另一个工人去做同样的工作,或者等待任意时间让原来的工作完成?只有您知道您的算法,但是两种方法的混合可能会有所帮助。
虐待工人。
如果您的计算问题确实很困难,您可以将所有工作线程的 CPU 调平。这可以接受吗?如果您租用 CPU 周期,那么可以。如果你在闲置的机器上分配备用周期(就像 SETI 那样),那么不行。
结果到达时无序。
如果不同的工作人员在不同的时间完成,您的结果集是否可以由主机按照正确的顺序重新组装?
代码版本控制。
如果修复代码,如何将其发送给所有工作人员以确保他们拥有正确的版本?解决这个问题有很多选择,但值得尽早考虑而不是稍后考虑。
不同的工人。
如果您不知道这些工作线程具有不同的规格,那么让顶级多 CPU 工作线程与低级单核单 CPU 机器一起参与您的计算场将会产生奇怪的行为。调整 WCF 接口以允许 Worker 提示它可以承担多少负载可能值得关注。