0
  #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 メモリの割り当てを解除します ...

4

1 に答える 1

0

次のようにこの問題を解決しました: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));
    }
于 2016-01-04T07:29:54.800 に答える