内置公用设施

内存池

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

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

使用 pyopencl.array.Array 具有 MemoryPool 并不复杂:

mem_pool = pyopencl.tools.MemoryPool(pyopencl.tools.ImmediateAllocator(queue))
a_dev = cl_array.arange(queue, 2000, dtype=np.float32, allocator=mem_pool)
class pyopencl.tools.PooledBuffer

表示 MemoryPool -基于设备内存的分配。删除此对象后,其关联的设备内存将返回到池中。它支持与 pyopencl.Buffer .

class pyopencl.tools.AllocatorInterface

由计算机中的各种内存分配函数实现的一种接口 pyopencl .

__call__(size)

分配并返回 pyopencl.Buffer 给定的 size .

class pyopencl.tools.DeferredAllocator(context, mem_flags=pyopencl.mem_flags.READ_WRITE)

mem_flags 将其值从 pyopencl.mem_flags 对应于 旗帜 的参数 pyopencl.Buffer . DeferredAllocator具有与常规OpenCL缓冲区分配相同的语义,也就是说,它可以保证(在使用CL函数调用缓冲区时)以后不存在的内存可用。(CL中的分配绑定到上下文,而不是设备,内存可用性取决于缓冲区与哪个设备一起使用。)

器具 AllocatorInterface .

在 2013.1 版更改: CLAllocator 已弃用,替换为 DeferredAllocator .

__call__(size)

分配 pyopencl.Buffer 给定的 size .

在 2020.2 版更改: 即使对于大小为零的分配,分配器也会成功,返回 None .

class pyopencl.tools.ImmediateAllocator(queue, mem_flags=pyopencl.mem_flags.READ_WRITE)

mem_flags 将其值从 pyopencl.mem_flags 对应于 旗帜 的参数 pyopencl.Buffer . ImmediateAllocator 将尝试在分配时确保分配的内存实际可用。如果没有可用内存,则会在分配时报告内存不足错误。

器具 AllocatorInterface .

2013.1 新版功能.

__call__(size)

分配 pyopencl.Buffer 给定的 size .

在 2020.2 版更改: 即使对于大小为零的分配,分配器也会成功,返回 None .

class pyopencl.tools.MemoryPool(allocator[, leading_bits_in_bin_id])

OpenCL设备内存的内存池。 分配器 必须是上述类之一的实例,并且应该是 ImmediateAllocator . 内存池假定分配器立即报告分配失败,而不是以OpenCL典型的延迟方式。

器具 AllocatorInterface .

注解

内存池的当前实现将在应用程序返回分配的内存后保留该内存,并将其保存在由前导程序标识的bin中 leading_bits_in_bin_id 分配大小的位。为了确保每个bin中的分配是可互换的,分配大小被四舍五入到共享请求的分配大小的前导位的最大大小。

的当前默认值 leading_bits_in_bin_id 是4,但这可能会在将来的版本中发生变化,并且不能保证。

leading_bits_in_bin_id 必须通过关键字传递,其作用纯粹是咨询。不能保证池的未来版本将使用相同的分配方案和/或荣誉 leading_bits_in_bin_id .

在 2019.1 版更改: 记录当前仓位分配行为, leading_bits_in_bin_id 补充。

held_blocks

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

active_blocks

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

allocate(size)

返回A PooledBuffer 给定的 size .

__call__(size)

同义词 allocate() 匹配 AllocatorInterface .

free_held()

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

stop_holding()

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

CL对象相关缓存

pyopencl.tools.first_arg_dependent_memoize(func, cl_object, *args)

为函数提供记忆。通常用于缓存在 pyopencl.Context ,例如程序和内核。假设修饰函数的第一个参数是一个可能会消失的OpenCL对象,例如 pyopencl.Context 或A pyopencl.CommandQueue ,并基于此清除缓存。

2011.2 新版功能.

pyopencl.tools.clear_first_arg_caches()

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

2011.2 新版功能.

测试

pyopencl.tools.pytest_generate_tests_for_pyopencl(metafunc)

使用线路:

from pyopencl.tools import pytest_generate_tests_for_pyopencl \
        as pytest_generate_tests

在你 pytest 测试脚本允许您使用参数 ctx_factory装置平台 在测试函数中,它们将自动为系统中的每个OpenCL设备/平台运行(视情况而定)。

还支持以下两个环境变量来控制设备/平台选择:

PYOPENCL_TEST=0:0,1;intel=i5,i7

设备特性

exception pyopencl.characterize.CLCharacterizationWarning
pyopencl.characterize.get_fast_inaccurate_build_options(dev)

返回设备上有效的标志列表 dev 这使得快速,但可能不准确的浮点数学。

pyopencl.characterize.get_simd_group_size(dev, type_size)

返回跨SIMD通道执行的工作项数量的估计值。这将返回Nvidia称之为扭曲和AMD称之为波前的大小。

仅指隐式SIMD。

参数

type_size -- 向量项类型中的字节数。

pyopencl.characterize.has_amd_double_support(dev)

修正允许不完整的amd双低端板的支持

pyopencl.characterize.has_struct_arg_count_bug(dev, ctx=None)

检查设备是否应具有 argument counting bug .

pyopencl.characterize.local_memory_access_granularity(dev)

返回本地内存中每个存储组的字节数。

pyopencl.characterize.local_memory_bank_count(dev)

返回本地内存中存在的银行数。

pyopencl.characterize.nv_compute_capability(dev)

如果 dev 是Nvidia GPU pyopencl.Device ,返回元组 (大调,小调) 表示设备的计算能力。

pyopencl.characterize.simultaneous_work_items_on_local_access(dev)

返回同时访问本地内存从而可能相互冲突的工作项数。

pyopencl.characterize.usable_local_mem_size(dev, nargs=None)

返回可用本地内存大小的估计值。:arg nargs:传递的32位参数数。

pyopencl.characterize.why_not_local_access_conflict_free(dev, itemsize, array_shape, array_stored_shape=None)
参数
  • itemsize -- 访问数据的大小(字节)

  • array_shape -- 数组维度,最快移动的最后一个(C顺序)

返回

一个元组(多重性,解释),其中 多重性 在存取本机记忆体时,在一个记忆体上发生冲突的工作项目数目。 解释 是一个字符串,详细说明找到的冲突。