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); }
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(); }