ENQCMD指令的优点和微操作是什么?



ENQCMDMOVDIR64B是Intel DSA中的两条指令。

MOVDIR64B从源地址读取64字节,并对目的地址进行64字节的直接存储操作。ENQCMD指令允许软件编写命令来排队寄存器,这些寄存器是使用内存映射I/O (MMIO)访问的特殊设备寄存器。

我的问题是——设计这两个指令的目的是什么?

根据我的理解,设置内存映射的IO区(寄存器)需要操作系统的支持,即设备驱动程序。在设置了MMIO区域之后,我们可以使用write()系统调用访问它,这也是在设备驱动程序中实现的。对于一般的体系结构,Linux支持iowrite64()一次写入8字节的值。因此,如果我们想写入64字节,需要调用iowrite64()8次。

MOVDIR64B的帮助下,对于Intel DSA,创建了一个新的API -__iowrite512(),它自动写入64字节。

我同意后一种至少比前一种更有效,但我对传输数据所需的时间感到困惑。

考虑以下情况:如果我们有一个支持MOVDIR64BENQCMD的设备(Intel DSA),假设我们想从内存传输64字节的数据到MMIO寄存器。有两个选项:iowrite64()8次(使用循环);或__iowrite512()一次。后一个会比前一个快8倍吗?

我的想法是,它不太可能是8倍的差异,但后者会更快。我可以知道它会快多少吗?有文档记录吗?我没有英特尔DSA,所以我不知道如何测试它。

此外,ENQCMD还有什么其他好处?会不会拆分成几个微操作?如果是,那么ENQCMD做了哪些微操作?

iowrite64使用UC访问MMIO空间,因此写操作是序列化的,而不是流水线的。也就是说,一个CPU线程一次只能执行一个UC写操作,直到MMIO写操作完成,CPU才会继续执行。

MOVDIR64B有可能比单个iowrite64更快,因为它使用WC内存类型而不是UC(即使目标地址是UC)。CPU发出写操作后,可以继续执行。多个直接存储可以流式传输到设备。这意味着在一个CPU线程中可以同时运行多个直接存储。

据我所知,实际将数据传输到目的地的时间是相同的,无论大小(1到64字节之间)。当然,这取决于SoC内数据路径的宽度,对于不同的实现可能会有所不同。

MOVDIR64B的主要优点是描述符一次到达设备,而不是碎片。设备不必担心接收部分描述符或接收两个交错描述符的部分。事实上,Intel DSA忽略了对门户的小于64字节的写入。

要实现流写的全部好处,来自单个CPU线程的每个MOVDIR64B的目标地址应该不同。每个Intel DSA门户都是一个4096字节的页面,因此每个门户中有64个唯一的地址。来自单个CPU的描述符写入可以跨64个地址进行分割。(来自多个cpu的写入是否使用相同或不同的地址并不重要,但通常情况下,您不会期望多个cpu在DSA中使用相同的专用WQ。)

ENQCMD允许设备响应软件,无论它是否接受描述符。这允许多个应用程序使用相同的共享WQ,而不会因为共享WQ已满而丢失描述符。应用程序可以在没有任何驱动程序参与的情况下(在设置之后)提交描述符,并且在应用程序之间没有任何锁定或通信。

最新更新