我无法在OpenCL.NET中释放GPU内存

如何解决我无法在OpenCL.NET中释放GPU内存

我一直在用C#开发OpenCL.NET。我在这个项目中有问题。我在所附代码下开发了OpenCL Part。您可以在代码底部找到有关释放内存,内核,程序的代码。我认为这段代码可以释放GPU内存。但它做不到。运行后,我看不出任何区别。我无法像图片一样释放GPU内存。我不知道如何释放GPU内存。您能帮我指导这部分吗?这段代码是C#,如果您知道在唯一的c ++中释放GPu内存,请让我聊天,我可以理解

enter image description here

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 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res