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

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

Я уверен, что мой пост был неправильно сформулирован, английский не мой родной язык и, возможно, не в том месте. Я не имел в виду, что кто-то тратит время на отладку моего слепленного старого кода, но, возможно, указал мне правильное направление или предложил какой-нибудь легкодоступный инструмент проверки ошибок памяти, например, очистить. Раньше я использовал его для поиска ошибок памяти, к сожалению, он больше не доступен для одного пользователя. Также у меня теперь сильное подозрение, что что-то перезаписывает память после обращений к opencl. в результате вызовы os.time, math.random и т. д. приводят к необъяснимой остановке выполнения кода. Следующий код после вызовов OpenCL начинает вести себя странно, значение ii в последнем цикле в операторе 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
0
Alexey Galiulin 23 Мар 2020 в 00:07

1 ответ

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

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

Тем не менее, любые предложения, объяснения или исправления будут очень признательны

0
Alexey Galiulin 17 Апр 2020 в 04:43