使用C++;amp,但仅在释放模式下 我用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 }; struct amp_指令 { op_code opcode;//添加、子、变量等 int index;//第一个子项的索引 双值;//用于常量 双重权重;//用于变量 std::string label;//节点标签 std::shared_ptr data;//amp数据 };

使用C++;amp,但仅在释放模式下 我用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 }; struct amp_指令 { op_code opcode;//添加、子、变量等 int index;//第一个子项的索引 双值;//用于常量 双重权重;//用于变量 std::string label;//节点标签 std::shared_ptr data;//amp数据 };,c++,memory-leaks,visual-studio-2015,c++-amp,C++,Memory Leaks,Visual Studio 2015,C++ Amp,在创建指令时,我按如下方式分配数据字段: instr.data = make_shared<array_view<double, 1>>(n); instr.data=make_shared(n); 那么,我的评价是: array_view<double, 1> amp_interpreter::evaluate(vector<amp_instruction>& instructions) { for (auto &it =

在创建指令时,我按如下方式分配数据字段:

instr.data = make_shared<array_view<double, 1>>(n);
instr.data=make_shared(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;
}
array\u view amp\u解释器::evaluate(向量和指令)
{
for(auto&it=rbegin(指令);it!=rend(指令);+it)
{
开关(it->操作码)
{
案例补充:
{
数组\视图a=*指令[it->index]。数据;
数组_视图b=*指令[it->index+1]。数据;
每个(a.extent,[=](索引i)限制(amp)的并行(U)
{
a[i]+=b[i];
});
it->data=指令[it->index]。数据;
打破
}
//其他情况//
案例变量:
{
数组\视图a=*it->数据;
array_view v=*gpu_数据[it->label];
双倍重量=它->重量;
每个(a.extent,[=](索引i)限制(amp)的并行(U)
{
a[i]=v[i]*重量;
});
打破
}
默认:中断;
}
}
返回*指令[0]。数据;
}
其中,gpu_数据是一个包含我的变量初始值的映射(例如,可以高达一百万)。因此,我们的想法是,为每个变量获取值(缓存在gpu_数据中),应用一个权重值,并将结果保存在相应amp_指令的数据字段中。然后,数据从子级传递到父级,以减少gpu上的内存分配

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

我的硬件是i7 4790k,32gb ddr3,radeon r9 fury。这可能是驱动程序问题吗?或者我可能没有使用C++的AMP?我真的希望有人能对这个问题有所了解,因为这个bug使得整个方法无法使用


谢谢。

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

这可能更容易用较小的测试用例进行调试:-)能否将所有数值
ai
成员初始化为零?一般来说,您可以为
amp_指令
类创建一个默认构造函数,将所有整数和双精度字段归零?调试/发布行为的差异通常来自调试中发布/0中的统一变量。我尝试过,但没有改变任何事情。该代码还针对同一事物的标准(仅cpu)实现进行了验证,并且始终生成正确的值。唯一的问题是它在释放模式下泄漏内存。