ENQCMDMOVDIR64B是Intel DSA中的两条指令.

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

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

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

MOVDIR64B的帮助下,为Intel DSA创建了一个new API-__iowrite512(),它以原子方式写入64字节.

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

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

我的 idea 是,相差8倍的可能性较小,但后者会更快.我可以知道速度有多快吗?是否在任何地方记录?我没有Intel DSA,因此我不确定如何测试它.

此外,ENQCMD还有什么其他好处?它会被分解成几个微操作吗?如果是,那么哪些微操作可以执行ENQCMD

推荐答案

iowrite64使用UC访问MMIO空间,因此写操作是序列化的,而不是流水线的.也就是说,单个CPU线程一次只能执行一次UC写入,并且CPU在MMIO写入完成之前不会继续执行.

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

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

MOVDIR64B的主要优点是描述符一次到达设备,而不是一片一片地到达.设备不必担心接收部分描述符或接收交错的两个描述符的部分.事实上,"英特尔DSA"会忽略对入口的小于64字节的写入.

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

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

Linux相关问答推荐

在Zenity进度窗口上单击取消后如何停止bash脚本

列出Linux上特定目录和子目录名称的bash命令

为什么将JAX与Docker一起安装会创建如此大的镜像?

如何将数据从Linux内核中的块驱动程序持久存储到存储中?

在树莓派内核中找不到arch/arm/kernel/calls.S

如何在具有多种可能性的linux shell中获取最大值和最小值?

为什么我在从 Linux 通过 telnet 发送 Ctrl-C 后停止接收数据?

删除一行和它之前的一行

sed:用空格替换

中的换行符

如何在 DolphinDB 中递归查找目录中的所有文件?

为什么rsp寄存器从0x7FFFFFFFDFD0开始

从 bash shell 等效项在fish shell 上设置 $ANDROID_SDK_ROOT

在三星 chromebook 上编程

DMA 和内存映射 IO 有什么区别?

如何仅使用 SED 获得第二行

如何对 /dev/random 或 /dev/urandom 进行 base64 编码?

CLOCK_MONOTONIC 和 CLOCK_MONOTONIC_RAW 有什么区别?

如何通过进程名获取PID?

Postgresql -bash:psql:找不到命令

Linux:删除多个文件的文件扩展名