【发布时间】: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