1

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

在函数/子函数内部,如果我们想释放数组 dOutputs,dInputs 的 GPU 内存,我们应该怎么做?

1/将“dOutputs.Dispose ( );dInputs.Dispose ( );” 释放 GPU 内存?

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

3/ 使用 AleaGpu,我们是否有释放全部 GPU 内存的命令?

    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 卡的内存有限,我们需要使用 Single/Int16/Int32 而不是 double。我试过了 :

       var inputs = new Single[rows, cols];
       var dOutputs = worker.Malloc<Single>(rows, cols);
       var inputs2 = new Int16[rows, cols];

       worker.Launch(Kernel, lp, dOutputs.Ptr, dInputs.Ptr, rows, cols);

不要拿它。我收到错误“有一些无效的论点”。

我们如何让 worker.Launch(Kernel, lp, ...) 采用 Int16,Int32 和 single ?

4

2 回答 2

2

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

当然,Alea Gpu 适用于这些类型,您遇到的问题是因为您需要指定确切的类型。注意,a1.0是 double 类型,并且1.0f是 single 类型。原因是内核函数是通过delegate提供给worker launch方法的,所以需要指定正确的数据类型来帮助它找到内核方法。隐式类型转换在这里不起作用。对于数字文字,您可以在此处参考。

我做了一个小示例代码,它可以工作:

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);
    }
}
于 2015-10-21T12:17:38.517 回答
0

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

通过使用“使用”编码循环,一旦您退出循环,它就会释放 GPU 上的内存。出色的 !!!!!

谢谢

于 2015-10-22T11:20:48.127 回答