假设我有一个简单的“虚拟机”模型,它将指令队列保存为以下格式之一:
unary_opcode, in_address, out_address
binary_opcode, in1_address, in2_address, out_address
其中所有地址都是内存单元数组的整数。
是否有任何众所周知的算法分析指令序列并尝试尽可能地并行化它们:
答案 0 :(得分:1)
如果指令A在列表中的指令B之前,并且((B读取A的写入之一)或(B和A具有相同的写地址)或(B写入A' s中的一个读取)),然后从B到A添加有向边。注意此图是DAG,因为指令按特定顺序。
现在计算"层"指令为:没有输出边的指令是第1层。只有N层和更低层的输出边的指令是N + 1层。显然,如果一条指令对另一条指令有一个外向边缘,而另一条指令的图层还不知道,那么就不要指定它!有一个简单的递归例程,用于从每条指令中分配像DFS一样工作的层。
现在,第i层的指令可以在第i个周期运行(但不会很快),这是最佳的。
如果并行机器能够熄灭先前指令的写入(在这种情况下可以删除写写冲突边缘),则可以做得更好一些。正是我的意思是,当给出一批要并行执行的指令时,如果其中一些指令具有相同的写地址,则机器会确定性地将批处理中的-last-指令的结果写回到该地址(而不是具有未指定的行为,或者在写入该地址的批处理中不确定地写回-some-指令的结果。)