如何在 CuPy 中分配倾斜的 2D 内存?
How to allocate pitched 2D memory in CuPy?
在 CuPy 中,可以在主机上分配多维 ndarray
,然后使用 CUDA 将其复制到 GPU。我的问题是:
- CuPy 分配的内存是否对设备上的矩阵(二维数组)具有很好的合并内存访问属性,如果是,那与
cupy.ndarray.strides
有何关系。如果不是,为什么不呢?
- 为什么 CuPy 没有使用
cudaMalloc2D
、cudaMalloc3D
、cudaMallocPitch
?
我的目标是将带有 width
和 height
的二维数组复制到全局内存(不是纹理内存 - 是 支持的)。在 C++ 中,我可以用类似的东西来做到这一点:
float* devPtr = nullptr;
size_t devPitch;
cudaMallocPitch((void **) &devPtr, &devPitch, sizeof(float) * width, height);
cudaMemcpy2D(devPtr, devPitch, my_array.data(),
width * sizeof(float), width * sizeof(float), height,
cudaMemcpyHostToDevice);
但我无法在 CuPy 中找到一种似乎可以保证我在自定义内核中需要的倾斜属性的方法。我试图 "use the source, Luke" 找出真正发生的事情,但找不到对 CUDA 代码的调用来实现这样的结果。
倾斜分配对于某些领域来说过于具体,CuPy 支持一系列用例,其中矩阵正在重塑,视图以不同的步幅创建。此外,对于某些应用程序,数据需要是连续的,并且通过使用倾斜分配,Cuda 会自动在维度之间引入填充。
您可以通过使用 (height, pitch) 分配矩阵并使用形状 (height, width) 获取视图来自己模拟此行为。应调整间距值以匹配所需数据类型的对齐方式。
在 CuPy 中,可以在主机上分配多维 ndarray
,然后使用 CUDA 将其复制到 GPU。我的问题是:
- CuPy 分配的内存是否对设备上的矩阵(二维数组)具有很好的合并内存访问属性,如果是,那与
cupy.ndarray.strides
有何关系。如果不是,为什么不呢? - 为什么 CuPy 没有使用
cudaMalloc2D
、cudaMalloc3D
、cudaMallocPitch
?
我的目标是将带有 width
和 height
的二维数组复制到全局内存(不是纹理内存 - 是 支持的)。在 C++ 中,我可以用类似的东西来做到这一点:
float* devPtr = nullptr;
size_t devPitch;
cudaMallocPitch((void **) &devPtr, &devPitch, sizeof(float) * width, height);
cudaMemcpy2D(devPtr, devPitch, my_array.data(),
width * sizeof(float), width * sizeof(float), height,
cudaMemcpyHostToDevice);
但我无法在 CuPy 中找到一种似乎可以保证我在自定义内核中需要的倾斜属性的方法。我试图 "use the source, Luke" 找出真正发生的事情,但找不到对 CUDA 代码的调用来实现这样的结果。
倾斜分配对于某些领域来说过于具体,CuPy 支持一系列用例,其中矩阵正在重塑,视图以不同的步幅创建。此外,对于某些应用程序,数据需要是连续的,并且通过使用倾斜分配,Cuda 会自动在维度之间引入填充。
您可以通过使用 (height, pitch) 分配矩阵并使用形状 (height, width) 获取视图来自己模拟此行为。应调整间距值以匹配所需数据类型的对齐方式。