如何解决我无法在OpenCL.NET中释放GPU内存
我一直在用C#开发OpenCL.NET。我在这个项目中有问题。我在所附代码下开发了OpenCL Part。您可以在代码底部找到有关释放内存,内核,程序的代码。我认为这段代码可以释放GPU内存。但它做不到。运行后,我看不出任何区别。我无法像图片一样释放GPU内存。我不知道如何释放GPU内存。您能帮我指导这部分吗?这段代码是C#,如果您知道在唯一的c ++中释放GPu内存,请让我聊天,我可以理解
public void CalculateChord(int RectXValue,int[] ParticleXPoint,int[] ParticleYPoint,int[] ColumnPointXArray,int[] ColumnPointYArray,double Angle,ref double[] ChordArray)
{
double[] ChordValueArray = new double[ColumnPointXArray.Length];
string programSource = @"
__kernel void doubleMe(__global int* RectXValue,__global int* ParticleXPoint,__global int* ParticleYPoint,__global int* ColumnPointXArray,__global int* ColumnPointYArray,__global int* ColumnPointCount,__global double* Angle,__global int* ParticlePointCount,__global double* ChordValueArray)
{
size_t id = get_global_id(0);
private int DetectingLineXPoint[1000];
private int DetectingLineYPoint[1000];
private int RowPointCountLeft;
private int RowPointCountRight;
private int LineCount = 0;
private int j = 0;
private int RotationCount = 0;
for(RowPointCountLeft = (*RectXValue) + 30; RowPointCountLeft >= 0; RowPointCountLeft--)
{
DetectingLineXPoint[LineCount] = ColumnPointXArray[id] - RowPointCountLeft;
DetectingLineYPoint[LineCount] = ColumnPointYArray[id];
LineCount++;
}
for(RowPointCountRight = 0; RowPointCountRight <= (*RectXValue) + 30; RowPointCountRight++)
{
DetectingLineXPoint[LineCount] = ColumnPointXArray[id] + RowPointCountRight;
DetectingLineYPoint[LineCount] = ColumnPointYArray[id];
LineCount++;
}
for(RotationCount = 0; RotationCount < LineCount; RotationCount++)
{
double XValue = 0.0;
double YValue = 0.0;
XValue = ((DetectingLineXPoint[RotationCount] - ColumnPointXArray[id]) * cos(*(Angle)) - (DetectingLineYPoint[RotationCount] - ColumnPointYArray[id]) * sin(*(Angle)) + ColumnPointXArray[id]);
YValue = ((DetectingLineXPoint[RotationCount] - ColumnPointXArray[id]) * sin(*(Angle)) + (DetectingLineYPoint[RotationCount] - ColumnPointYArray[id]) * cos(*(Angle)) + ColumnPointYArray[id]);
DetectingLineXPoint[RotationCount] = XValue;
DetectingLineYPoint[RotationCount] = YValue;
}
/*if(id == 37)
{
for(RotationCount = 0; RotationCount < LineCount; RotationCount++)
{
printf(""StartPoint%d : (%d,%d} \n"",RotationCount,DetectingLineXPoint[RotationCount],DetectingLineYPoint[RotationCount]);
}
}*/
private int StartPointX = 0;
private int StartPointY = 0;
private int EndPointX = 0;
private int EndPointY = 0;
private int StartPointStatus = 0;
private int EndPointStatus = 0;
private int PointCount = 0;
for(PointCount = 0; PointCount < LineCount; PointCount++)
{
private int EscapeFor = 0;
private int ParticlePixelCount = 0;
for(ParticlePixelCount = 0; ParticlePixelCount < (*ParticlePointCount); ParticlePixelCount++)
{
if(ParticleXPoint[ParticlePixelCount] == DetectingLineXPoint[PointCount]
&& ParticleYPoint[ParticlePixelCount] == DetectingLineYPoint[PointCount])
{
StartPointX = DetectingLineXPoint[PointCount];
StartPointY = DetectingLineYPoint[PointCount];
StartPointStatus = 1;
EscapeFor = 1;
break;
}
}
if(EscapeFor == 1) break;
}
PointCount = 0;
for(PointCount = LineCount - 1; PointCount >= 0; PointCount--)
{
private int EscapeFor = 0;
private int ParticlePixelCount = 0;
for(ParticlePixelCount = 0; ParticlePixelCount < (*ParticlePointCount); ParticlePixelCount++)
{
if(ParticleXPoint[ParticlePixelCount] == DetectingLineXPoint[PointCount]
&& ParticleYPoint[ParticlePixelCount] == DetectingLineYPoint[PointCount])
{
EndPointX = DetectingLineXPoint[PointCount];
EndPointY = DetectingLineYPoint[PointCount];
EndPointStatus = 1;
EscapeFor = 1;
break;
}
}
if(EscapeFor == 1) break;
}
if(StartPointStatus == 1 && EndPointStatus == 1)
{
private double XValue = 0;
private int YValue = 0;
private double ChordValue = 0;
XValue = (double)(StartPointX - EndPointX);
if(XValue < 0) XValue *= -1;
if(XValue != 0) XValue += 1;
YValue = (double)(StartPointY - EndPointY);
if(YValue < 0) YValue *= -1;
if(YValue != 0) YValue += 1;
ChordValue = sqrt(pow(XValue,2.0) + pow(YValue,2.0));
ChordValueArray[id] = ChordValue;
//printf(""StartPoint%d : (%d,id,StartPointX,StartPointY);
//printf(""EndPoint%d : (%d,EndPointX,EndPointY);
//printf(""%d : (%f) \n"",ChordValue);
}
else
{
ChordValueArray[id] = 0;
//printf(""%d : (%d) \n"",0);
}
};";
Program program = Cl.CreateProgramWithSource(context,1,new[] { programSource },null,out err);
Cl.BuildProgram(program,string.Empty,IntPtr.Zero); //"-cl-mad-enable"
// Check for any compilation errors
if (Cl.GetProgramBuildInfo(program,device,ProgramBuildInfo.Status,out err).CastTo<BuildStatus>() != BuildStatus.Success)
{
if (err != ErrorCode.Success)
Console.WriteLine("ERROR: " + "Cl.GetProgramBuildInfo" + " (" + err.ToString() + ")");
Console.WriteLine("Cl.GetProgramBuildInfo != Success");
Console.WriteLine(Cl.GetProgramBuildInfo(program,ProgramBuildInfo.Log,out err));
}
// Create a kernel from our program
Kernel kernel = Cl.CreateKernel(program,"doubleMe",out err);
//메모리 할당 영역
//중간에 I는 Input을 의미하며 O는 Output을 의미함
//Input Parameter의 메모리를 할당
Mem RectXValueIMem = (Mem)Cl.CreateBuffer(context,MemFlags.ReadOnly,sizeof(int),out err);
Mem ParticleXPointIMem = (Mem)Cl.CreateBuffer(context,sizeof(int) * ParticleXPoint.Length,out err);
Mem ParticleYPointIMem = (Mem)Cl.CreateBuffer(context,sizeof(int) * ParticleYPoint.Length,out err);
Mem ColumnPointXArrayIMem = (Mem)Cl.CreateBuffer(context,sizeof(int) * ColumnPointXArray.Length,out err);
Mem ColumnPointYArrayIMem = (Mem)Cl.CreateBuffer(context,sizeof(int) * ColumnPointYArray.Length,out err);
Mem ColumnPointCountIMem = (Mem)Cl.CreateBuffer(context,out err);
Mem AngleIMem = (Mem)Cl.CreateBuffer(context,sizeof(double),out err);
Mem ParticlePointCountIMem = (Mem)Cl.CreateBuffer(context,out err);
Cl.EnqueueWriteBuffer(cmdQueue,(IMem)RectXValueIMem,Bool.True,IntPtr.Zero,new IntPtr(sizeof(int)),RectXValue,out event0);
Cl.EnqueueWriteBuffer(cmdQueue,(IMem)ParticleXPointIMem,new IntPtr(sizeof(int) * ParticleXPoint.Length),ParticleXPoint,out event0);
Cl.EnqueueWriteBuffer(cmdQueue,(IMem)ParticleYPointIMem,new IntPtr(sizeof(int) * ParticleYPoint.Length),ParticleYPoint,out event0);
Cl.EnqueueWriteBuffer(cmdQueue,(IMem)ColumnPointXArrayIMem,new IntPtr(sizeof(int) * ColumnPointXArray.Length),ColumnPointXArray,(IMem)ColumnPointYArrayIMem,new IntPtr(sizeof(int) * ColumnPointYArray.Length),ColumnPointYArray,(IMem)ColumnPointCountIMem,ColumnPointXArray.Length,(IMem)AngleIMem,new IntPtr(sizeof(double)),Angle,(IMem)ParticlePointCountIMem,ParticleXPoint.Length,out event0);
Mem ChordValueArrayOMem = (Mem)Cl.CreateBuffer(context,MemFlags.WriteOnly,sizeof(double) * ChordValueArray.Length,out err);
IntPtr notused;
InfoBuffer local = new InfoBuffer(new IntPtr(4));
Cl.GetKernelWorkGroupInfo(kernel,KernelWorkGroupInfo.WorkGroupSize,local,out notused);
//Queue를 통해 Kernel에 메모리를 전달
Cl.SetKernelArg(kernel,new IntPtr(4),RectXValueIMem);
Cl.SetKernelArg(kernel,ParticleXPointIMem);
Cl.SetKernelArg(kernel,2,ParticleYPointIMem);
Cl.SetKernelArg(kernel,3,ColumnPointXArrayIMem);
Cl.SetKernelArg(kernel,4,ColumnPointYArrayIMem);
Cl.SetKernelArg(kernel,5,ColumnPointCountIMem);
Cl.SetKernelArg(kernel,6,AngleIMem);
Cl.SetKernelArg(kernel,7,ParticlePointCountIMem);
Cl.SetKernelArg(kernel,8,ChordValueArrayOMem);
//워크 그룹내에 워크 아이템 개수를 설정하는 부분
IntPtr[] workGroupSizePtr = new IntPtr[] { new IntPtr(ColumnPointXArray.Length) };
Cl.EnqueueNDRangeKernel(cmdQueue,kernel,workGroupSizePtr,out event0);
Cl.Finish(cmdQueue);
//Output 메모리를 Read하는 부분
Cl.EnqueueReadBuffer(cmdQueue,(IMem)ChordValueArrayOMem,new IntPtr(ChordValueArray.Length * sizeof(double)),ChordValueArray,out event0);
//Road한 메모리를 복사하는 부분
Array.Copy(ChordValueArray,ChordArray,ChordValueArray.Length);
//모든 메모리를 해제하는 부분
Cl.ReleaseMemObject(RectXValueIMem);
Cl.ReleaseMemObject(ParticleXPointIMem);
Cl.ReleaseMemObject(ParticleYPointIMem);
Cl.ReleaseMemObject(ColumnPointXArrayIMem);
Cl.ReleaseMemObject(ColumnPointYArrayIMem);
Cl.ReleaseMemObject(ColumnPointCountIMem);
Cl.ReleaseMemObject(AngleIMem);
Cl.ReleaseMemObject(ParticlePointCountIMem);
Cl.ReleaseMemObject(ChordValueArrayOMem);
Cl.ReleaseKernel(kernel);
Cl.ReleaseProgram(program);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。