内置公用设施

自动初始化

模块 pycuda.autoinit ,导入时,自动执行所有必要步骤,以使CUDA准备好提交计算内核。它使用 pycuda.tools.make_default_context() 创建计算上下文。

pycuda.autoinit.device

的实例 pycuda.driver.Device 这是用于自动初始化的。

pycuda.autoinit.context

的默认构造实例 pycuda.driver.Contextdevice . 此上下文是通过调用 pycuda.tools.make_default_context() .

设备的选择

pycuda.tools.make_default_context()

返回A pycuda.driver.Context 根据以下规则选择实例:

  • 如果环境变量 CUDA_DEVICE 设置时,其整数值用作设备编号。

  • 如果文件 .cuda-device 存在于用户的主目录中,其内容的整数值用作设备号。

  • 否则,所有可用的CUDA设备都将以循环方式进行尝试。

如果这不会导致可用的上下文,则会引发错误。

pycuda.tools.get_default_device(default=0)

不赞成的使用 make_default_context() .

返回A pycuda.driver.Device 根据以下规则选择实例:

  • 如果环境变量 CUDA_DEVICE 设置时,其整数值用作设备编号。

  • 如果文件 .cuda-device 存在于用户的主目录中,其内容的整数值用作设备号。

  • 否则, default 用作设备号。

内核缓存

pycuda.tools.context_dependent_memoize(func)

这个decorator缓存装饰函数的结果, if 一个后续发生在同一 pycuda.driver.Context . 这对于内核缓存很有用。

pycuda.tools.clear_context_caches()

清空所有上下文相关的备忘录缓存。同时释放所有保留的引用上下文。如果程序与上下文分离对您很重要,则可能需要调用此函数来释放对上下文的所有剩余引用。

测试

pycuda.tools.mark_cuda_test(func)

此函数用于 py.test 威尔马克 func 使用“cuda”标记,并确保调用时它有一个可用的cuda上下文。

设备元数据和占用率

class pycuda.tools.DeviceData(dev=None)

允许访问设备上的更多信息 pycuda.driver.Device.get_attribute() .如果 devNone ,它默认为 pycuda.driver.Context.get_device() .

max_threads
warp_size
warps_per_mp
thread_blocks_per_mp
registers
shared_memory
smem_granularity

同时访问共享内存的线程数。

smem_alloc_granularity

最小可能(非空)共享内存分配的大小。

align_bytes(word_size=4)

允许字大小访问的全局内存基地址之间的距离 word_size 要合并的字节数。

align(bytes, word_size=4)

围捕 bytes 到下一个路线边界,如 align_bytes() .

align_words(word_size)

返回 self.align_bytes(word_size)/word_size ,同时检查除法是否产生余数。

align_dtype(elements, dtype_size)

围捕 elements 到下一个路线边界,如 align_bytes() ,其中每个元素假定为 dtype_size 字节大。

static make_valid_tex_channel_count(size)

围捕 size 一个有效的纹理通道计数。

class pycuda.tools.OccupancyRecord(devdata, threads, shared_mem=0, registers=0)

计算给定内核工作负载的占用率,其特征是

  • 线程数 threads

  • 共享内存使用 shared_mem 字节

  • 注册使用 registers 32位寄存器

tb_per_mp

每个多处理器上执行多少线程块。

limited_by

什么 tb_per_mp 受到限制。什么之中的一个 "device""warps""regs""smem" .

warps_per_mp

每个多处理器上执行多少个扭曲。

occupancy

A float 介于0和1之间的值,指示内核占用每个多处理器的调度功能的大小。

内存池

功能 pycuda.driver.mem_alloc()pycuda.driver.pagelocked_empty() 如果调用非常频繁,则会消耗相当大的处理时间。例如,基于 pycuda.gpuarray.GPUArray 因为每个中间结果分配了一个新的内存区域,所以很容易遇到这个问题。内存池是解决此问题的一种方法,其基础是观察到许多块分配的大小通常与以前使用的块分配的大小相同。

然后,池不再将内存完全返回到系统并产生相关的重新分配开销,而是保留内存并使用它来满足将来类似大小块的分配。只要所有的内存分配都通过池进行,池就会对内存不足的情况做出适当的反应。由于池拥有大部分或全部可用内存,从池外部执行的分配可能会遇到虚假的内存不足情况。

基于设备的内存池

class pycuda.tools.PooledDeviceAllocation

表示 DeviceMemoryPool -基于线性设备存储器的分配。删除此对象后,将释放其关联的设备内存。 PooledDeviceAllocation 实例可以被强制转换为 int (和 long ,生成分配的设备内存的起始地址。

free()

显式返回 self 到关联的内存池。

__len__()

返回已分配内存的大小(字节)。

class pycuda.tools.DeviceMemoryPool

用于线性设备存储器的存储器池,使用 pycuda.driver.mem_alloc() . (见 内存池

held_blocks

此池保留的未使用块的数目。

active_blocks

已通过此池分配的活动使用的块数。

allocate(size)

返回A PooledDeviceAllocation 属于 size 字节。

free_held()

释放池当前保存的所有未使用的内存。

stop_holding()

指示内存立即开始释放返回给它的内存,而不是为将来的分配保留它。隐式调用 free_held() . 这对于内存池停止使用时的清理操作非常有用。

分页锁定内存的内存池

class pycuda.tools.PooledHostAllocation

表示 PageLockedMemoryPool -基于线性设备存储器的分配。删除此对象后,将释放其关联的设备内存。

free()

显式返回 self 到关联的内存池。

__len__()

返回已分配内存的大小(字节)。

class pycuda.tools.PageLockedAllocator(flags=0)

指定 pycuda.driver.host_alloc_flags 用于其关联的 PageLockedMemoryPool .

class pycuda.tools.PageLockedMemoryPool(allocator=PageLockedAllocator())

一个内存池,用于使用 pycuda.driver.pagelocked_empty() . (见 内存池

held_blocks

此池保留的未使用块的数目。

active_blocks

已通过此池分配的活动使用的块数。

allocate(shape, dtype, order='C')

返回未初始化的(“空”) numpy.ndarray 用给定的 形状D型秩序 . 此数组将由 PooledHostAllocation ,可以找到 .base 数组的属性。

free_held()

释放池当前保存的所有未使用的内存。

stop_holding()

指示内存立即开始释放返回给它的内存,而不是为将来的分配保留它。隐式调用 free_held() . 这对于内存池停止使用时的清理操作非常有用。