考虑一个问题宽度等于N的VLIW处理器:这意味着它能够同时启动N个操作,因此每个非常长的指令可以包含最大N个操作。
假设VLIW处理器加载一个非常长的指令,其中包含具有不同延迟的操作:属于同一非常长指令的操作可以在不同的时间结束。如果一个操作在属于相同长指令的其他操作之前完成了它的执行,会发生什么?后续操作(即属于下一个非常长的指令的操作)能否在执行当前非常长的指令的其余操作之前开始执行?还是一个很长的指令等待属于当前超长指令的所有操作完成?
发布于 2012-07-11 16:02:41
VLIW背后的想法是,编译器可以为处理器并行处理许多事情,并将它们打包成称为“超长指令词”的包。
Amhdahl定律告诉我们并行程序的加速(例如VLIW指令的并行部分)受到最慢部分(例如最长的子指令)的限制。
VLIW和“长延迟”的简单回答是“不要将子指令与不同的延迟混合在一起”。实际的答案是VLIW机器尽量不使用具有不同延迟的子指令;更理想的情况是,您需要“一个时钟”子指令。通常,即使是内存取取也只需要一个时钟,因为它被划分为“内存取取开始(这是要取的地址)”,唯一的可变延迟子指令是“等待先前的提取到达”,其思想是编译器生成尽可能多的其他计算,以便内存获取延迟被其他指令混合。
发布于 2012-07-16 19:45:59
我见过的大多数VLIW处理器都支持具有不同延迟的操作。
应该由编译器来安排这些指令,并确保操作数在执行操作之前可用。VLIW处理器是哑的,不检查操作之间的任何依赖关系。当一个长指令字执行时,单词中的每个操作只从寄存器文件中读取其输入数据,并在同一周期结束时将其结果写回,如果一个操作需要两个或三个周期,则写入结果。
只有当指令是确定性的,并且总是采用相同的循环数时,这才能起作用。我见过的所有VLIW架构的操作周期都是固定的,不短,也不多。如果它们确实需要更长的时间(例如外部内存获取),整个机器就会简单地停止工作。
现在有一件关键的事情限制了具有不同延迟的指令的调度:寄存器文件的端口数。端口是寄存器文件和操作的执行单元之间的连接。在VLIW处理器中,每个操作在一个问题槽中执行,并且每个发行槽都有到寄存器文件的自己的端口。端口在硬件方面是昂贵的。端口越多,实现注册文件所需的硅就越多。
现在考虑以下情况,即一个两个周期的操作希望将其结果写入寄存器文件,同时将其作为一个排在其后面的单周期操作。现在出现了冲突,因为两个操作都希望在同一个端口上写入相同的寄存器文件。同样,编译器的任务是确保这种情况不会发生。在许多VLIW体系结构中,在同一个问题时隙中执行的操作数都具有相同的延迟。这样就避免了这场冲突。
现在回答你的问题:
您曾经说过:“如果一个操作在属于相同长指令的其他操作之前完成了它的执行,会发生什么情况?”
没什么特别的事。处理器继续执行下一个非常长的指令字。
您说:“后续操作(即属于下一个非常长的指令的操作)能否在当前非常长的指令的其余操作执行之前开始执行?”
是的,但这可能会在稍后出现寄存器端口冲突。应该由编译器来防止这种情况。
你说:“还是一个很长的指令等待完成属于当前非常长指令的所有操作?”
不是的。处理器在每一个周期简单地进入下一个非常长的指令字。有一个例外,那就是当一个操作花费的时间比正常长,例如,因为有一个缓存丢失,然后管道被停止,并且机器不会在下一个长指令字上前进。
https://stackoverflow.com/questions/11436162
复制相似问题