如何使用 PyCuda mem_alloc_pitch()

Posted

技术标签:

【中文标题】如何使用 PyCuda mem_alloc_pitch()【英文标题】:How to use PyCuda mem_alloc_pitch() 【发布时间】:2021-08-28 04:29:02 【问题描述】:

我最近一直在尝试 PyCuda。

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

下面是一些测试代码。

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

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

【问题讨论】:

【参考方案1】:

引用 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 个是合法的。因此错误。

【讨论】:

感谢您的回答。这是针对 PyCuda 还是 Cuda?在 PyCuda 文档中,它提到了一些关于访问大小的内容,这与 CUDA 函数中的 ElementSizeBytes 参数是否相同。继承人 [documen.tician.de/pycuda/… PyCUDA API 是 CUDA 驱动 API 的一个非常薄的包装器。如有疑问,请阅读 CUDA 驱动程序 API 文档,因为它们是相同的 感谢您的出色回答。

以上是关于如何使用 PyCuda mem_alloc_pitch()的主要内容,如果未能解决你的问题,请参考以下文章

如何在 pyCUDA 内核中生成随机数?

释放 Pycuda 的内存

如何使用 PyCuda mem_alloc_pitch()

我的pyCuda索引是如何工作的?

让 Pycuda 在 2 gpus 上使用 Mpi4py [关闭]

PyCuda - 使用 *.cubin - 未找到命名符号