Ejemplo n.º 1
0
        public static int Show(string[] SelectItem)
        {
            SelectForm SF = new SelectForm();

            foreach (var item in SelectItem)
            {
                SF.comboBox1.Items.Add(item);
            }
            SF.comboBox1.SelectedIndex = 0;
            SF.ShowDialog();
            return(SF.iRet);
        }
Ejemplo n.º 2
0
        private static void Main()
        {
            OpenCL.GetPlatformIDs(32, new IntPtr[32], out uint num_platforms);
            var devices = new List <Device>();

            for (int i = 0; i < num_platforms; i++)
            {
                devices.AddRange(OpenCL.GetPlatform(i).QueryDevices(DeviceType.ALL));
            }
            int device = SelectForm.Show((from Device d in devices select d.Name).ToArray());

            if (device == -1)
            {
                return;
            }
            platform   = devices[device].Platform;                                                                                                                                                                              //平台
            oclDevice  = devices[device];                                                                                                                                                                                       //选中运算设备
            oclContext = platform.CreateContext(new[] { (IntPtr)ContextProperties.PLATFORM, platform.PlatformID, IntPtr.Zero, IntPtr.Zero }, new[] { oclDevice }, new ContextNotify(OpenCLContextNotifyCallBack), IntPtr.Zero); //根据配置建立上下文
            oclCQ      = oclContext.CreateCommandQueue(oclDevice, CommandQueueProperties.PROFILING_ENABLE);                                                                                                                     //创建请求队列
            if (!oclDevice.ImageSupport)
            {
                return;                                     //如果失败返回
            }
            if (!oclContext.SupportsImageFormat(MemFlags.READ_WRITE, MemObjectType.IMAGE2D, ChannelOrder.RGBA, ChannelType.UNSIGNED_INT8))
            {
                return;
            }
            sampler      = oclContext.CreateSampler(true, AddressingMode.NONE, FilterMode.NEAREST);
            FilterKernel = oclContext.MakeCode("FilterImage", CLCode1);
            Kernel K2 = oclContext.MakeCode("vector_add_gpu", CLCode2);

            int aaa = K2.PECount(oclDevice);

            aaa = aaa;
            #region 试一下用GPU做运算
            int[]  a  = new[] { 1, 2, 3, 1722 };
            int[]  b  = new[] { 456, 2, 1, 56 };
            int[]  c  = new[] { 0, 0, 0, 0 };
            CL.Mem n1 = oclContext.CreateBuffer(MemFlags.READ_WRITE | MemFlags.COPY_HOST_PTR, a.Length * sizeof(int), a.ToIntPtr());
            CL.Mem n2 = oclContext.CreateBuffer(MemFlags.READ_WRITE | MemFlags.COPY_HOST_PTR, b.Length * sizeof(int), b.ToIntPtr());
            CL.Mem n3 = null;
            unchecked { n3 = oclContext.CreateBuffer(MemFlags.READ_WRITE, b.Length * sizeof(int), IntPtr.Zero); }
            K2.SetArg(0, n1);
            K2.SetArg(1, n2);
            K2.SetArg(2, n3);
            K2.SetArg(3, (int)c.Length);
            oclCQ.EnqueueNDRangeKernel(K2, 1, null, new[] { c.Length, 0 }, null);
            oclCQ.EnqueueBarrier();
            oclCQ.Finish();
            // */
            //oclContext.WriterValues(oclCQ, n3, B);
            c = oclContext.ReadIntValues(oclCQ, n3, c.Length);

            c = c;
            // */
            #endregion

            var sdi = new ShowDeviceInfo();
            var lb  = sdi.listBox1.Items;
            lb.Add($"Name:{oclDevice.Name}");
            lb.Add($"DeviceType:{oclDevice.DeviceType.ToString()}");
            lb.Add($"MaxComputeUnits(最大计算单元):{oclDevice.MaxComputeUnits}");
            lb.Add($"ImageSupport:{oclDevice.ImageSupport}");
            lb.Add($"AddressBits:{oclDevice.AddressBits}");
            lb.Add($"DriverVersion:{oclDevice.DriverVersion}");
            lb.Add($"MaxClockFrequency(最大时钟频率):{oclDevice.MaxClockFrequency}MHz");
            lb.Add($"MaxMemAllocSize(最大内存):{oclDevice.MaxMemAllocSize / 1024 / 1024 / 1024}GB");
            lb.Add($"MaxWorkItemDimensions(最大工作维度):{oclDevice.MaxWorkItemDimensions}");
            lb.Add($"MaxWorkGroupSize(最大工作组数量):{oclDevice.MaxWorkGroupSize }");
            lb.Add($"Version(OpenCL版本):{oclDevice.Version}");
            lb.Add($"GlobalMemSize(显存):{oclDevice.GlobalMemSize / 1024 / 1024 / 1024}GB");
            lb.Add($"GlobalMemCacheSize(显存缓存):{oclDevice.GlobalMemCacheSize / 1024}KB");
            lb.Add($"GlobalMemCacheLineSize:{oclDevice.GlobalMemCacheLineSize}");
            lb.Add($"Vendor(厂商):{oclDevice.Vendor}");
            lb.Add($"HostUnifiedMemory(是否和Host共用内存):{oclDevice.HostUnifiedMemory}");
            sdi.ShowDialog();
            #region 调用编译好的生命游戏程序
            //if (oclDevice.DeviceType == DeviceType.GPU)
            {
                OutImage1 = oclContext.CreateImage2D(MemFlags.READ_WRITE, CL.ImageFormat.RGBA8U, TestImage.Width, TestImage.Height, 0, IntPtr.Zero);
                OutImage2 = oclContext.CreateImage2D(MemFlags.READ_WRITE, CL.ImageFormat.RGBA8U, TestImage.Width, TestImage.Height, 0, IntPtr.Zero);
                FilterKernel.SetArg(0, 1.0f);
                FilterKernel.SetArg(1, 1.0f);
                FilterKernel.SetArg(2, oclContext.ToCLImage(TestImage));
                FilterKernel.SetArg(3, OutImage1);
                FilterKernel.SetArg(4, sampler);
                oclCQ.EnqueueNDRangeKernel(FilterKernel, 2, null, new IntPtr[] { OutImage1.Width, OutImage1.Height, IntPtr.Zero }, null);
                oclCQ.EnqueueBarrier();
                oclCQ.Finish();
                new MainForm().ShowDialog();
            }
            // */
            #endregion

            Application.Exit();
        }