当我显式处理由 OpenCL.Net (v2.2.9) 创建的 IMem 对象时,我遇到了内存损坏问题。如果我不调用IMem.Dispose()
显卡内存是不会释放的。
不幸的是,我发现关于这个主题的例子太少了。这里只执行一次调用env.Dispose()
。
我的代码是这样的:
IMem<int> idxsBuffer = context.CreateBuffer(idxs, MemFlags.ReadOnly);
for(int i=0; i<n; i++){
IMem<float4>[] a = CreateA(); // c_.Length times context.CreateBuffer(a_[...], MemFlags.ReadOnly)
for(int j=0; j<m; j++){
b_ = CreateB(i, j);
c_ = CreateC(i, j);
for(int k=0; k<o; j++){
IMem<float4> b = context.CreateBuffer(b_[k], MemFlags.ReadOnly);
IMem<float> c = context.CreateBuffer<float>(c_[k].Length, MemFlags.WriteOnly);
kernel.Run(cmdQueue, idxsBuffer, b, a[k], c, [...]);
float[] u = new float[c_[k].Length];
cmdQueue.ReadFromBuffer(c, u);
b.Dispose(); // Cause problem
c.Dispose(); // Cause problem
}
}
foreach(IMem<float4> a_ in a){
a_.Dispose(); // Cause problem
}
}
为避免内存损坏,我必须注释掉导致问题的行,但随后我看到显卡内存消耗不断增加。
编辑:我部分解决了避免在迭代期间处理对象的问题,重用相同的缓冲区。我仍然无法理解我做错了什么。