问题描述
我最近一直在试用 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 )
该函数可能会填充分配以确保相应的 任何给定行中的指针将继续满足对齐要求 当地址逐行更新时进行合并的要求。 ElementSizeBytes 指定最大读写的大小 这将在内存范围内执行。 ElementSizeBytes 可能是 4, 8 或 16(因为合并的内存事务不可能在其他 数据大小)
在这种情况下,前两个参数是 mem_alloc_pitch
的返回值,而 ElementSizeBytes
在 PyCUDA 调用中是 access_size
。
你有:
cuda.mem_alloc_pitch(512,160,1)
即您的 access_size
是 1,这是非法的。只有 4、8 或 16 是合法的。因此错误。