內置公用設施?

內存池?

建造師 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 -- 訪問數據的大?。ㄗ止潱?/p>

  • array_shape -- 數組維度,最快移動的最后一個(C順序)

返回

一個元組(多重性,解釋),其中 多重性 在存取本機記憶體時,在一個記憶體上發生沖突的工作項目數目。 解釋 是一個字符串,詳細說明找到的沖突。