分类: C/C++
2009-12-18 23:28:43
关于平行计算的讨论
近来对这个比较感兴趣,做了个初步的尝试。
注:本人纯属兴趣,没有研究这方面的发展。
初步的想法是将若干个计算过程分解成相互关联影响至最低的水平的一些计算式,并存储于各个节点中,然后按照节点之间的上级,下级,串行,并行关系,同样做成节点,然后每个节点创建一个线程去做一个流程:
1:逐个判断上级或者相关节点的计算是否完成;完成转到2,否则等待,并记录本节点未完成,或处于等待状态
2:执行本节点的计算式;判断是否继续,如继续则转到3:否则中断,并记录本节点未完成。
3:计算本节点传播的影响;逐个判断与本节点的结果相关的其他节点是否可以执行,若可以则选中相关节点,转向1,否则转向4
4:逐个判断是否可以驱动下级节点,可以则选中该节点,转向则1,否则退出。
这样就形成一个递归或者循环的过程。
关系图如下:
节点流程1--计算a的设置如下:
运行时将计算1-2+3/4*5-(6*pow(2.0,2.0)),将自己的计算结果设置成-21.250000
节点流程2--计算f(x)的设置如下:
运行时将计算 -a / 100 + a*100, 将自己的计算结果设置成-2125.212500
节点流程3--计算a + f(x)设置如下
运行时计算 流程1--计算a * 流程2--计算f(x)的值,并将自己的计算结果设置成45160.765625
当计算节点节点流程3--计算a + f(x)时,根据汇聚条件,将等待所有上级节点计算完毕,然后才进行计算,节点流程2--计算f(x) 由于需要 节点流程1--计算a 的值,所以需要等待 节点流程1--计算a 的计算完成。最终完成整个计算过程。
每一个计算单元作为一个节点Node,每个Node具备如下基本属性:
抽象的Node:
int ID; 唯一标志
string Name;名称
string RunExpr; 此节点将进行的操作, ;运算的脚本或者公式,函数调用或者规则
string Value; 节点的标志,完成、未完成或者中断,运算条件不满足
FlowNodeType NodeType; 节点类型,自动和人工干预
FlowNodeModuleType ModuleType; 下行:串行,并行,异或;上行:或者,并且,异或
Node Parent; 父节点,构成层次关系
实体化的InstanceNode:为重复利用上面的抽象Node,将Node实例化一个流程里的特例
int InsID; 计算流程的唯一标志
int InsNodeID; 实例节点的唯一标志
string InsNodeName; 实例名称
WorkflowNode FlowNode; 实例对应的抽象节点
ActionStatus InsActionStatus;操作的状态
RunningStatus InsStatus; 运行的状态
bool Forced; 是否是强制执行
bool Locked; 是否被锁定
int LoopCounter; 遍历的计数
string ThreadName; 对应的线程名