内存泄漏与C ++放大器,但仅在发布模式

时间:2016-10-19 20:45:07

标签: c++ memory-leaks visual-studio-2015 c++-amp

我正在使用C ++放大器以波兰表示法评估形式(+ 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上的内存分配。

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

我的硬件是i7 4790k,32gb ddr3,radeon r9狂暴。这可能是司机问题吗?或者我可能没有按预期使用c ++ amp?我真的希望有人可以对这个问题有所了解,因为这个bug会导致整个方法无法使用。

感谢。

1 个答案:

答案 0 :(得分:0)

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