0

我正在编写一个图像处理程序,并尝试使用 OpenCLTemplate 实现 gpgpu 和 opencl。在完成您的教程后,我已经弄清楚如何让我的代码运行,但我遇到了较大图像的问题。我通过将图像分成块并通过我的代码运行它来解决这个问题,但我想这样做,而不是有一定数量的块来分割,我让它确定所需的最大内存量并将图像分割成然而运行代码的许多部分。

我遇到的问题是我不知道到底有多少内存被扔到 gpu 上以及如何计算出来。下面是我正在使用的代码,是否可以解释这里的内存是如何处理的,或者关于在哪里查看的一些建议。

我浏览了 opencltemplate 文档,但无济于事,也不知道去哪里找。

CLCalc.Program.Compile(openCLInvert);
CLCalc.Program.Kernel kernel = new CLCalc.Program.Kernel("Filter");
CLCalc.Program.Variable CLData = new CLCalc.Program.Variable(Data);

float[] imgProcessed = new float[Data.Length];

CLCalc.Program.Variable CLFiltered = new CLCalc.Program.Variable(imgProcessed);
CLCalc.Program.Variable[] args = 
    new CLCalc.Program.Variable[] { CLData, CLFiltered };

int[] test = new int[] { imageData.Width, imageData.Height };

float size = 0;
for (int x = 0; x <= 1; x++)
{
    size += args[x].Size;
}

kernel.Execute(args, test);
CLCalc.Program.Sync();

如上所示,我可以找到用作参数的大小量,但我仍然不知道总内存使用量是多少。

4

1 回答 1

0

您的应用程序正在使用的内存量将是Data变量的大小加上变量的大小imgProcessed

因此,您的应用程序使用的数据量将是:

sizeof(float) * imgProcessed.length + sizeof(typeof(Data)) * Data.length

这是因为当您拨打电话时,您的所有数据都在设备上分配

CLCalc.Program.Variable CLData = new CLCalc.Program.Variable(Data);

在这种情况下,整个 Data 数组正在写入您的设备内存。

于 2012-10-09T17:29:33.363 回答