Page 161 - 《软件学报》2024年第6期
P. 161
陈文杰 等: 面向全分布式智能建筑系统应用程序的并行化编译方法 2737
的隐式遍历操作转换为基于 C 语言数组的运算, 以及生成 Swarm 并行语句所涉及的分布式计算属性 3 个部分, 编
译案例如图 9 所示. 由于篇幅限制, Swarm 并行语句具体编译算法由附录中图 A2 给出.
Swarm 并行语句 C 语言代码
float Ar_0; float Aw_0; float X_0;
Swarm (Nodetype: [ROOM]; VPN: [VAVsystem])
float X_1[6]; float Ar_1;
{ float dOpen_Expected_0(Refer to: damperOpen_Expected @local: Me);
Ar_0 = SIM.dOpen_Expected;
float dOpen_Cor_0(Refer to: damperOpen_Correction @local: Me); Ar_1 = SIM.delta;
float dOpen_Cor_U(Refer to: damperOpen_Correction @local: Upstream); for (i=0; i<6; i++){
float dOpen_Cor_N(Refer to: damperOpen_Correction @local: AllNeighbors); X_1[i] = SIM.Neigh.dOpen_Cor; }
X_0 = X_1[SourcePort];
float delta_0(Refer to: delta @local: Me);
if (Ar_0 != 0){
if (dOpen_Expected_0 != 0)
Aw_0 = Ar_0; }
{ dOpen_Cor_0 = dOpen_Expected_0; } else {
else Aw_0 = max(X_1[SourcePort])*Ar_1;
{ dOpen_Cor_0 = max(dOpen_Cor_U)*delta_0; } }
if ((dOpen_Cor_0 >= 7.5) || (dOpen_Cor_0 <= -7.5)) if (Aw_0 >=7.5 || Aw_0 <= -7.5){
for (i=0;i<6; i++){
{ dOpen_Cor_N = dOpen_Cor_0; }
X_1[i] = Aw_0;
}
Swarm
}}
dOpen_Cor_0 dOpen_Cor_N
dOpen_Expected_0 → Aw0 dOpen_Cor_N → X0
float damperOpen_Correction Me float damperOpen_Correction AllNeighbors
出现在表达式的左侧
(a) 局部参数转换为 C 语言变量 标准化语义模块
{
dOpen_Expected_0 → Ar0; dOpen_Cor_0 → Aw0; dOpen_Cor_N → X1
“Json_Type”: “CBlock_Define”,
“Cblock_Id”: “00000001”,
“Cblock_Type_Id”: “0x00000200”,
“Cblock_Type_Name”: “Swarm_Parallel_Statement”,
dOpen_Cor_N = dOpen_Cor_0; “Data”: [
float Aw_0;
float X_1[6]; “NodeType”: “ROOM”,
dOpen_Cor_N for (i=0; i<NeighborAmount; i++) { “VPN”: “VAVsystem”,
X_1[i] = Aw_0; “SwarmParameter_AwArX_Map”: “dOpen_Expected_0→
} Ar0; delta_0 →Ar1; dOpen_Cor_0→Aw0;
dOpen_Cor_U→X0; dOpen_Cor_N →X1”,
Array of C language : X1[6] “AwArX_Var_Amount”: “2, 1, 2”,
“AwArX_CLanguageVar_Map”: “Ar0 →Ar_0; Ar1 →Ar_1;
(b) 子语句转换为 C 语言代码 Aw0 →Aw_0; Aw1 →Aw_1; X0 →X_0; X1 →X_1 ”,
“cProgram”: “float Ar_0;float Aw_0;float X_0;float X_1[6];
float Ar_1;
dOpen_Cor_N = dOpen_Cor_0;
Ar_0 = SIM.dOpen_Expected;
050X1F (发送至所有邻居节点) Ar_1 = SIM.delta;
dOpen_Cor_N for (i=0; i<6; i++){
X_1[i] = SIM.Neigh.dOpen_Cor;
}} …”,
“CalculationAttribute”: “050X0F, 0X0010, 0X0011, ”,
float damperOpen_Correction AllNeighbors ]
},
(c) 生成分布式计算属性码
图 9 Swarm 并行语句编译示意图
(1) 局部参数转换生成 C 语言中对应的本地读, 本地写和交互变量
并行语句中局部参数的计算域属性隐式表达了参数的读写机制, 屏蔽了分布式计算中消息发送和接收
等通信细节. 但在 C 语言程序中要求显式描述变量的读写机制, 因此需要将 Swarm 并行语句中的参数转换为 C
语言中相应的变量. 本编译系统规定在计算逻辑中只读的本地参数对应的 C 语言变量称为本地输入变量, 即 Ar
变量; 将可以修改的本地参数对应的变量称为本地输出变量, 即 Aw 变量; 将读取或写入邻居节点参数对应的变量
称为交互变量, 即 X 变量. 例如, 计算域为 AllNeighbors 的局部参数 dOpen_Cor_N 表示站在本节点角度所观察到
的所有邻居节点上的风阀开度校核值, 对应于交互变量 X.
该部分算法逻辑为, 遍历 Swarm 并行语句抽象语法树中的所有局部参数, 根据参数名称查询该参数的计算域