首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用AleaGpu释放数组的GPU内存?(在GPU卡上)

如何用AleaGpu释放数组的GPU内存?(在GPU卡上)
EN

Stack Overflow用户
提问于 2015-10-20 18:44:48
回答 2查看 413关注 0票数 1

如何用AleaGpu释放数组的GPU内存?(在GPU卡上)

在函数/子函数中,如果我们想释放阵列dOutputs、dInputs的GPU内存,我们应该如何做呢?

1/ "dOutputs.Dispose();dInputs.Dispose();“会释放GPU内存吗?

2/是否存在用于GPU的"GC.Collect()“?有必要吗?

[3]对于AleaGpu,我们是否有一个命令可以完全释放GPUmemory?

代码语言:javascript
复制
    private void button3_Click(object sender, EventArgs e)
    {
        textBox3.Text = "";
        var worker = Worker.Default;
        const int rows = 10;
        const int cols = 5;
        var rng = new Random();
        var inputs = new double[rows, cols];
        for (var row = 0; row < rows; ++row)
        {
            for (var col = 0; col < cols; ++col)
            {
                inputs[row, col] = rng.Next(1, 100);
            }
        }
        var dInputs = worker.Malloc(inputs);
        var dOutputs = worker.Malloc<double>(rows, cols);
        var lp = new LaunchParam(1, 1);
        worker.Launch(Kernel, lp, dOutputs.Ptr, dInputs.Ptr, rows, cols);
        var outputs = new double[rows, cols];
        dOutputs.Gather(outputs);
        Assert.AreEqual(inputs, outputs);
        dOutputs.Dispose();
        dInputs.Dispose();" 
    }

3由于GPU卡内存有限,我们需要使用单/Int32 16/Int32 32,而不是双倍。我试过:

代码语言:javascript
复制
       var inputs = new Single[rows, cols];
       var dOutputs = worker.Malloc<Single>(rows, cols);
       var inputs2 = new Int16[rows, cols];

代码语言:javascript
复制
       worker.Launch(Kernel, lp, dOutputs.Ptr, dInputs.Ptr, rows, cols);

别拿了。我得到错误“有一些无效的论点”。

我们如何使worker.Launch(内核,lp,.)以Int16,Int32和单人?为例

EN

回答 2

Stack Overflow用户

发布于 2015-10-21 12:17:38

Worker.Malloc()返回的类型是DeviceMemory,这表示Gpu上的一个内存分配。它是一次性的,所以你可以自己处理或让GC清洁它。但是请注意,如果您依赖GC收集,就会有延迟(在GC线程中完成),而且由于Gpu内存都是固定内存(不能交换到磁盘),因此建议您显式地释放它。为了简化代码,您可以使用C#“使用”关键字。

当然,Alea可以处理这些类型,您遇到的问题是需要指定确切的类型。注意,1.0是类型为double,而1.0f是类型为single。原因是,内核函数是通过委托提供给工人启动方法的,因此您需要指定正确的数据类型来帮助它找到内核方法。隐式类型转换在这里不起作用。对于数字文字,您可以引用here

我做了一个很小的示例代码,它运行如下:

代码语言:javascript
复制
static void Kernel(deviceptr<float> data, float value)
{
    data[0] = value;
}

static void Kernel(deviceptr<short> data, short value)
{
    data[0] = value;
}

static void Main(string[] args)
{
    var worker = Worker.Default;
    var lp = new LaunchParam(1, 1);
    using (var dmemSingle = worker.Malloc<float>(1))
    using (var dmemShort = worker.Malloc<short>(1))
    {
        worker.Launch(Kernel, lp, dmemSingle.Ptr, 4.1f);
        worker.Launch(Kernel, lp, dmemShort.Ptr, (short)1);
    }
}
票数 2
EN

Stack Overflow用户

发布于 2015-10-22 11:20:48

您可以在GPU上进行重载定义!这太棒了。就像CPU上的常规代码一样,您可以在GPU上为同一个函数定义多个定义。

通过编写带有“使用”的循环,一旦您退出循环,它就会释放GPU上的内存。好极了!

谢谢

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33244458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档