如何在CuPy中分配音调2D内存

How to allocate pitched 2D memory in CuPy?

本文关键字:2D 内存 分配 CuPy      更新时间:2023-10-16

在CuPy中,可以在主机上分配多维ndarray,然后使用CUDA将其复制到GPU。我的问题是:

  • 对于设备上的矩阵(2D阵列(,CuPy分配的内存是否具有良好的合并内存访问特性,如果是,这与cupy.ndarray.strides有何关系。如果没有,为什么不呢
  • 为什么CuPy不使用cudaMalloc2DcudaMalloc3DcudaMallocPitch

我的目标是将具有widthheight的2D阵列复制到全局内存(而不是纹理内存,支持纹理内存(。在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中找不到一种方法来保证我在自定义内核中所需要的倾斜属性。我试图"使用源代码,Luke"来了解真正发生了什么,但找不到对CUDA代码的调用能达到这样的结果。

Pitched分配对于某些域来说太具体了,CuPy支持一系列用例,其中矩阵正在重塑,视图是以不同的步长创建的。此外,对于某些应用程序,数据需要连续,并且通过使用倾斜分配,Cuda会自动在维度之间引入填充。

您可以通过分配具有(高度、间距(的矩阵和具有形状(高度、宽度(的视图来模拟这种行为。应调整间距值,使其与所需数据类型的对齐匹配。