0

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

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

4

1 回答 1

1

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

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

于 2019-11-18T09:31:10.613 回答