如何在通过FFI调用opencl api时跟踪luajit中的内存泄漏源

问题描述 投票:0回答:1

不久前,我在Lua中编写了分形程序。在我的旧Windows 7和Windows 8 PC上,它可以正常工作。我有一台装有Windows 10的新笔记本电脑,并且使用luajit 2.1.0来运行它,这在过去对我来说是最好的。不幸的是,使用各种参数进行的某些运行失败,没有错误或原因。然后我注意到,即使成功执行,也会占用太多内存。我尽力使用从2.0到2.1的不同版本的luajit来跟踪问题,但是我只能看到的是内存泄漏以某种方式与对OpenCl api的FFI调用有关。如果有人愿意看一看,我将提供程序和所需api dll的完整代码。基于并使用https://github.com/malkia/luajit-opencl

附加旧的演示lua代码,该代码也在win10上泄漏

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

我确定我的帖子措辞不正确,英语不是我的母语,也许不是在正确的位置。我并不是说有人在浪费时间调试我拼凑在一起的旧代码,而是要指出正确的方向,或者建议一些易于使用的内存错误检查工具,例如purify。我曾经用它来查找内存错误,不幸的是,它不再对单个用户可用。我现在也强烈怀疑在调用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
windows lua opencl luajit
1个回答
0
投票

我已经针对我的程序在Windows 10和8.1上运行的各种问题创建了变通办法,并使用了Microsoft的最新更新。首先,为了防止luajit突然无法解释的终止运行我的lua代码的各种版本,我在Microsoft Developer Studio 2008下使用替代优化选项(/ Ox / Ot)重建了luajit 2.1。我能够在MsDev的2015和2020版本下使用类似的编译选项,但必须添加/ guard:cf / D_CRTDBG_MAP_ALLOC,导致执行速度降低,高达32%,并且仍然存在一些非常奇怪的零星畸变。为了防止内存泄漏(每个分形图像生成超过100mb),我必须在每个cl内核程序完成后添加collectgarbage()。并为OpenCL代码执行的每个结果添加release,free和recreate内存缓冲区,这可以解决大多数内存问题,但是根据运行公式的大小和复杂性,执行速度会从19%降低到41%,从而使执行速度减慢。添加的代码:clEnqueueReadBuffer(命令,输出[jb],cl.CL_TRUE,0,调整大小,结果,0,nil,nil)...clReleaseMemObject(output [jbo]);输出[jbo] =无;output [jbo] = ffi.gc(clCreateBuffer(context,cl.CL_MEM_WRITE_HOST_PTR,ressize),ffi.C.free);

© www.soinside.com 2019 - 2024. All rights reserved.