2014-09-26 21 views
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 GPU数据在删除指针阵列GPU(动态分配)的数据后不会自由

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

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

我需要在matlab中进行矩阵的动态分配(GPU C++ AMP)。 我找到了窍门,但我有并发症时,我做了释放 (删除)矩阵在GPU内存 .... ???? 解除分配GPU内存...

+0

是否有使用指针任何特别的理由一个数组在这里?记住P_GPU是指向数组<>其又用于在GPU上而不是实际数据的数据的容器。我想这会有助于更多地了解你的情况。 – 2014-09-26 18:50:50

+0

这是示例程序中,我分配数据的GPU在Matlab – user3394578 2014-09-26 18:57:04

+0

我需要在MATLAB – user3394578 2014-09-26 19:11:51

回答

0

我只是解决了以下这个问题: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)); 
    } 
+0

难道说,这个问题是重复的(已经有一个答案)? – jogo 2016-01-04 07:37:29