【问题标题】:PCIE 64 Byte single burst TransactionPCIE 64 字节单突发事务
【发布时间】: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 之类的事情其他处理器不相关的缓存线)。

标签: x86 intel avx pci pci-e


【解决方案1】:

正如你们所说,我已将 _mm256_stream_load_si256() 与 wc 内存一起使用,我现在也可以读取 64 字节。我就是这样用的

__m256i a =   _mm256_stream_load_si256 ((__m256i*)mem_base + 0);
__m256i b =   _mm256_stream_load_si256 ((__m256i*)mem_base + 1);
_mm_mfence();

谢谢大家的帮助

【讨论】:

  • 请注意,在内核内部使用 XMM / YMM 寄存器仅在 kernel_fpu_begin() / kernel_fpu_end(); 内部是安全的。否则你会默默地破坏用户空间状态。此外,这需要 AVX,如果没有它,CPU 就会出现故障。
  • 我是用户空间应用程序中的这个_mm256_stream_load_si256(),所以我需要使用kernel_fpu_begin() / kernel_fpu_end(); .为什么需要它?
  • 哦,那你的问题不应该被标记为linux-kernel;我为你修好了。 kernel_fpu_begin 仅在内核代码中需要。 tthtlc.wordpress.com/2016/12/17/…。用户空间当然可以运行 SIMD 和浮点指令,无需任何特殊设置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-11
  • 2020-06-05
  • 2013-08-31
  • 2021-04-06
  • 2011-11-20
相关资源
最近更新 更多