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


CuPy分配的内存是否对设备上的矩阵(2D阵列)具有很好的合并内存访问属性,如果是,则与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中找到一种方法来似乎可以保证自定义内核中需要的螺距属性。我试图“使用源代码,卢克”来找出实际发生的情况,但是找不到能够实现这种结果的CUDA代码调用。

最佳答案

间距分配对于某些领域来说太具体了,CuPy支持一系列用例,其中矩阵被重塑并且视图以不同的步幅创建。同样,对于某些应用程序,要求数据是连续的,并且通过使用间距分配,Cuda会自动在尺寸之间引入填充。

您可以自己通过分配矩阵(高度,间距)并采用形状(高度,宽度)来模拟这种行为。应调整音调的值,以使对齐方式与所需的数据类型相匹配。

07-24 09:27