Пишу проект с использованием PyOpenCL и обнаружил неприятную проблему - после каждого выполнения ядра программа отъедает примерно по 1,5 МБ оперативной памяти.
Когда я писал небольшой проектик с использованием биндингов для С++, я докопался до такой причины - при каждом вызове ядра создается новое событие, которое не уничтожается по дефолту до завершения программы. Как ни странно, каждое такое событие занимает минимум 300 КБ памяти. Тогда я решил проблему динамическим созданием события, скармливанием его enqueueNDRangeKernel и уничтожением после завершения работы ядра. Само собой, на питоне такое не провернуть.
Вообще в программе используется такой алгоритм: на GPU прогоняется некоторое количество итераций, ядро завершается, данные с GPU скидываются в оперативку и записываются в файл. Далее вновь запускается ядро и т.д. Поэтому при нескольких тысячах таких циклов программа съедает все 4 ГБ оперативки.
Может кто знает, как решить эту проблему?
UPD. Проблема проявляется как при расчёте на CPU (Intel), так и на GPU (nVidia).