如何使用 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 )

该函数可能会填充分配以确保相应的 任何给定行中的指针将继续满足对齐要求 当地址逐行更新时进行合并的要求。 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 是合法的。因此错误。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...