在CuPy中,可以在主机上分配多维ndarray
,然后使用CUDA将其复制到GPU。我的问题是:
CuPy分配的内存是否对设备上的矩阵(2D阵列)具有很好的合并内存访问属性,如果是,则与cupy.ndarray.strides
有什么关系。如果没有,为什么不呢?
为什么CuPy不使用cudaMalloc2D
,cudaMalloc3D
,cudaMallocPitch
?
我的目标是将具有width
和height
的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中找到一种方法来似乎可以保证自定义内核中需要的螺距属性。我试图“使用源代码,卢克”来找出实际发生的情况,但是找不到能够实现这种结果的CUDA代码调用。
最佳答案
间距分配对于某些领域来说太具体了,CuPy支持一系列用例,其中矩阵被重塑并且视图以不同的步幅创建。同样,对于某些应用程序,要求数据是连续的,并且通过使用间距分配,Cuda会自动在尺寸之间引入填充。
您可以自己通过分配矩阵(高度,间距)并采用形状(高度,宽度)来模拟这种行为。应调整音调的值,以使对齐方式与所需的数据类型相匹配。