c++ amp内存泄漏,但仅在发布模式下

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

本文关键字:布模式 模式 内存 amp 泄漏 c++      更新时间:2023-10-16

我正在使用c++ amp来评估波兰符号形式(+ x y)的数学表达式。现在棘手的部分是表达式以树的形式给出,我将其"编译"成线性指令,基本上使用树的宽度遍历将给我一个指令列表,可以向后迭代以确保每个子节点将在其父节点之前进行评估。

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的数据字段中。然后,数据从子节点传递到父节点,以减少gpu上的内存分配。

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

我的硬件是i7 4790k, 32gb ddr3, radeon r9 fury。这可能是驱动的问题吗?或者我没有按预期使用c++ amp ?我真的希望有人能说明这个问题,因为这个bug使整个方法无法使用。

谢谢。

我无法确定内存泄漏的来源,但它肯定来自运行时。将项目选项中的"运行时库"从"多线程DLL (/MD)"更改为"多线程调试DLL (/MDd)"可以消除内存泄漏。