如何用AleaGpu释放数组的GPU内存?(在GPU卡上)
在函数/子函数中,如果我们想释放阵列dOutputs、dInputs的GPU内存,我们应该如何做呢?
1/ "dOutputs.Dispose();dInputs.Dispose();“会释放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();"
}3由于GPU卡内存有限,我们需要使用单/Int32 16/Int32 32,而不是双倍。我试过:
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(内核,lp,.)以Int16,Int32和单人?为例
发布于 2015-10-21 12:17:38
Worker.Malloc()返回的类型是DeviceMemory,这表示Gpu上的一个内存分配。它是一次性的,所以你可以自己处理或让GC清洁它。但是请注意,如果您依赖GC收集,就会有延迟(在GC线程中完成),而且由于Gpu内存都是固定内存(不能交换到磁盘),因此建议您显式地释放它。为了简化代码,您可以使用C#“使用”关键字。
当然,Alea可以处理这些类型,您遇到的问题是需要指定确切的类型。注意,1.0是类型为double,而1.0f是类型为single。原因是,内核函数是通过委托提供给工人启动方法的,因此您需要指定正确的数据类型来帮助它找到内核方法。隐式类型转换在这里不起作用。对于数字文字,您可以引用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);
}
}发布于 2015-10-22 11:20:48
您可以在GPU上进行重载定义!这太棒了。就像CPU上的常规代码一样,您可以在GPU上为同一个函数定义多个定义。
通过编写带有“使用”的循环,一旦您退出循环,它就会释放GPU上的内存。好极了!
谢谢
https://stackoverflow.com/questions/33244458
复制相似问题