【问题标题】:C++ Amp GPU Data is'nt free after deleting the Data of pointer array GPU (dynamic allocation)删除指针数组GPU的数据后,C++ Amp GPU Data is'nt free(动态分配)
【发布时间】:2014-09-26 17:29:25
【问题描述】:
  #include "stdafx.h"
  #include <amp.h>     
  #include <assert.h>            
  #include <iostream>            
  #include <vector>
  #include <iostream>
  #include <ppl.h>
  #include<stdio.h>
  #include<conio.h> 


  using namespace ::Concurrency;
  using std::vector;   


  static array<double, 1> *P_GPU;

int _tmain(int argc, _TCHAR* argv[])
{
  accelerator default_device(accelerator::default_accelerator);
  accelerator_view acc_v = default_device.default_view;

  int   N = 4*4096*4096;
  double *xdata = new double[N];
  memset(xdata,0,N);

  extent<1> e_b(N);
  P_GPU = new array<double, 1>(e_b, acc_v); // dynamic allocation of array
  array<double, 1> bb(e_b, xdata, acc_v);
  array_view<double, 1> dest(*P_GPU);
  dest.discard_data();

  parallel_for_each(dest.extent, [=,&bb](index<1> idx) restrict(amp)
  {
    dest[idx]=bb[idx];
  });
  dest.synchronize();
  std::cout << "before delete .." << std::endl;

  std::cin.get();

  delete [] xdata; // the DATA of xdata pointer is deleted ..
  delete P_GPU;  // the DATA GPU of P_GPU is not deleted ???

  std::cout << "Hit any key to exit..." << std::endl;
  std::cin.get();
  return 0;
}

二进制代码已通过 Microsoft Process Explorer v16.04 测试。

我测试了一个在 C++ AMP 中动态分配数组(或 array_view)的问题。 我看到删除 P_GPU 指针后 GPU 内存没有空闲!!

这个程序是在 Matlab 上测试的...(mexFunction)-> 我有同样的问题... .. 删除 P_GPU;

我需要在 matlab 中对矩阵进行动态分配 (GPU C++AMP)。 我找到了诀窍,但我在解除分配时遇到了麻烦 (删除)矩阵在GPU内存中 .... ??? 释放 GPU 内存 ...

【问题讨论】:

  • 这里使用指向数组的指针有什么特别的原因吗?请记住,P_GPU 是指向数组 的指针,而数组 又是 GPU 上数据的容器,而不是实际数据。我想这将有助于更多地了解您的场景。
  • 这是示例程序,我在 Matlab 中分配数据 gpu
  • 我需要在matlab中进行动态分配(GPU C++AMP)
  • 如果通过动态分配一个数组,您的意思是获得一个指向 GPU 内存的指针,您可以以某种方式将其传递给 MEX 或从 MEX 传递,那么我不相信这是可能的,也不是您的代码实际所做的。 P_GPU 指向 CPU 内存中的一个数组,该数组又包含对 GPU 资源的引用。
  • 删除 array_view 或数组中的数据 GPU(不是数据指针)?声明构造函数后如何更改数组(或array_view)的大小?谢谢

标签: c++-amp


【解决方案1】:

我刚刚解决了这个问题:Using pointers in C++Amp

请使用:std::shared_ptr

class FrameProcessorAmpBase
{
private:
    std::shared_ptr<array<float, 2> m_frame;

public:
    FrameProcessorAmpBase()
    {
    }

    void ConfigureFrameBuffers(int width, int height)
    {
        m_frame = std::make_shared<array<float, 2>>(height, width));
    }

【讨论】:

  • 这是否意味着问题是重复的(已经有答案)?
猜你喜欢
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多