我有一个使用情况,其中x86 CPU必须将64个字节的数据写入已经映射到用户空间的PCIe从设备的内存中。目前,我使用memcpy来完成这项工作,但结果证明它非常慢。我们可以使用Intel SSE intrinsics(例如_mm_stream_si128)来加速吗?或者除了使用DMA之外,还有其他机制可以使用吗?
目标是将所有64个字节打包成一个TLP,并在PCI总线上发送,以减少开销。
目标是将所有64个字节打包成一个TLP,并在PCI总线上发送,以减少开销。
movq mem, xmm
进行的8B存储与从mov mem, r64
进行的存储相同。memcpy
(或使用四个movdqa
或两个AVX vmovdqa
自己进行)是浪费时间,除非您预计生成64B的代码速度很慢,并且更可能在中途被打断而不是memcpy。定时器中断可以随时发生,包括在您进行memcpy期间,如果您处于无法禁用中断的用户空间。由于无法保证完整的64B写入,99.99%的完整缓存行写入机会与99.99999%的机会可能没有区别。
流式存储到MMIO区域可能避免CPU在上一个写操作的clflush
之后进行读取以获取所有权。 clwb
尚不可用,因此唯一的选择是使用clflush
,它会将数据从缓存中逐出。
memcpy()
实现没有使用SSE指令吗? - Jason Rmemcpy()
,或者通过反汇编C库文件来检查。你会发现memcpy()
通常在你的平台上被很好地优化了,因为它经常被使用。 - Jason R