C++ amp 的内存泄漏,但仅在释放模式下

Memory leak with C++ amp, but only in release mode

我正在使用 C++ amp 计算采用波兰表示法的 (+ x y) 形式的数学表达式。现在棘手的部分是表达式作为树给出,我 "compile" 变成线性指令,基本上使用 属性 树的广度遍历会给我一个可以迭代的指令列表向后以确保每个 child 节点将在其 parent 之前被评估。

struct amp_instruction
{
  op_code                                            opcode; // add, sub, variable, etc
  int                                                 index; // index of first child
  double                                              value; // for constants
  double                                             weight; // for variables
  std::string                                         label; // node label
  std::shared_ptr<concurrency::array_view<double, 1>>  data; // amp data
};

创建指令时,我这样分配数据字段:

instr.data = make_shared<array_view<double, 1>>(n);

那么,我的评价是:

array_view<double, 1> amp_interpreter::evaluate(vector<amp_instruction>& instructions)
{
  for (auto &it = rbegin(instructions); it != rend(instructions); ++it)
  {
    switch (it->opcode)
    {
    case ADD:
    {
      array_view<double, 1> a = *instructions[it->index].data;
      array_view<double, 1> b = *instructions[it->index + 1].data;
      parallel_for_each(a.extent, [=](index<1> i) restrict(amp)
      {
        a[i] += b[i];
      });
      it->data = instructions[it->index].data;
      break;
    }
    // other cases... //
    case VARIABLE:
    {
      array_view<double, 1>  a = *it->data;
      array_view<const double, 1> v = *gpu_data[it->label];
      double weight = it->weight;
      parallel_for_each(a.extent, [=](index<1> i) restrict(amp)
      {
        a[i] = v[i] * weight;
      });
      break;
    }
    default: break;
    }
  }
  return *instructions[0].data;
}

其中 gpu_data 是一张地图,其中包含我的变量的初始值(例如,最多可达一百万)。所以想法是,对于每个变量获取值(缓存在 gpu_data 中),应用权重值,并将结果保存在相应 amp_instruction 的数据字段中。然后,数据从 child 传递到 parent 以减少 gpu 上的内存分配。

现在,当我在调试模式下编译我的程序时,这段代码工作正常,1000 个树表达式使用约 1gb 的常量内存,每个树变量使用 1M 值。它还会产生正确的值,因此逻辑有效。但在发布模式下,内存使用量会飙升至 10-20gb。这只发生在默认加速器上,这是我的 radeon r9 fury。基本的渲染器加速器没有这个问题。

我的硬件是 i7 4790k,32gb ddr3,radeon r9 fury。这可能是驱动程序问题吗?或者也许我没有按预期使用 C++ amp?我真的希望有人能阐明这个问题,因为这个错误导致整个方法无法使用。

谢谢。

我无法查明内存泄漏的来源,但它肯定来自运行时。将项目选项中的 "Runtime Library" 从 "Multi-threaded DLL (/MD)" 更改为 "Multi-threaded Debug DLL (/MDd)" 可消除内存泄漏。