0

当我显式处理由 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
   }
}

为避免内存损坏,我必须注释掉导致问题的行,但随后我看到显卡内存消耗不断增加。

编辑:我部分解决了避免在迭代期间处理对象的问题,重用相同的缓冲区。我仍然无法理解我做错了什么。

4

0 回答 0