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