gpt4 book ai didi

sse - 我们可以使用 SSE 内在函数写入内存映射的 PCI 设备内存吗

转载 作者:行者123 更新时间:2023-12-05 01:13:35 34 4
gpt4 key购买 nike

我有一个用例,其中 x86 CPU 必须将 64 字节的数据写入内存已 mmapp 到用户空间的 PCIe 从属设备。截至目前,我使用 memcpy 来执行此操作,但事实证明它非常慢。我们可以使用像 _mm_stream_si128 这样的英特尔 SSE 内在函数来加速它吗?或使用 DMA 以外的任何其他机制。

目的是将所有的64字节打包成一个TLP发送到PCI总线上,以减少开销。

最佳答案

据我了解,内存映射 I/O 不会使某些存储指令变得特殊。 movq mem, xmm 中的 8B 存储与 mov mem, r64 中的存储相同。

我认为如果你有 64B 可以写入 MMIO,你应该使用生成时最有效的指令来执行它,然后刷新缓存行。生成一个 64B 的缓冲区然后做 memcpy(或者自己用四个 movdqa,或者两个 AVX vmovdqa)是浪费时间,除非您希望生成 64B 的代码速度较慢,并且比 memcpy 更有可能在中途中断。如果您处于无法禁用中断的用户空间,则定时器中断可以随时出现,包括在您的 memcpy 期间。由于您不能保证完整的 64B 写入,完整缓存行写入的可能性为 99.99%,而概率为 99.99999%。不会有什么不同。

Streaming stores到 MMIO 区域可能会避免 CPU 在上一次写入的 clflush 之后执行所有权读取。 clwb isn't available yet, so the only option is clflush, which evicts the data from cache .


非时间加载/存储是所谓的弱排序。 IDK,如果这意味着您需要更多围栏来保证订购。

流式加载/存储的一个用例是 copying from uncacheable memory, like video RAM .我不确定是否将它们用于 MMIO。我找到了 this article about it , 谈论如何从 MMIO 中读取而不只是获取相同的缓存值。

关于sse - 我们可以使用 SSE 内在函数写入内存映射的 PCI 设备内存吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32248810/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com