如何使用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和单个?
答案 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上的内存。很棒!!!!!
谢谢