Пример #1
0
        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());
            }
        }
Пример #2
0
        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();
        }
Пример #3
0
        /// <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());
     }
 }
Пример #5
0
        /// <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());
                    }
                }
        }