Некоторое время назад я написал фрактальную программу на 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
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 параллельных потоков, используя одно и то же пространство программы содержимого, но отдельные ядра.
Тем не менее, любые предложения, объяснения или исправления будут очень признательны
Похожие вопросы
Новые вопросы
windows
Написание программного обеспечения, специфичного для операционной системы Microsoft Windows: API, поведения и т. д. ОБЩАЯ ПОДДЕРЖКА WINDOWS НЕ ПО ТЕМЕ. Вопросы поддержки можно задать на https://superuser.com