这是一个关于RISC-V中向量扩展的问题。 目前,我正在考虑调整我的自定义 RTOS 以支持矢量扩展。
在查看向量扩展的规范后,我了解到向量寄存器的大小取决于 vlen。当在任务之间执行向量寄存器的上下文交换时,如果 vlen 为 64 位或更少,则执行 vle64.v 指令 31 次就足够了(不包括 v0)。然而,如果 vlen 是 2048 或 4096,向量寄存器的上下文交换所需的时间就会变得巨大。
如果基于每个任务管理上下文,可以预见每次任务切换时上下文交换都会消耗大量时间。在向量扩展版本 1.0-rc2-draft 中,解释了提供 mstatus.VS 字段以避免不必要的上下文交换。然而,切换任务时无法避免上下文交换,因为每个任务都有自己的上下文,因此需要上下文交换。
那么,应该如何为向量扩展执行上下文交换?
有一些重要事项需要考虑:
最终,如果有多个任务使用向量寄存器,那么除了在这些任务之间进行上下文切换时保存和恢复向量上下文之外,别无选择。
向量指令和寄存器的使用在一般情况下相对不常见。
由于 1 和 2,操作系统内核倾向于仅在有证据表明用户空间进程/线程实际上正在使用向量寄存器时才管理向量寄存器上下文。如果没有,则无需保存/恢复向量寄存器,因此无需成本。
正如您已经注意到的,这与 RISC-V 的“V”扩展一起工作的方式取决于 mstatus.VS 位字段的使用。
该算法类似于:
创建任务后,mstatus.VS 设置为“关闭”。
如果任务尝试使用向量寄存器,处理器将收到非法指令异常。
响应 2,操作系统内核在任务的控制块中设置一些状态,表示它已使用向量寄存器。然后允许任务继续进行。
当需要切换该任务的上下文时(时间片到期/中断等),3中的状态用于确定向量寄存器上下文是否需要保存在任务的上下文数据结构中。
以上是 RISC-V“V”规范中“软件通常会使用 VS 来减少上下文交换开销”的本质含义。
希望有帮助。