public void Run(ComputeContext context, TextWriter log) { try { ComputeProgram program = new ComputeProgram(context, kernelSources); program.Build(null, null, null, IntPtr.Zero); log.WriteLine("Program successfully built."); ICollection <ComputeKernel> kernels = program.CreateAllKernels(); log.WriteLine("Kernels successfully created."); // cleanup kernels foreach (ComputeKernel kernel in kernels) { kernel.Dispose(); } kernels.Clear(); // cleanup program program.Dispose(); } catch (Exception e) { log.WriteLine(e.ToString()); } }
public KernelManager(GraphicsInterop interop, InputManager input, string source) { _input = input; var localSizeSingle = (long)Math.Sqrt(interop.Device.MaxWorkGroupSize); _localSize = new[] { localSizeSingle, localSizeSingle }; //_localSize = new[] { interop.Device.MaxWorkGroupSize, 1 }; _program = new ComputeProgram(interop.Context, source); try { _program.Build(new[] { interop.Device }, "", null, IntPtr.Zero); } catch (InvalidBinaryComputeException) { Console.WriteLine(_program.GetBuildLog(interop.Device)); return; } catch (BuildProgramFailureComputeException) { Console.WriteLine(_program.GetBuildLog(interop.Device)); return; } Console.WriteLine(_program.GetBuildLog(interop.Device)); _kernels = _program.CreateAllKernels().ToArray(); }
/// <summary> /// Creates the kernels. /// </summary> /// <param name="name">The name.</param> /// <param name="code">The code.</param> /// <exception cref="CompileException"></exception> private void CreateKernels(string code) { var program = new ComputeProgram(_context, code); try { program.Build(null, null, null, IntPtr.Zero); _compiledKernels.AddRange(program.CreateAllKernels()); } catch (Exception ex) { string log = program.GetBuildLog(_defaultDevice); throw new CompileException(string.Format("Compilation error code: {0} \n Message: {1}", ex.Message, log)); } }
public void Run(ComputeContext context, TextWriter log) { try { ComputeProgram program = new ComputeProgram(context, kernelSources); program.Build(null, null, null, IntPtr.Zero); log.WriteLine("Program successfully built."); program.CreateAllKernels(); log.WriteLine("Kernels successfully created."); } catch (Exception e) { log.WriteLine(e.ToString()); } }
/// <summary> /// Run kernel against all elements. /// </summary> /// <typeparam name="TSource">Struct type that corresponds to kernel function type</typeparam> /// <param name="array">Array of elements to process</param> /// <param name="kernelCode">The code of kernel function</param> /// <param name="kernelSelector">Method that selects kernel by function name; if null uses first</param> /// <param name="deviceSelector">Method that selects device by index, description, OpenCL version; if null uses first</param> public static void ClooForEach <TSource>(this TSource[] array, string kernelCode, Func <string, bool> kernelSelector = null, Func <int, string, Version, bool> deviceSelector = null) where TSource : struct { kernelSelector = kernelSelector ?? ((k) => true); deviceSelector = deviceSelector ?? ((i, d, v) => true); var device = ComputePlatform.Platforms.SelectMany(p => p.Devices).Where((d, i) => deviceSelector(i, $"{d.Name} {d.DriverVersion}", d.Version)).First(); var properties = new ComputeContextPropertyList(device.Platform); using (var context = new ComputeContext(new[] { device }, properties, null, IntPtr.Zero)) using (var program = new ComputeProgram(context, kernelCode)) { program.Build(new[] { device }, null, null, IntPtr.Zero); var kernels = program.CreateAllKernels().ToList(); try { var kernel = kernels.First((k) => kernelSelector(k.FunctionName)); using (var primesBuffer = new ComputeBuffer <TSource>(context, ComputeMemoryFlags.ReadWrite | ComputeMemoryFlags.UseHostPointer, array)) { kernel.SetMemoryArgument(0, primesBuffer); using (var queue = new ComputeCommandQueue(context, context.Devices[0], 0)) { queue.Execute(kernel, null, new long[] { primesBuffer.Count }, null, null); queue.Finish(); queue.ReadFromBuffer(primesBuffer, ref array, true, null); } } } finally { kernels.ForEach(k => k.Dispose()); } } }