我正在编写一个图像处理程序,并尝试使用OpenCLTemplate实现gpgpu和opencl。在完成教程之后,我已经弄清楚如何让我的代码运行但是我遇到了更大图像的问题。我通过将图像分成块并通过我的代码运行它来解决这个问题,但是我想这样做,以便不要将一定数量的块拆分为i,而是确定所需的最大内存量并将图像拆分为许多部分来运行代码。
我遇到的问题是,我不确切地知道在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();
如上所示,我可以找到用作参数的大小,但我仍然不知道总内存使用量是多少。
答案 0 :(得分:0)
您的应用程序使用的内存量将是Data
变量的大小加上imgProcessed
变量的大小。
因此,您的应用程序使用的数据量将是:
sizeof(float) * imgProcessed.length + sizeof(typeof(Data)) * Data.length
这是因为当您拨打
等电话时,您的所有数据都会在设备上分配CLCalc.Program.Variable CLData = new CLCalc.Program.Variable(Data);
在这种情况下,整个数据阵列正在写入您的设备内存。