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

时间:2015-10-20 18:44:48

标签: c# aleagpu

如何使用AleaGpu释放阵列的GPU内存? (在GPU卡上)

在function / sub里面,如果我们要释放数组dOutputs,dInputs的GPU内存,我们应该怎么做呢?

1 /将" dOutputs。 Dispose (); dInputs的 处置 ();"释放GPU内存?

2 /" GC.Collect()"对于GPU存在?有必要吗 ?

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);
不要接受它。我得到错误&#34;有一些无效的论点&#34;

我们如何使worker.Launch(Kernel,lp,...)采用Int16,Int32和单个?

2 个答案:

答案 0 :(得分:2)

Worker.Malloc()返回的类型是DeviceMemory,这表示Gpu上的一个内存分配。它是一次性的,所以你可以自己处理它或让GC清洁它。但请注意,如果您依赖GC进行收集,则会有延迟(在GC线程中完成),并且由于Gpu内存全部是固定内存(无法交换到磁盘),因此建议您明确处置它。为了使代码更容易,您可以使用C#&#34;使用&#34;关键字。

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

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

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);
    }
}

答案 1 :(得分:0)

您可以在GPU上拥有过载定义!这很棒。 像CPU上的常规代码一样,GPU上可以有相同功能的多个定义。

通过使用&#34;编码一个循环,它会在你离开循环时释放GPU上的内存。很棒!!!!!

谢谢