如何使用 PyCuda mem_alloc_pitch()

How to use PyCuda mem_alloc_pitch()

我最近一直在试用 PyCuda。

我目前想做一些很简单的事情,分配一些内存。我假设我有一些基本的误解,因为这是一项非常简单的任务。我的理解是,使用下面的代码我创建了一个 512 宽、160 高和 1 字节元素大小的 2d Cuda 数组。

下面是一些测试代码。

import pycuda.driver as cuda
import pycuda.autoinit
# Alloc some gpu memory
test_pitch = cuda.mem_alloc_pitch(512,160,1)

当我尝试 运行 此代码时,出现以下错误

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
pycuda._driver.LogicError: cuMemAllocPitch failed: invalid argument

如果有人对我做错了什么有任何见解,我们将不胜感激。

引用自 CUDA 驱动程序 API documentation

cuMemAllocPitch ( CUdeviceptr* dptr, 
                  size_t* pPitch, 
                  size_t WidthInBytes, 
                  size_t Height, 
                  unsigned int  ElementSizeBytes )

The function may pad the allocation to ensure that corresponding pointers in any given row will continue to meet the alignment requirements for coalescing as the address is updated from row to row. ElementSizeBytes specifies the size of the largest reads and writes that will be performed on the memory range. ElementSizeBytes may be 4, 8 or 16 (since coalesced memory transactions are not possible on other data sizes)

在这种情况下,前两个参数是 mem_alloc_pitch 的 return 值,而 ElementSizeBytes 在 PyCUDA 调用中是 access_size

您有:

cuda.mem_alloc_pitch(512,160,1)

即你的 access_size 是 1,这是非法的。只有 4、8 或 16 个是合法的。因此错误。