Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用AleaGpu释放阵列的GPU内存?(在GPU卡上)_C#_Aleagpu - Fatal编程技术网

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

C# 如何使用AleaGpu释放阵列的GPU内存?(在GPU卡上),c#,aleagpu,C#,Aleagpu,如何使用AleaGpu释放阵列的GPU内存?(在GPU卡上) 在函数/sub中,如果我们想释放GPU内存中的数组doutput、dinput,我们应该如何做 1/将“dOutputs.处理”(); 数据输出。处理();“释放GPU内存 2/是否存在GPU的“GC.Collect()”?有必要吗 3/有了AleaGpu,我们是否有一个命令来释放GPUmemory的总和 private void button3_Click(object sender, EventArgs e) {

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

在函数/sub中,如果我们想释放GPU内存中的数组doutput、dinput,我们应该如何做

1/将“dOutputs.处理”(); 数据输出。处理();“释放GPU内存

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

3/有了AleaGpu,我们是否有一个命令来释放GPUmemory的总和

    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();" 
    }
别忘了拿它。我得到错误“有一些无效的参数”


我们如何使worker.Launch(内核、lp,…)接受Int16、Int32和single?

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

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

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

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);
    }
}
静态无效内核(deviceptr数据,浮点值)
{
数据[0]=数值;
}
静态void内核(deviceptr数据,短值)
{
数据[0]=数值;
}
静态void Main(字符串[]参数)
{
var-worker=worker.Default;
var lp=新启动参数(1,1);
使用(var-dmemSingle=worker.Malloc(1))
使用(var-dmemShort=worker.Malloc(1))
{
启动(内核,lp,dmemSingle.Ptr,4.1f);
worker.Launch(内核,lp,dmemShort.Ptr,(short)1);
}
}

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

通过使用“using”对循环进行编码,一旦退出循环,它就会释放GPU上的内存。太好了


谢谢

是的,重载是好的,但是由于您只是将内核方法命名为“kernel”,因此您必须给出确切类型的参数,以便我们可以找到您所指的“kernel”,这就是为什么数字内容的隐式转换在这里不起作用的原因。
       worker.Launch(Kernel, lp, dOutputs.Ptr, dInputs.Ptr, rows, cols);
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);
    }
}