Как отследить источник утечек памяти в luajit от звонков в opencl api через FFI - PullRequest
0 голосов
/ 23 марта 2020

А пока go Я написал фрактальную программу в Lua. Он отлично работает на моих старых ПК Windows 7 и Windows 8. Я получил новый ноутбук с Windows 10 и запустил его с luajit 2.1.0, который работал лучше всего для меня в прошлом. К сожалению, некоторые прогоны с различными параметрами завершились неудачно без ошибок или причин. И тогда я заметил, что даже успешное выполнение использует слишком много памяти. Я старался изо всех сил, чтобы отследить проблему, используя различные сборки luajit от 2.0 до 2.1, но единственное, что я могу видеть, это то, что утечка памяти так или иначе связана с вызовами FFI в OpenCl API. Если кто-то захочет взглянуть, я предоставлю полный код программы и необходимые программы. Прикрепление старого демо lua кода, который также просачивается на win10, на основе и использования: https://github.com/malkia/luajit-opencl

cl-demo. lua: https://github.com/LuaJIT/LuaJIT/files/4366334/cl-demo.txt

Я уверен, что мой пост был написан неправильно, Engli sh не мой родной язык и, возможно, не в том месте. Я не имел в виду, что кто-то тратит время на отладку моего старого кода, но, возможно, указал мне правильное направление или предложил какой-нибудь легко доступный инструмент проверки ошибок памяти, например, очистить. Я использовал его для поиска ошибок памяти, к сожалению, он больше не доступен для одного пользователя. Также у меня теперь есть сильное подозрение, что что-то перезаписывает память после обращений к opencl. в результате вызовы os.time, math.random & et c. приводить к необъяснимому завершению выполнения кода. Следующий код после вызовов OpenCL начинает вести себя странно, значение ii в последнем l oop в операторе if внезапно получает значение, подобное 0.13900852449513657!

clfns[1]=true;
for ii=2,34,1 do clfns[ii]=false; end
for ii=2,34,1 do if string.find(formula, c2fns[ii] .. "[(]") then
 for jj=1,4,1 do if cdfns[ii][jj] then clfns[cdfns[ii][jj]]=true; end end
end end
for ii=1,34,1 do
 if clfns[ii] then
  cFuns = cFuns .. cfns[ii]; end end

1 Ответ

0 голосов
/ 17 апреля 2020

Я создал обходной путь для различных проблем, на которых моя программа работала на windows 10 и 8.1 с последними обновлениями от Microsoft. Во-первых, чтобы предотвратить неожиданные необъяснимые завершения luajit под разными версиями моего lua кода, я перестроил luajit 2.1 под Microsoft Developer studio 2008 с альтернативными вариантами оптимизации (/ Ox / Ot). Я мог использовать аналогичные параметры компиляции в версиях MsDev 2015 и 2020 годов, но мне пришлось добавить / guard: cf / D_CRTDBG_MAP_ALLO C, что привело к более медленному выполнению, до 32%, и, тем не менее, к некоторым очень странным спорадическим c аберрациям , Чтобы бороться с утечкой памяти (более 100 МБ на генерацию фрактальных изображений), мне приходилось добавлять collectgarbage () после каждого завершения работы программы ядра cl. И добавьте освобождение, освобождение и пересоздание буфера памяти для каждой очереди результатов выполнения кода OpenCL, что решает большинство проблем с памятью, но замедляет выполнение в зависимости от размера и сложности выполняемых формул с 19% до 41%. добавлен код: clEnqueueReadBuffer (команды, вывод [jb], cl.CL_TRUE, 0, повторный размер, результаты, 0, ноль, ноль) ... clReleaseMemObject (output [jbo]); выходной [jbo] = ноль; output [jbo] = ffi.g c (clCreateBuffer (context, cl.CL_MEM_WRITE_HOST_PTR, ressize), ffi. C .free);

Есть некоторые проблемы с памятью, когда я запускаю свою программу с OpenGL 3D-вывод с использованием библиотек iup, в основном из-за того, что сборка мусора не догоняет, но я, вероятно, могу решить эту проблему, реализовав использование 4-х параллельных потоков с использованием одного и того же программного пространства содержимого, но отдельных ядер.

Все еще есть предложения, объяснения или исправления будет принята с благодарностью

...