小编Mat*_*ger的帖子

内存合并与矢量化内存访问

我试图了解NVIDIA GPU/CUDA 上的内存合并与x86-SSE/C++ 上的矢量化内存访问之间的关系。

我的理解是:

  • 内存合并是内存控制器的运行时优化(在硬件中实现)。在运行时确定需要多少内存事务来完成 warp 的加载/存储。除非有完美的合并,否则可能会重复发出经线的加载/存储指令。
  • 内存向量化是一种编译时优化。矢量化加载/存储的内存事务数量是固定的。每个向量加载/存储指令只发出一次。
  • Coalescable GPU 加载/存储指令比 SSE 矢量加载/存储指令更具表现力。例如,st.global.s32PTX 指令可以存储到 32 个任意内存位置(warp 大小 32),而movdqaSSE 指令只能存储到连续的内存块中。
  • CUDA 中的内存合并似乎可以保证有效的向量化内存访问(当访问可合并时),而在 x86-SSE 上,我们必须希望编译器实际对代码进行向量化(它可能无法这样做)或使用 SSE 内在函数手动对代码进行向量化,这对程序员来说比较困难。

这样对吗?我是否错过了一个重要方面(可能是线程屏蔽)?

现在,为什么 GPU 有运行时合并?这可能需要硬件中的额外电路。与 CPU 中的编译时合并相比,主要优点是什么?是否存在由于缺少运行时合并而更难在 CPU 上实现的应用程序/内存访问模式?

cuda gpu simd cpu-architecture coalescing

4
推荐指数
1
解决办法
1030
查看次数

标签 统计

coalescing ×1

cpu-architecture ×1

cuda ×1

gpu ×1

simd ×1