该应用程序必须在数千次迭代的非常大的数据集上执行一些计算成本非常高的操作:
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个单元(每单位时间处理的单元)所花费的时间,并将其报告给中央存储库.
>此时间对模拟的一个帧(整个网格)的总时间和问题域的总大小进行加权.因此,每个节点将获得以每个工作单位(矩阵单元格)表示的分数,以及表示其性能与其余网格的标量等级.
>在每个框架上,根据这些分数分配工作负荷,以便每台机器尽可能接近同一时间完成.如果机器A比机器B快100倍,它将在给定的帧中接收100倍的矩阵单元(假设矩阵大小足以保证包括额外的机器).
>离开网格的节点(登录的桌面等)将在其余节点之间重新分配其工作负载.
要么,
以树结构排列节点,其中每个节点都分配了“权重”.树中较高的节点具有基于其能力与其子女的能力相结合的权重.每帧调整此重量.当节点失去与其子节点的通信时,它使用缓存的树图来联系孤立的子节点并重新平衡其分支.
如果它有所不同,该应用程序是C#和OpenCL的组合.
欢迎链接到论文,示例应用程序,尤其是教程.
编辑
这不是功课.我正在把我作为论文一部分写的模拟器变成一个更有用的产品.现在,工作统一分配,不考虑每台机器的性能,也没有从加入或离开电网的机器中恢复的设施.
感谢您提供优质,详尽的回复.
解决方法
>将工作分解成最小的组件(我们知道现在有1000个任务)
>启动一个网络服务器(最好是带有超时的UDP,以避免网络拥塞)向上计数
>启动集群进程.
>每个流程都会问:“我应该执行哪个工作号码?”并且服务器回复一个号码
>当流程结束时,它会询问下一个工作号码.当所有任务完成后,服务器会向进程返回-1,因此它们会关闭.
这是一个比上面建议的更轻的替代品.您的快速处理器仍然比较慢的处理器做更多的工作,但您不必计算任务所需的时间.如果处理器因任何原因退出,它将停止询问任务.您的服务器可以选择在一定时间后回收任务编号.
这几乎是集群调度程序自己做的事情,除了处理器没有启动和关闭成本,因此您的个人任务可以更小而不会受到惩罚.