【发布时间】:2020-05-16 06:33:13
【问题描述】:
我想在 PCIe 上进行 64 字节事务。我正在使用 Intel i7 第 9 代 CPU。
通过将 PCIe 设备内存设为 WC 区域并写入如下数据,我能够对 PCIe 设备内存进行 64 字节写入事务:
_mm256_store_si256(pcie_memory_address, ymm0);
_mm256_store_si256(pcie_memory_address+32, ymm1);
_mm_mfence();
我尝试使用指令读取 64 字节:
_mm256_loadu_si256();
像写一样使用它,但这里的读取发生为 2* 32 字节读取。
谁能帮我解决这个问题?我想一次性读取 64 字节。
我从这个链接引用了英特尔文档:https://www.intel.com/content/dam/www/public/us/en/documents/white-papers/pcie-burst-transfer-paper.pdf
【问题讨论】:
-
顾名思义
WC,这个特性是关于写结合内存。您可以找到一些有关其工作原理的信息here。实际上,处理器有几个 64 字节的寄存器,它可以缓冲写入(非临时或wc/uc内存),因此多个单独的写入(理想情况下)组合成一个总线事务。缓冲区不加载,如果完全可以避免,您也不想从wc内存加载。也许 AVX512 启用单个 64 字节加载会导致单个总线事务,但我不确定。 -
AFAICT,您应该可以将
_mm256_loadu_si256()替换为_mm_stream_load_si128(),同时保留内存wc。这应该将单个事务中的 64 字节缓存线提取到填充缓冲区中。如果填充缓冲区未在其间被逐出,则来自同一高速缓存行的第二次对齐的 32 字节加载不应导致第二次总线事务(但您可能并不总是能够阻止这种情况,这取决于诸如 read-for-ownership 之类的事情其他处理器不相关的缓存线)。