c# – 并行处理应用程序中的负载平衡
我正在构建一个网络分布式并行处理应用程序,它在许多机器上使用CPU和GPU资源的组合.
该应用程序必须在数千次迭代的非常大的数据集上执行一些计算成本非常高的操作: for step = 0 to requested_iterations for i = 0 to width for j = 0 to height for k = 0 to depth matrix[i,j,k] = G*f(matrix[i,k]) 此外,矩阵运算必须同步执行:也就是说,每次迭代都取决于紧接在它之前的帧的结果. 此ad-hoc网格中可用的硬件(包括专用服务器和空闲桌面计算机)在不同机器之间的性能差异很大.我想知道最好的方法是平衡整个系统的工作量. 一些特质: >网格应尽可能健壮.一些模拟需要数周才能运行,如果100台机器中有一台脱机,那么不必取消运行会很好. 到目前为止,我能想出的最好的想法是: >让每个节点跟踪处理矩阵中的一组n个单元(每单位时间处理的单元)所花费的时间,并将其报告给中央存储库. 要么, 以树结构排列节点,其中每个节点都分配了“权重”.树中较高的节点具有基于其能力与其子女的能力相结合的权重.每帧调整此重量.当节点失去与其子节点的通信时,它使用缓存的树图来联系孤立的子节点并重新平衡其分支. 如果它有所不同,该应用程序是C#和OpenCL的组合. 欢迎链接到论文,示例应用程序,尤其是教程. 编辑 这不是功课.我正在把我作为论文一部分写的模拟器变成一个更有用的产品.现在,工作统一分配,不考虑每台机器的性能,也没有从加入或离开电网的机器中恢复的设施. 感谢您提供优质,详尽的回复. 解决方法
对于异构集群,我喜欢让每个处理器在处理器可用时请求新作业.实现涉及一个轻量级服务器,可以一次处理多个请求(但通常只返回一个作业号).实现可能会是这样的:
>将工作分解成最小的组件(我们知道现在有1000个任务) 这是一个比上面建议的更轻的替代品.您的快速处理器仍然比较慢的处理器做更多的工作,但您不必计算任务所需的时间.如果处理器因任何原因退出,它将停止询问任务.您的服务器可以选择在一定时间后回收任务编号. 这几乎是集群调度程序自己做的事情,除了处理器没有启动和关闭成本,因此您的个人任务可以更小而不会受到惩罚. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- c# – 绑定DataGridComboBoxColumn SelectedIndex
- 使用C#/ VBScript获取mdb文件(msaccess)中的所有源代码
- flash总结
- Howt to delay code execute when using dwr ajx in javasc
- c – 线程本地存储(TLS)和OpenMP
- c# – 在WinForms窗体中设置Form.Text不会更新标题
- Cocos从入门到精通--《创建第一个项目:HelloWorld》
- 解析XML文件,生成 String
- ruby-on-rails – 为什么Heroku不会在Windows中接受我的Gem
- vue中路由验证和相应拦截的使用详解