Esempio n. 1
0
        private static int[] ExecuteStepDpq(Polynomial x, Polynomial y)
        {
            if (x.Degree != y.Degree)
            {
                throw new InvalidOperationException("Only works for polynomials of same degree!");
            }

            var d = Math.Min(x.Degree, y.Degree);
            var n = d + 1;

            var dpq = new int[n * n];

            CLCalc.InitCL();
            CLCalc.Program.Compile(new[] { KernelCodeStepDpq });
            var kernel = new CLCalc.Program.Kernel("StepDpq");

            var nCl   = new CLCalc.Program.Variable(new[] { n });
            var xCl   = new CLCalc.Program.Variable(x.Coefficients);
            var yCl   = new CLCalc.Program.Variable(y.Coefficients);
            var dpqCl = new CLCalc.Program.Variable(dpq);

            CLCalc.Program.MemoryObject[] args = { nCl, xCl, yCl, dpqCl };

            var workers = new[] { 2 * n - 2 };

            kernel.Execute(args, workers);
            dpqCl.ReadFromDeviceTo(dpq);
            return(dpq);
        }
Esempio n. 2
0
        private void button6_Click(object sender, EventArgs e)
        {
            float[] x = new float[] { 0 };
            float[] y = new float[] { 0 };
            CLCalc.InitCL();
            if (!string.IsNullOrWhiteSpace(textBox1.Text) && !string.IsNullOrWhiteSpace(textBox2.Text))
            {
                x[0] = (float)Convert.ToDouble(textBox1.Text.Replace('.', ','));
                y[0] = (float)Convert.ToDouble(textBox2.Text.Replace('.', ','));
            }

            string s = @"
            __kernel void
            sum(global float4 *x, global float4 *y) {
                x[0] = x[0] + y[0];
            }";

            CLCalc.Program.Compile(new string[] { s });
            CLCalc.Program.Kernel sum = new CLCalc.Program.Kernel("sum");

            CLCalc.Program.Variable varx = new CLCalc.Program.Variable(x);
            CLCalc.Program.Variable vary = new CLCalc.Program.Variable(y);

            CLCalc.Program.Variable[] args = { varx, vary };
            int[] max = new int[] { 1 };

            sum.Execute(args, max);
            varx.ReadFromDeviceTo(x);
            textBox3.Text = Convert.ToString(x[0]);
        }
Esempio n. 3
0
        /// <summary>Static Constructor. Builds kernels</summary>
        static SparseLinalg()
        {
            if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.Unknown)
            {
                try { CLCalc.InitCL(); }
                catch
                {
                }
            }

            if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.UsingCL)
            {
                //Kernel
                CLLinalgSrc src = new CLLinalgSrc();
                CLCalc.Program.Compile(new string[] { src.srcDotProd, src.srcMatVecMult, src.srcLinConjGrad });
                kernelDotProduct = new CLCalc.Program.Kernel("dotProd");
                kernelSum        = new CLCalc.Program.Kernel("sumDotProd");
                kernelGetDotSum  = new CLCalc.Program.Kernel("GetResp");

                kernelSparseMatrixVecMult = new CLCalc.Program.Kernel("SparseMatrixVecMult");

                //Linear solving
                kernelInitRP      = new CLCalc.Program.Kernel("InitRP");
                kernelMultiplyAdd = new CLCalc.Program.Kernel("MultiplyAdd");
                kernelCopyToTemp  = new CLCalc.Program.Kernel("CopyToTemp");
            }
        }
Esempio n. 4
0
        /// <summary>Compiles code and initializes kernel for this svm stance</summary>
        private void CLSVMInit()
        {
            if (CLResource == null)
            {
                CLResource = new int[0];
            }

            lock (CLResource)
            {
                if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.Unknown)
                {
                    CLCalc.InitCL();
                }
                if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.UsingCL)
                {
                    if (kernelComputeKernelRBF == null)
                    {
                        CLSVMSrc s = new CLSVMSrc();
                        CLCalc.Program.Compile(new string[] { s.srcKernels, s.srcFindMaxMinErr, s.srcMultClass });

                        //Kernel computation
                        kernelComputeKernelRBF = new CLCalc.Program.Kernel("ComputeKernelRBF");



                        kernelMaxErr     = new CLCalc.Program.Kernel("maxErr");
                        kernelComputeMax = new CLCalc.Program.Kernel("computeMax");
                        kernelMinErr     = new CLCalc.Program.Kernel("minErr");
                        kernelComputeMin = new CLCalc.Program.Kernel("computeMin");
                        kernelGetResp    = new CLCalc.Program.Kernel("getResp");

                        //Update error
                        kernelUpdateErr = new CLCalc.Program.Kernel("UpdateErr");

                        //Multiple classification
                        kernelComputeMultiKernelRBF = new CLCalc.Program.Kernel("ComputeMultiKernelRBF");
                        kernelSumKernels            = new CLCalc.Program.Kernel("SumKernels");
                    }

                    //Memory obbjects

                    //Find max/min
                    CLErrLen     = new CLCalc.Program.Variable(new int[1]);
                    HostResp     = new int[1];
                    CLResp       = new CLCalc.Program.Variable(HostResp);
                    CLMaxMinErrs = new CLCalc.Program.Variable(new float[MAXMINWORKSIZE]);
                    CLMaxMinInds = new CLCalc.Program.Variable(new int[MAXMINWORKSIZE]);
                    //Update error
                    CLUpdtErrParams = new CLCalc.Program.Variable(new float[3]);
                }
            }
        }
Esempio n. 5
0
            /// <summary>Creates a new filter from a given compiled kernel.</summary>
            /// <param name="filterCode">Code to compile</param>
            /// <param name="filterName">Filter name</param>
            public CLFilter(CLCalc.Program.Kernel filterKernel, string filterName)
            {
                if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.Unknown)
                {
                    CLCalc.InitCL();
                }
                if (CLCalc.CLAcceleration != CLCalc.CLAccelerationType.UsingCL)
                {
                    throw new Exception("OpenCL not available");
                }

                this.FilterName   = filterName;
                this.FilterKernel = filterKernel;
            }
Esempio n. 6
0
        private void InitKernel()
        {
            if (kernelExtractFeatures == null)
            {
                CLExtractFeatSrc    src  = new CLExtractFeatSrc();
                CLBracketRegionsSrc src2 = new CLBracketRegionsSrc();

                CLCalc.Program.Compile(new string[] { src2.src, src.src });

                kernelExtractFeatures  = new CLCalc.Program.Kernel("ExtractFeatures");
                kernelComputeFrameDiff = new CLCalc.Program.Kernel("ComputeFrameDiff");
                kernelSegregateSkin    = new CLCalc.Program.Kernel("SegregateSkin");
            }
        }
Esempio n. 7
0
        private static void InitKernels()
        {
            string s = new CLFFTSrc().s;

            CLCalc.InitCL();
            try
            {
                CLCalc.Program.Compile(s);
            }
            catch
            {
            }
            kernelfft_radix16 = new CLCalc.Program.Kernel("fft_radix16");
            kernelfft_radix4  = new CLCalc.Program.Kernel("fft_radix4");
            kernelConjugate   = new CLCalc.Program.Kernel("Conjugate");
            CLp = new CLCalc.Program.Variable(new int[1]);
        }
Esempio n. 8
0
            /// <summary>Creates a new filter from a given code. Filter kernel name has to be the same as kernel name
            /// (disregarding spaces - Ex: Kernel is GaussianBlur and filter name is Gaussian Blur)</summary>
            /// <param name="filterCode">Complete OpenCL kernel code to compile</param>
            /// <param name="filterName">Filter name</param>
            public CLFilter(string filterCode, string filterName)
            {
                if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.Unknown)
                {
                    CLCalc.InitCL(Cloo.ComputeDeviceTypes.Gpu);
                }
                if (CLCalc.CLAcceleration != CLCalc.CLAccelerationType.UsingCL)
                {
                    throw new Exception("OpenCL not available");
                }

                CLCalc.Program.Compile(filterCode);

                this.FilterName = filterName;
                string kernelname = FilterName.Replace(" ", "").ToLower();

                FilterKernel = new CLCalc.Program.Kernel(kernelname);
            }
        public void Initialize(BaseCameraApplication app)
        {
            try
            {
                CLCalc.Program.Compile(app.GetPrimaryDevice().GetPreprocessCode() + src);
            }
            catch (BuildProgramFailureComputeException ex)
            {
                System.Console.WriteLine(ex.Message);
                Environment.Exit(1);
            }
            int width = app.GetPrimaryDevice().GetDepthImage().Width;

            int height = app.GetPrimaryDevice().GetDepthImage().Height;
            pointBuffer = CLCalc.Program.Variable.Create(new ComputeBuffer<float>(CLCalc.Program.Context, ComputeMemoryFlags.ReadWrite | ComputeMemoryFlags.CopyHostPointer, points = new float[width * height * 4]));
            colorBuffer = CLCalc.Program.Variable.Create(new ComputeBuffer<float>(CLCalc.Program.Context, ComputeMemoryFlags.ReadWrite | ComputeMemoryFlags.CopyHostPointer, colors = new float[width * height * 4]));

            kernelCopyImage = new CLCalc.Program.Kernel("CopyToPoinCloud");
        }
Esempio n. 10
0
        private void button3_Click(object sender, EventArgs e)
        {
            float[] x = new float[] { 1, 2, 3, 0.123f };
            float[] y = new float[] { 1, 2, 1, 1 };

            string s = @"
                       kernel void
                       sum (global float4 * x, global float4 * y)
                       {
                           x[0] = x[0] + y[0];
                       }
";

            CLCalc.Program.Compile(new string[] { s });
            CLCalc.Program.Kernel sum = new CLCalc.Program.Kernel("sum");

            CLCalc.Program.Variable   varx = new CLCalc.Program.Variable(x);
            CLCalc.Program.Variable   vary = new CLCalc.Program.Variable(y);
            CLCalc.Program.Variable[] args = { varx, vary };

            int[] max = new int[] { 1 };

            sum.Execute(args, max);

            varx.ReadFromDeviceTo(x);

            //float[] t = new float[1] { 0 };
            //float[] pos = new float[] { 1, 2, 3, 4, 5, 6 };
            //float[] vel = new float[] { 1, 0, 0, 0, 0, 0 };
            //float[] forces = new float[] { 0, 1, 0, 0, 0, 0 };

            //float[] masses = new float[] { 1, 1 };
            //float[] colSizes = new float[] { 0.1f, 0.1f };


            //CLCalc.InitCL();

            //CLCalc.CLPrograms.floatBodyPhysics phys = new CLCalc.CLPrograms.floatBodyPhysics(10);
            //CLCalc.CLPrograms.floatBodyPhysics phys2 = new CLCalc.CLPrograms.floatBodyPhysics(20);


            //CLCalc.FinishCL();
        }
Esempio n. 11
0
        /// <summary>Initialize kernels</summary>
        private void InitKernels()
        {
            if (kernelComputeHistograms == null || CLN == null)
            {
                CLSrc src = new CLSrc();
                CLCalc.Program.Compile(src.src);
                kernelComputeHistograms    = new CLCalc.Program.Kernel("ComputeHistogram");
                kernelConsolidateHist      = new CLCalc.Program.Kernel("ConsolidateHist");
                kernelPerformNormalization = new CLCalc.Program.Kernel("PerformNormalization");
                kernelComputeHue           = new CLCalc.Program.Kernel("ComputeHue");

                CLN      = new CLCalc.Program.Variable(new int[] { NLumIntens });
                CLWidth  = new CLCalc.Program.Variable(new int[] { bmp.Width });
                CLHeight = new CLCalc.Program.Variable(new int[] { bmp.Height });

                CLbmp    = new CLCalc.Program.Image2D(bmp);
                CLNewBmp = new CLCalc.Program.Image2D(bmp);
            }
        }
Esempio n. 12
0
        private static void GPU()
        {
            string vecSum = @"
                     __kernel void
                    floatVectorSum(__global       float * v1,
                                   __global       float * v2)
                    {
                        // Vector element index
                        int i = get_global_id(0);
                        v1[i] = v1[i] + v2[i];
                    }";

            //Initializes OpenCL Platforms and Devices and sets everything up
            CLCalc.InitCL();
            //Compiles the source codes. The source is a string array because the user may want
            //to split the source into many strings.
            CLCalc.Program.Compile(new string[] { vecSum });
            //Gets host access to the OpenCL floatVectorSum kernel
            CLCalc.Program.Kernel VectorSum = new CLCalc.Program.Kernel("floatVectorSum");
            //We want to sum 2000 numbers
            int n = 20000000;

            //Create vectors with 2000 numbers
            float[] v1 = new float[n], v2 = new float[n];
            //Creates population for v1 and v2
            for (int i = 0; i < n; i++)
            {
                v1[i] = (float)i / 10;
                v2[i] = -(float)i / 8;
            }
            //Creates vectors v1 and v2 in the device memory
            CLCalc.Program.Variable varV1 = new CLCalc.Program.Variable(v1);
            CLCalc.Program.Variable varV2 = new CLCalc.Program.Variable(v2);
            //Arguments of VectorSum kernel
            CLCalc.Program.Variable[] args = new CLCalc.Program.Variable[] { varV1, varV2 };
            //How many workers will there be? We need "n", one for each element
            //int[] workers = new int[1] { n };
            //Execute the kernel
            VectorSum.Execute(args, 20000000);
            //Read device memory varV1 to host memory v1
            varV1.ReadFromDeviceTo(v1);
        }
Esempio n. 13
0
        private void button1_Click(object sender, EventArgs e)
        {
            CLCalc.InitCL();


            double[] a = new double[] { 2, 147483647, 2, 7 };
            double[] b = new double[] { 1, 2, 7, 4 };
            double[] c = new double[4];

            CLCalc.Program.Variable v1 = new CLCalc.Program.Variable(a);
            CLCalc.Program.Variable v2 = new CLCalc.Program.Variable(b);
            CLCalc.Program.Variable v3 = new CLCalc.Program.Variable(c);

            CLCalc.CLPrograms.VectorSum VecSum = new CLCalc.CLPrograms.VectorSum();
            CLCalc.CLPrograms.MinDifs   Mdifs  = new CLCalc.CLPrograms.MinDifs();

            //string[] s = new string[] { VecSum.intVectorSum, VecSum.floatVectorSum };
            string[] s = new string[] { VecSum.doubleVectorSum };


            CLCalc.Program.Compile(s);

            CLCalc.Program.Kernel k = new CLCalc.Program.Kernel("doubleVectorSum");
            //CLCalc.Program.Kernel k2 = new CLCalc.Program.Kernel("intVectorSum");
            //CLCalc.Program.Kernel k = new CLCalc.Program.Kernel("floatMinDifs");

            CLCalc.Program.Variable[] vv = new CLCalc.Program.Variable[3] {
                v1, v2, v3
            };

            int[] max = new int[1] {
                a.Length
            };

            k.Execute(vv, max);

            CLCalc.Program.Sync();

            v3.ReadFromDeviceTo(c);

            CLCalc.FinishCL();
        }
Esempio n. 14
0
        private void button4_Click(object sender, EventArgs e)
        {
            nMassas = new int[1] {
                10
            };

            //Integrador de EDO
            float x0 = 0;

            float[] y0 = new float[2 * nMassas[0]];

            //y0[0]=posicao, y0[1] = velocidade
            for (int i = 0; i < 2 * nMassas[0]; i += 2)
            {
                y0[i] = 1;
            }

            CLCalc.CLPrograms.floatODE46 ode46 = new CLCalc.CLPrograms.floatODE46(x0, 0.005f, y0, MassaMola);

            //CLCalc.Program.DefaultCQ = 0;

            //Retorno de derivadas
            string[] s = new string[] { CLCalc.EnableDblSupport, floatDerivsMMola };
            CLCalc.Program.Compile(s);
            KernelDerivs = new CLCalc.Program.Kernel("floatDerivs");

            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            sw.Start();
            ode46.Integrate(20);
            sw.Stop();
            this.Text = sw.ElapsedMilliseconds.ToString();
            Application.DoEvents();

            float[] y = ode46.State;

            ode46.Integrate(25);
            y = ode46.State;
            float[] yerr = ode46.AbsError;
            float   x    = ode46.IndepVar;
        }
Esempio n. 15
0
 public CollisionDetector()
 {
     if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.Unknown)
     {
         try
         {
             CLCalc.InitCL();
         }
         catch
         {
         }
     }
     try
     {
         if (CLCalc.CLAcceleration != CLCalc.CLAccelerationType.UsingCL)
         {
             return;
         }
         CollisionDetector.DisplacementSource    displacementSource    = new CollisionDetector.DisplacementSource();
         CollisionDetector.ExactCollisionSource  exactCollisionSource  = new CollisionDetector.ExactCollisionSource();
         CollisionDetector.VertexCollisionSource vertexCollisionSource = new CollisionDetector.VertexCollisionSource();
         CLCalc.Program.Compile(new string[4]
         {
             displacementSource.srcCalcRotacoes,
             displacementSource.srcCalcTransl,
             exactCollisionSource.srcExactCollision,
             vertexCollisionSource.srcVertexCollision
         });
         this.kernelCalcRotacoes        = new CLCalc.Program.Kernel("CalcRotacoes");
         this.kernelCalcTransl          = new CLCalc.Program.Kernel("CalcTransl");
         this.kernelCalcExactCollision  = new CLCalc.Program.Kernel("CalcExactCollision");
         this.kernelCalcVertexCollision = new CLCalc.Program.Kernel("CalcVertexCollision");
     }
     catch (Exception ex)
     {
         int num = (int)MessageBox.Show(ex.ToString());
     }
 }
Esempio n. 16
0
        public void DoubleSumTest()
        {
            string text = File.ReadAllText("Examples/SumTest.cl");

            CLCalc.InitCL();
            CLCalc.Program.Compile(new string[] { text });

            int count = 2000;
            var a     = new double[count];
            var b     = new double[count];
            var ab    = new double[count];

            for (int i = 0; i < count; i++)
            {
                a[i] = i / 10.0;
                b[i] = -i / 9.0;
            }

            using (CLCalc.Program.Kernel Kernel = new CLCalc.Program.Kernel("doubleVectorSum"))
            {
                using (CLCalc.Program.Variable
                       varA = new CLCalc.Program.Variable(a),
                       varB = new CLCalc.Program.Variable(b))
                {
                    var args    = new CLCalc.Program.Variable[] { varA, varB };
                    var workers = new int[1] {
                        count
                    };
                    Kernel.Execute(args, workers);
                    varA.ReadFromDeviceTo(ab);
                }
            }
            for (int i = 0; i < count; i++)
            {
                Assert.AreEqual(-i / 90.0, ab[i], 1E-13);
            }
        }
Esempio n. 17
0
        public static Polynomial MultiplyKaratsubaOpenCl(Polynomial x, Polynomial y)
        {
            if (x.Degree != y.Degree)
            {
                throw new InvalidOperationException("Only works for polynomials of same degree!");
            }

            var d = Math.Min(x.Degree, y.Degree);
            var n = d + 1;

            var di  = ExecuteStepDi(x, y);
            var dpq = ExecuteStepDpq(x, y);
            var z   = new int[2 * n - 1];

            z[0]         = di[0];
            z[2 * n - 2] = di[n - 1];

            CLCalc.InitCL();
            CLCalc.Program.Compile(new[] { KernelCodeStepKaratsuba });
            var kernel = new CLCalc.Program.Kernel("StepKaratsuba");

            var nCl   = new CLCalc.Program.Variable(new[] { n });
            var xCl   = new CLCalc.Program.Variable(x.Coefficients);
            var yCl   = new CLCalc.Program.Variable(y.Coefficients);
            var diCl  = new CLCalc.Program.Variable(di);
            var dpqCl = new CLCalc.Program.Variable(dpq);
            var zCl   = new CLCalc.Program.Variable(z);

            CLCalc.Program.MemoryObject[] args = { nCl, xCl, yCl, diCl, dpqCl, zCl };

            var workers = new[] { 2 * n - 3 };

            kernel.Execute(args, workers);
            zCl.ReadFromDeviceTo(z);
            return(new Polynomial(z));
        }
        static Kernels()
        {
            try
            {
                CLCalc.Program.Compile(src);
                CLCalc.Program.MemoryObject[] Args = new CLCalc.Program.MemoryObject[100];;
                int globalWorkSize = 4;

                // compile the kernels

                KernelStart = new CLCalc.Program.Kernel("KernelStart");
                vetTransl   = new CLCalc.Program.Kernel("vetTransl");

                // run kernel start

                KernelStart.Execute(Args, globalWorkSize);
            }
            catch (NullReferenceException nre)
            {
                System.Console.WriteLine("" + nre);
            }

            //           System.Diagnostics.Debug.WriteLine("Hello");
        }
Esempio n. 19
0
        static DynamicShading()
        {
            #region OpenCL Source

            #region Thresholding
            string srcThresh = @"
__kernel void Threshold(__constant  int *      cfg,
                        __read_only image2d_t  imgSrc,
                        __global    uchar *    byteInfo,
                        __write_only image2d_t imgThresh)

{
   const sampler_t smp = CLK_NORMALIZED_COORDS_FALSE | //Natural coordinates
         CLK_ADDRESS_CLAMP | //Clamp to zeros
         CLK_FILTER_NEAREST; //Don't interpolate

   int thresh = cfg[0];

   int2 coord = (int2)(get_global_id(0),get_global_id(1));

   uint4 pix = read_imageui(imgSrc, smp, coord);
   
   int pixBW = (int)pix.x+(int)pix.y+(int)pix.z;
   pixBW = pixBW > 3*thresh ? 255 : 0;
   
   byteInfo[coord.x+get_global_size(0)*coord.y] = pixBW;
   
   pix = (uint4)((uint)pixBW,(uint)pixBW,(uint)pixBW,255);
   write_imageui(imgThresh,coord,pix);
}

__kernel void RestoreBlackPixels(__constant int * cfg,
                                 __read_only image2d_t imgSrc,
                                 __read_only image2d_t imgRender,
                                 __write_only image2d_t dst)
{
   const sampler_t smp = CLK_NORMALIZED_COORDS_FALSE | //Natural coordinates
         CLK_ADDRESS_CLAMP | //Clamp to zeros
         CLK_FILTER_NEAREST; //Don't interpolate

   int thresh = cfg[0];

   int2 coord = (int2)(get_global_id(0),get_global_id(1));

   uint4 pix = read_imageui(imgSrc, smp, coord);
   
   int pixBW = (int)pix.x+(int)pix.y+(int)pix.z;
   
   if (pixBW <= 3*thresh) pix = (uint4)(0,0,0,255);
   else pix = read_imageui(imgRender, smp, coord);

   write_imageui(dst,coord,pix);

}

";
            #endregion

            #region Propagate distance to line
            string srcPropag = @"
__kernel void initWeight(__global float * weight)
{
   int2 coord = (int2)(get_global_id(0),get_global_id(1));
   int w = get_global_size(0);
   int idx = coord.x+w*coord.y;
   weight[idx] = 1e20f;
}

__kernel void initTotalWeight(__global float * weight)
{
   int2 coord = (int2)(get_global_id(0),get_global_id(1));
   int w = get_global_size(0);
   int idx = coord.x+w*coord.y;
   weight[idx] = 0.0f;
}

__kernel void AddToTotalWeight(__global       float * totalWeight,
                               __global const float * weight,
                               __constant     float * color,
                               __read_only  image2d_t curImg,
                               __write_only image2d_t dstImg,
                               __global const uchar*  byteInfo)

{
   const sampler_t smp = CLK_NORMALIZED_COORDS_FALSE | //Natural coordinates
         CLK_ADDRESS_CLAMP | //Clamp to zeros
         CLK_FILTER_NEAREST; //Don't interpolate

  int x = get_global_id(0);
  int y = get_global_id(1);
  int w = get_global_size(0);
  
  int idx = x+w*y;
  
  float totWeight = totalWeight[idx];
  float myWeight = native_recip(weight[idx]);
  myWeight = powr(myWeight, 1.6f);
  //myWeight = native_log(1.0f + myWeight);  
  
  int2 coord = (int2)(x,y);
   
  uint4 pix = read_imageui(curImg, smp, coord);

  float4 curColor = (float4)((float)pix.x,(float)pix.y,(float)pix.z,255.0f);
  float4 newColor = (float4)((float)color[0],(float)color[1],(float)color[2],255.0f);
  
  newColor = (newColor * myWeight + curColor * totWeight)*native_recip(myWeight+totWeight);
  newColor = clamp(newColor, 0.0f, 255.0f);

  pix = (uint4)((uint)newColor.x,(uint)newColor.y,(uint)newColor.z,255);
  if (byteInfo[idx] == 0) pix = (uint4)(0,0,0,255);
  write_imageui(dstImg,coord,pix);

  totalWeight[idx] = totWeight + myWeight;
}


__kernel void PropagateDist(__global        int * changed,
                            __read_only image2d_t imgStroke,
                            __global const uchar* byteInfo,
                            __global      float * weight,
                            __write_only image2d_t imgDists)
{
   const sampler_t smp = CLK_NORMALIZED_COORDS_FALSE | //Natural coordinates
         CLK_ADDRESS_CLAMP | //Clamp to zeros
         CLK_FILTER_NEAREST; //Don't interpolate

   int2 coord = (int2)(get_global_id(0),get_global_id(1));
   int w = get_global_size(0);
   
   uint4 pix = read_imageui(imgStroke, smp, coord);
   
   int val = max((int)pix.z,max((int)pix.x,(int)pix.y));
   
   int idx = coord.x+w*coord.y;
   float curW = 0.0f;

    if (val > 0) curW == 1E-9f;
   
    else if (coord.x == 0 || coord.y == 0 || coord.x == w-1 || coord.y == get_global_size(1)-1 || byteInfo[idx]==0) curW = 1e20f;
    else
    {
        curW = weight[idx-1]+1;
        curW = fmin(curW, weight[idx+1] + 1); 
        curW = fmin(curW, weight[idx+w] + 1); 
        curW = fmin(curW, weight[idx-w] + 1); 

        curW = fmin(curW, weight[idx-w-1] + 1.41421356237f); 
        curW = fmin(curW, weight[idx-w+1] + 1.41421356237f); 
        curW = fmin(curW, weight[idx+w-1] + 1.41421356237f); 
        curW = fmin(curW, weight[idx+w+1] + 1.41421356237f);
      
    }
   
   if (weight[idx] != curW) changed[0] = 1;
   weight[idx] = curW;

   //float pixBW = clamp(curW,0.0f,255.0f);
   //uint4 pix2 = (uint4)((uint)pixBW,(uint)0,255-(uint)pixBW,255);
   //if (byteInfo[idx]==0) pix2 = (uint4)((uint)0,(uint)0,(uint)0,255);
   //write_imageui(imgDists,coord,pix2);
}

";

            #endregion

            #endregion

            if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.Unknown)
            {
                CLCalc.InitCL();
            }

            CLCalc.Program.Compile(new string[] { srcThresh, srcPropag });

            kernelThreshold          = new CLCalc.Program.Kernel("Threshold");
            kernelPropagateDist      = new CLCalc.Program.Kernel("PropagateDist");
            kernelinitWeight         = new CLCalc.Program.Kernel("initWeight");
            kernelinitTotalWeight    = new CLCalc.Program.Kernel("initTotalWeight");
            kernelAddToTotalWeight   = new CLCalc.Program.Kernel("AddToTotalWeight");
            kernelRestoreBlackPixels = new CLCalc.Program.Kernel("RestoreBlackPixels");
        }
Esempio n. 20
0
        /// <summary>Static Constructor. Builds kernels</summary>
        static SparseLinalg()
        {
            if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.Unknown)
            {
                try { CLCalc.InitCL(); }
                catch
                {
                }
            }

            if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.UsingCL)
            {
                //Kernel
                CLLinalgSrc src = new CLLinalgSrc();
                CLCalc.Program.Compile(new string[] { src.srcDotProd, src.srcMatVecMult, src.srcLinConjGrad });
                kernelDotProduct = new CLCalc.Program.Kernel("dotProd");
                kernelSum = new CLCalc.Program.Kernel("sumDotProd");
                kernelGetDotSum = new CLCalc.Program.Kernel("GetResp");

                kernelSparseMatrixVecMult = new CLCalc.Program.Kernel("SparseMatrixVecMult");

                //Linear solving
                kernelInitRP = new CLCalc.Program.Kernel("InitRP");
                kernelMultiplyAdd = new CLCalc.Program.Kernel("MultiplyAdd");
                kernelCopyToTemp = new CLCalc.Program.Kernel("CopyToTemp");
            }
        }
        public void Initialize(BaseCameraApplication app, OpenTKWrapper.CLGLInterop.GLAdvancedRender glw)
        {
            try
            {
                CLCalc.Program.Compile(app.GetPrimaryDevice().GetPreprocessCode() + src);
            }
            catch (BuildProgramFailureComputeException ex)
            {
                System.Console.WriteLine(ex.Message);
                Environment.Exit(1);
            }
            kernelCopyImage = new CLCalc.Program.Kernel("CopyImageToMesh");
            BoundingBox bbox = app.GetPrimaryDevice().GetBoundingBox();
            int w = app.GetPrimaryDevice().GetDepthImage().Width;
            int h = app.GetPrimaryDevice().GetDepthImage().Height;
            int size = w * h;
            ColorData = new float[16 * size];
            PositionData = new float[16 * size];
            NormalData = new float[12 * size];
            for (int i = 0; i < size; i++)
            {
                PositionData[4 * i] = (i / w) - w / 2;
                PositionData[4 * i + 2] = i % w - h / 2;
                PositionData[4 * i + 1] = i % 7;
                PositionData[4 * i + 3] = 1.0f;

            }

            GL.GenBuffers(3, QuadMeshBufs);

            GL.BindBuffer(BufferTarget.ArrayBuffer, QuadMeshBufs[0]);
            GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(ColorData.Length * sizeof(float)), ColorData, BufferUsageHint.StreamDraw);

            GL.BindBuffer(BufferTarget.ArrayBuffer, QuadMeshBufs[1]);
            GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(PositionData.Length * sizeof(float)), PositionData, BufferUsageHint.StreamDraw);//Notice STREAM DRAW

            GL.BindBuffer(BufferTarget.ArrayBuffer, QuadMeshBufs[2]);
            GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(NormalData.Length * sizeof(float)), NormalData, BufferUsageHint.StreamDraw);//Notice STREAM DRAW

            colorBuffer = new CLCalc.Program.Variable(QuadMeshBufs[0], typeof(float));
            positionBuffer = new CLCalc.Program.Variable(QuadMeshBufs[1], typeof(float));
            normalBuffer = new CLCalc.Program.Variable(QuadMeshBufs[2], typeof(float));

            GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
            GL.Enable(EnableCap.Blend);
        }
Esempio n. 22
0
        /// <summary>Constructor.</summary>
        /// <param name="InitialState">Initial state of system</param>
        /// <param name="StepSize">Desired step per integration pass</param>
        /// <param name="InitialIndepVarValue">Initial independent variable value</param>
        /// <param name="DerivativeCalculator">Function to calculate derivatives vector</param>
        public doubleODE46(double InitialIndepVarValue, double StepSize, double[] InitialState, DerivCalcDeleg DerivativeCalculator)
        {
            if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.Unknown)
            {
                CLCalc.InitCL();
            }

            if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.NotUsingCL)
                throw new Exception("OpenCL not available");

            if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.UsingCL)
            {
                ODE46Source Source = new ODE46Source();
                string[] s = new string[] { @"
                            #pragma OPENCL EXTENSION cl_khr_fp64 : enable
                            ", Source.doubleStep2, Source.doubleStep3, Source.doubleStep4, Source.doubleStep5, Source.doubleStep6, Source.doubleFinalizeCalc };
                CLCalc.Program.Compile(s);

                //Calculador de derivada
                Derivs = DerivativeCalculator;

                //Scalars
                double[] xx = new double[1] { InitialIndepVarValue };
                x = new CLCalc.Program.Variable(xx);
                xsav = new CLCalc.Program.Variable(xx);

                //Sets initial values to Device and local variables
                hdid = new CLCalc.Program.Variable(xx);
                currentX = InitialIndepVarValue;
                SetStep(StepSize);

                //Vectors
                yy = new double[InitialState.Length];
                for (int i = 0; i < InitialState.Length; i++) yy[i] = InitialState[i];

                ysav = new CLCalc.Program.Variable(yy);
                k1 = new CLCalc.Program.Variable(InitialState);
                k2 = new CLCalc.Program.Variable(InitialState);
                k3 = new CLCalc.Program.Variable(InitialState);
                k4 = new CLCalc.Program.Variable(InitialState);
                k5 = new CLCalc.Program.Variable(InitialState);
                k6 = new CLCalc.Program.Variable(InitialState);
                absError = new CLCalc.Program.Variable(new double[InitialState.Length]);

                y = new CLCalc.Program.Variable(yy);

                //Kernels
                KernelFinalizeCalc = new CLCalc.Program.Kernel("doubleFinalizeCalc");
                KernelUpdateX = new CLCalc.Program.Kernel("doubleUpdateX");
                KernelRK46YStep2 = new CLCalc.Program.Kernel("doubleYStep2");
                KernelRK46XStep2 = new CLCalc.Program.Kernel("doubleXStep2");
                KernelRK46YStep3 = new CLCalc.Program.Kernel("doubleYStep3");
                KernelRK46XStep3 = new CLCalc.Program.Kernel("doubleXStep3");
                KernelRK46YStep4 = new CLCalc.Program.Kernel("doubleYStep4");
                KernelRK46XStep4 = new CLCalc.Program.Kernel("doubleXStep4");
                KernelRK46YStep5 = new CLCalc.Program.Kernel("doubleYStep5");
                KernelRK46XStep5 = new CLCalc.Program.Kernel("doubleXStep5");
                KernelRK46YStep6 = new CLCalc.Program.Kernel("doubleYStep6");
                KernelRK46XStep6 = new CLCalc.Program.Kernel("doubleXStep6");

                //Kernel arguments
                ArgsFinalize = new CLCalc.Program.Variable[] { x, hdid, y, ysav, absError, k1, k2, k3, k4, k5, k6 };
                ArgsRK46Y = new CLCalc.Program.Variable[] { x, hdid, y, ysav, k1, k2, k3, k4, k5, k6 };
                ArgsRK46X = new CLCalc.Program.Variable[] { x, hdid, xsav };
                NStates = new int[1] { InitialState.Length };
                NScalar = new int[1] { 1 };

                //Data retrieving
                yerr = new double[NStates[0]];
                xRet = new double[NScalar[0]];

            }
        }
Esempio n. 23
0
        /// <summary>Creates a new isosurface calculator. You may pass variables created from a OpenGL context to the CL variables if you are using interop or NULL
        /// if not using OpenCL/GL interop.</summary>
        /// <param name="FuncValues">Values of the evaluated 3D function f(x,y,z). FuncValues=float[maxX,maxY,maxZ]</param>
        /// <param name="CLEdgeCoords">OpenCL variable (float) to hold edge coordinates. Dimension has to be 9 * maxX * maxY * maxZ</param>
        /// <param name="CLEdgeNormals">OpenCL variable (float) to hold edge normals. Dimension has to be 9 * maxX * maxY * maxZ</param>
        /// <param name="CLElementArrayIndex">OpenCL variable (int) to hold element array index. Dimension has to be 5 * 3 * (maxX - 1) * (maxY - 1) * (maxZ - 1)</param>
        private void InitMarchingCubes(float[, ,] FuncValues, CLCalc.Program.Variable CLEdgeCoords, CLCalc.Program.Variable CLEdgeNormals, CLCalc.Program.Variable CLElementArrayIndex)
        {
            if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.Unknown)
            {
                CLCalc.InitCL();
            }

            if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.UsingCL)
            {
                //Reads maximum lengths
                int maxX = FuncValues.GetLength(0);
                int maxY = FuncValues.GetLength(1);
                int maxZ = FuncValues.GetLength(2);
                max = new int[] { maxX, maxY, maxZ };

                #region Creating variables

                //Isolevel
                isoLevel = new float[1] {
                    1.32746E-5f
                };
                varIsoLevel = new CLCalc.Program.Variable(isoLevel);

                //Step size and x0,y0,z0
                varStep     = new CLCalc.Program.Variable(step);
                varInitVals = new CLCalc.Program.Variable(initVals);

                //Create and copy function values
                funcVals   = new float[maxX * maxY * maxZ];
                CLFuncVals = new CLCalc.Program.Variable(funcVals);
                SetFuncVals(FuncValues);

                //Edge coordinates - 3 coords * 3 possible directions * number of points
                edgeCoords = new float[9 * maxX * maxY * maxZ];
                if (CLEdgeCoords != null)
                {
                    varEdgeCoords = CLEdgeCoords;
                    varEdgeCoords.WriteToDevice(edgeCoords);
                }
                else
                {
                    varEdgeCoords = new CLCalc.Program.Variable(edgeCoords);
                }

                //4 preliminary normals per edge - has to be averaged afterwards
                edgePrelimNormals    = new float[36 * maxX * maxY * maxZ];
                varEdgePrelimNormals = new CLCalc.Program.Variable(edgePrelimNormals);

                //Edge normals
                edgeNormals = new float[9 * maxX * maxY * maxZ];
                if (CLEdgeNormals != null)
                {
                    varEdgeNormals = CLEdgeNormals;
                    varEdgeNormals.WriteToDevice(edgeNormals);
                }
                else
                {
                    varEdgeNormals = new CLCalc.Program.Variable(edgeNormals);
                }

                //Number of cubes: (maxX-1)*(maxY-1)*(maxZ-1)
                //Marching cube algorithm: each cube can have 5 triangles drawn, 3 vertexes per triangle
                //q-th vertex of p-th triangle of the ijk-th cube: [(5*(i+(maxX-1)*j+k*(maxX-1)*(maxY-1))+p)*3+q]
                elementIndex = new int[5 * 3 * (maxX - 1) * (maxY - 1) * (maxZ - 1)];
                if (CLElementArrayIndex != null)
                {
                    varElemIndex = CLElementArrayIndex;
                    varElemIndex.WriteToDevice(elementIndex);
                }
                else
                {
                    varElemIndex = new CLCalc.Program.Variable(elementIndex);
                }

                //Edge remapping to build output
                edges = new int[edgeCoords.Length / 3];
                for (int i = 0; i < edges.Length; i++)
                {
                    edges[i] = -1;
                }

                #endregion

                #region Compile code and create kernels

                CLMarchingCubesSrc cmsrc = new CLMarchingCubesSrc();

                CLCalc.Program.Compile(new string[] { cmsrc.definitions, cmsrc.src });
                kernelInterpPts           = new CLCalc.Program.Kernel("interpPts");
                kernelPolygonize          = new CLCalc.Program.Kernel("Polygonize");
                kernelSmoothNormals       = new CLCalc.Program.Kernel("SmoothNormals");
                kernelPolygonizeNoNormals = new CLCalc.Program.Kernel("PolygonizeNoNormals");
                #endregion
            }
            else
            {
                throw new Exception("OpenCL not available");
            }
        }
        public void Initialize(BaseCameraApplication capture)
        {
            DepthCameraFrame frame = capture.GetDevices()[0].GetDepthImage();
            try
            {
                StreamReader reader = new StreamReader(new MemoryStream(Perceptual.Foundation.Properties.Resources.AdaptiveTemporalFilter));
                string text = reader.ReadToEnd();
                CLCalc.Program.Compile(capture.GetPrimaryDevice().GetPreprocessCode() + "\n#define HISTORY_SIZE " + historySize + "\n" + text);
                reader.Close();

            }
            catch (Exception ex)
            {
                System.Console.WriteLine(ex.Message);
                System.Console.WriteLine("Could not find AdaptiveTemporalFilter.cl");
                Environment.Exit(1);
            }
            historyIndex = new CLCalc.Program.Value<int>(historySize - 1);
            updateBuffer = new CLCalc.Program.Kernel("UpdateFilter");
            copyToTemporalBuffer = new CLCalc.Program.Kernel("CopyToTemporalBuffer");
            depthBuffer = CLCalc.Program.Variable.Create(new ComputeBuffer<float>(CLCalc.Program.Context, ComputeMemoryFlags.ReadWrite, 4 * frame.Width * frame.Height));
            depthCopyBuffer = new CLCalc.Program.Variable(new float[4 * frame.Width * frame.Height]);
            depthTemporalBuffer = CLCalc.Program.Variable.Create(new ComputeBuffer<float>(CLCalc.Program.Context, ComputeMemoryFlags.ReadWrite, historySize * 4 * frame.Width * frame.Height));

            depthImage = new CLCalc.Program.Image2D(new float[frame.Height * frame.Width * 4], frame.Width, frame.Height);
            uvImage = new CLCalc.Program.Image2D(new float[frame.Height * frame.Width * 4], frame.Width, frame.Height);

            kernelErodeFilter = new CLCalc.Program.Kernel("ErodeFilter");
            kernelDilateFilter = new CLCalc.Program.Kernel("DilateFilter");
            kernelCopyImage = new CLCalc.Program.Kernel("CopyImage");

            kernelCopyBuffer = new CLCalc.Program.Kernel("CopyDepth");
            kernelMedianFilter1 = new CLCalc.Program.Kernel("SmallFilter");
            kernelMedianFilter2 = new CLCalc.Program.Kernel("LargeFilter");
        }
Esempio n. 25
0
        /// <summary>Initializes CL kernels</summary>
        public static void Init()
        {
            if (kernelCholeskyDiagBlock == null)
            {
                if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.Unknown)
                {
                    CLCalc.InitCL();
                }

                if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.UsingCL)
                {
                    if (kernelCholeskyDiagBlock == null)
                    {
                        SUBMATRIXSIZE = (int)Math.Sqrt((double)CLCalc.Program.CommQueues[CLCalc.Program.DefaultCQ].Device.MaxWorkGroupSize);
                        SUBMATRIXSIZE = Math.Min(16, SUBMATRIXSIZE);

                        string strSubSize = SUBMATRIXSIZE.ToString();
                        string strTotSize = (SUBMATRIXSIZE * (SUBMATRIXSIZE + 1) / 2).ToString();

                        LinalgSrc src          = new LinalgSrc();
                        string    srcBlockChol = src.srcBlockCholesky.Replace("CONSTSUBMATRIXSIZE", strSubSize).Replace("CONSTGLOBALSIZE", strTotSize);
                        CLCalc.Program.Compile(new string[] { srcBlockChol, src.srcBkSubs, src.srcOperations, src.srcVecSum,
                                                              src.srcpNorm, src.strFeasibFunc, src.srcLogistReg });

                        kernelCholeskyDiagBlock    = new CLCalc.Program.Kernel("CholeskyDiagBlock");
                        kernelCholeskyComputePanel = new CLCalc.Program.Kernel("CholeskyComputePanel");
                        kernelCholeskyForwardProp  = new CLCalc.Program.Kernel("CholeskyForwardProp");

                        kernelFwdUpperBackSubs = new CLCalc.Program.Kernel("FwdUpperBackSubs");
                        kernelBkLowerBackSubs  = new CLCalc.Program.Kernel("BkLowerBackSubs");
                        kernelFwdPropag        = new CLCalc.Program.Kernel("FwdPropag");
                        kernelFwdPropag2       = new CLCalc.Program.Kernel("FwdPropag2");
                        kernelBackPropag       = new CLCalc.Program.Kernel("BackPropag");
                        kernelBackPropag2      = new CLCalc.Program.Kernel("BackPropag2");

                        kernelInPlaceSubtract = new CLCalc.Program.Kernel("InPlaceSubtract");
                        kernelElemWiseAbs     = new CLCalc.Program.Kernel("ElemWiseAbs");

                        kernelInnerProd = new CLCalc.Program.Kernel("InnerProd");

                        //Linear algebra
                        kernelSymMatrVecMultiply        = new CLCalc.Program.Kernel("SymMatrVecMultiply");
                        kernelSymMatrMatrMultiply       = new CLCalc.Program.Kernel("SymMatrMatrMultiply");
                        kernelComputeAtWA               = new CLCalc.Program.Kernel("ComputeAtWA");
                        kernelComputeAinvHAt            = new CLCalc.Program.Kernel("ComputeAinvHAt");
                        kernelRegularMatrTranspMatrProd = new CLCalc.Program.Kernel("RegularMatrTranspMatrProd");
                        kernelRegularMatrMatrProd       = new CLCalc.Program.Kernel("RegularMatrMatrProd");

                        kernelCopyBuffer         = new CLCalc.Program.Kernel("CopyBuffer");
                        kernelLinearComb         = new CLCalc.Program.Kernel("LinearComb");
                        kernelMatrVecProd        = new CLCalc.Program.Kernel("MatrVecProd");
                        kernelTranspMatrVecProdW = new CLCalc.Program.Kernel("TranspMatrVecProdW");
                        kernelMatrVecProdSumVec  = new CLCalc.Program.Kernel("MatrVecProdSumVec");
                        kernelDiagVecProd        = new CLCalc.Program.Kernel("DiagVecProd");
                        kernelDiagTranspMatProd  = new CLCalc.Program.Kernel("DiagTranspMatProd");
                        kernelElemWiseProd       = new CLCalc.Program.Kernel("ElemWiseProd");
                        kernelElemWiseInv        = new CLCalc.Program.Kernel("ElemWiseInv");
                        kernelElemWiseInv2       = new CLCalc.Program.Kernel("ElemWiseInv2");

                        kernelClear        = new CLCalc.Program.Kernel("ClearResps");
                        kernelPreSum       = new CLCalc.Program.Kernel("PreSum");
                        kernelCoalLocalSum = new CLCalc.Program.Kernel("CoalLocalSum");

                        kernelHasPositiveEntry = new CLCalc.Program.Kernel("HasPositiveEntry");


                        //pNorm minimization
                        floatOptimization.CurveFitting.kernelpNorm  = new CLCalc.Program.Kernel("pNorm");
                        floatOptimization.CurveFitting.kerneldpNorm = new CLCalc.Program.Kernel("dpNorm");

                        //Logistic regression
                        floatOptimization.LogisticRegression.kernelComputeLogistRegParams = new CLCalc.Program.Kernel("ComputeLogistRegParams");
                        floatOptimization.LogisticRegression.kernelpNorm  = floatOptimization.CurveFitting.kernelpNorm;
                        floatOptimization.LogisticRegression.kerneldpNorm = floatOptimization.CurveFitting.kerneldpNorm;


                        //Feasibility
                        floatOptimization.QuadraticProgramming.kernelgetLast = new CLCalc.Program.Kernel("getLast");
                    }
                }
            }
        }
Esempio n. 26
0
        /// <summary>Constructor.</summary>
        /// <param name="InitialState">Initial state of system</param>
        /// <param name="StepSize">Desired step per integration pass</param>
        /// <param name="InitialIndepVarValue">Initial independent variable value</param>
        /// <param name="DerivativeCalculator">Function to calculate derivatives vector</param>
        public floatODE46(float InitialIndepVarValue, float StepSize, float[] InitialState, DerivCalcDeleg DerivativeCalculator)
        {
            if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.Unknown)
            {
                CLCalc.InitCL();
            }

            if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.NotUsingCL)
            {
                throw new Exception("OpenCL not available");
            }

            if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.UsingCL)
            {
                ODE46Source Source = new ODE46Source();
                string[]    s      = new string[] { Source.floatStep2, Source.floatStep3, Source.floatStep4, Source.floatStep5, Source.floatStep6, Source.floatFinalizeCalc };
                CLCalc.Program.Compile(s);

                //Calculador de derivada
                Derivs = DerivativeCalculator;

                //Scalars
                float[] xx = new float[1] {
                    InitialIndepVarValue
                };
                x    = new CLCalc.Program.Variable(xx);
                xsav = new CLCalc.Program.Variable(xx);

                //Sets initial values to Device and local variables
                hdid     = new CLCalc.Program.Variable(xx);
                currentX = InitialIndepVarValue;
                SetStep(StepSize);

                //Vectors
                yy = new float[InitialState.Length];
                for (int i = 0; i < InitialState.Length; i++)
                {
                    yy[i] = InitialState[i];
                }


                ysav     = new CLCalc.Program.Variable(yy);
                k1       = new CLCalc.Program.Variable(InitialState);
                k2       = new CLCalc.Program.Variable(InitialState);
                k3       = new CLCalc.Program.Variable(InitialState);
                k4       = new CLCalc.Program.Variable(InitialState);
                k5       = new CLCalc.Program.Variable(InitialState);
                k6       = new CLCalc.Program.Variable(InitialState);
                absError = new CLCalc.Program.Variable(new float[InitialState.Length]);

                y = new CLCalc.Program.Variable(yy);

                //Kernels
                KernelFinalizeCalc = new CLCalc.Program.Kernel("floatFinalizeCalc");
                KernelUpdateX      = new CLCalc.Program.Kernel("floatUpdateX");
                KernelRK46YStep2   = new CLCalc.Program.Kernel("floatYStep2");
                KernelRK46XStep2   = new CLCalc.Program.Kernel("floatXStep2");
                KernelRK46YStep3   = new CLCalc.Program.Kernel("floatYStep3");
                KernelRK46XStep3   = new CLCalc.Program.Kernel("floatXStep3");
                KernelRK46YStep4   = new CLCalc.Program.Kernel("floatYStep4");
                KernelRK46XStep4   = new CLCalc.Program.Kernel("floatXStep4");
                KernelRK46YStep5   = new CLCalc.Program.Kernel("floatYStep5");
                KernelRK46XStep5   = new CLCalc.Program.Kernel("floatXStep5");
                KernelRK46YStep6   = new CLCalc.Program.Kernel("floatYStep6");
                KernelRK46XStep6   = new CLCalc.Program.Kernel("floatXStep6");


                //Kernel arguments
                ArgsFinalize = new CLCalc.Program.Variable[] { x, hdid, y, ysav, absError, k1, k2, k3, k4, k5, k6 };
                ArgsRK46Y    = new CLCalc.Program.Variable[] { x, hdid, y, ysav, k1, k2, k3, k4, k5, k6 };
                ArgsRK46X    = new CLCalc.Program.Variable[] { x, hdid, xsav };
                NStates      = new int[1] {
                    InitialState.Length
                };
                NScalar = new int[1] {
                    1
                };

                //Data retrieving
                yerr = new float[NStates[0]];
                xRet = new float[NScalar[0]];
            }
        }
Esempio n. 27
0
        /// <summary>Creates a new isosurface calculator. You may pass variables created from a OpenGL context to the CL variables if you are using interop or NULL
        /// if not using OpenCL/GL interop.</summary>
        /// <param name="FuncValues">Values of the evaluated 3D function f(x,y,z). FuncValues=float[maxX,maxY,maxZ]</param>
        /// <param name="CLEdgeCoords">OpenCL variable (float) to hold edge coordinates. Dimension has to be 9 * maxX * maxY * maxZ</param>
        /// <param name="CLEdgeNormals">OpenCL variable (float) to hold edge normals. Dimension has to be 9 * maxX * maxY * maxZ</param>
        /// <param name="CLElementArrayIndex">OpenCL variable (int) to hold element array index. Dimension has to be 5 * 3 * (maxX - 1) * (maxY - 1) * (maxZ - 1)</param>
        private void InitMarchingCubes(float[, ,] FuncValues, CLCalc.Program.Variable CLEdgeCoords, CLCalc.Program.Variable CLEdgeNormals, CLCalc.Program.Variable CLElementArrayIndex)
        {
            if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.Unknown) CLCalc.InitCL();

            if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.UsingCL)
            {
                //Reads maximum lengths
                int maxX = FuncValues.GetLength(0);
                int maxY = FuncValues.GetLength(1);
                int maxZ = FuncValues.GetLength(2);
                max = new int[] { maxX, maxY, maxZ };

                #region Creating variables

                //Isolevel
                isoLevel = new float[1] { 1.32746E-5f };
                varIsoLevel = new CLCalc.Program.Variable(isoLevel);

                //Step size and x0,y0,z0
                varStep = new CLCalc.Program.Variable(step);
                varInitVals = new CLCalc.Program.Variable(initVals);

                //Create and copy function values
                funcVals = new float[maxX * maxY * maxZ];
                CLFuncVals = new CLCalc.Program.Variable(funcVals);
                SetFuncVals(FuncValues);

                //Edge coordinates - 3 coords * 3 possible directions * number of points
                edgeCoords = new float[9 * maxX * maxY * maxZ];
                if (CLEdgeCoords != null)
                {
                    varEdgeCoords = CLEdgeCoords;
                    varEdgeCoords.WriteToDevice(edgeCoords);
                }
                else varEdgeCoords = new CLCalc.Program.Variable(edgeCoords);

                //4 preliminary normals per edge - has to be averaged afterwards
                edgePrelimNormals = new float[36 * maxX * maxY * maxZ];
                varEdgePrelimNormals = new CLCalc.Program.Variable(edgePrelimNormals);

                //Edge normals
                edgeNormals = new float[9 * maxX * maxY * maxZ];
                if (CLEdgeNormals != null)
                {
                    varEdgeNormals = CLEdgeNormals;
                    varEdgeNormals.WriteToDevice(edgeNormals);
                }
                else varEdgeNormals = new CLCalc.Program.Variable(edgeNormals);

                //Number of cubes: (maxX-1)*(maxY-1)*(maxZ-1)
                //Marching cube algorithm: each cube can have 5 triangles drawn, 3 vertexes per triangle
                //q-th vertex of p-th triangle of the ijk-th cube: [(5*(i+(maxX-1)*j+k*(maxX-1)*(maxY-1))+p)*3+q]
                elementIndex = new int[5 * 3 * (maxX - 1) * (maxY - 1) * (maxZ - 1)];
                if (CLElementArrayIndex != null)
                {
                    varElemIndex = CLElementArrayIndex;
                    varElemIndex.WriteToDevice(elementIndex);
                }
                else varElemIndex = new CLCalc.Program.Variable(elementIndex);

                //Edge remapping to build output
                edges = new int[edgeCoords.Length / 3];
                for (int i = 0; i < edges.Length; i++) edges[i] = -1;

                #endregion

                #region Compile code and create kernels

                CLMarchingCubesSrc cmsrc = new CLMarchingCubesSrc();

                CLCalc.Program.Compile(new string[] { cmsrc.definitions, cmsrc.src });
                kernelInterpPts = new CLCalc.Program.Kernel("interpPts");
                kernelPolygonize = new CLCalc.Program.Kernel("Polygonize");
                kernelSmoothNormals = new CLCalc.Program.Kernel("SmoothNormals");
                kernelPolygonizeNoNormals = new CLCalc.Program.Kernel("PolygonizeNoNormals");
                #endregion
            }
            else throw new Exception("OpenCL not available");
        }
Esempio n. 28
0
        public void Initialize(BaseCameraApplication capture)
        {
            DepthCameraFrame depthImage = capture.GetPrimaryDevice().GetDepthImage();
            this.width = depthImage.Width;
            this.height = depthImage.Height;
            this.filter = ((AdaptiveTemporalFilter)capture.GetImageFilter());
            CvSize sz = new CvSize(depthImage.Width, depthImage.Height);
            gray = new IplImage(sz, BitDepth.U8, 1);
            erode = new IplImage(sz, BitDepth.U8, 1);
            dilate = new IplImage(sz, BitDepth.U8, 1);
            tmp = new IplImage(sz, BitDepth.U8, 1);
            mask = new IplImage(sz, BitDepth.U8, 1);
            imgLabel = new IplImage(sz, BitDepth.F32, 1);
            faceDetectionBuffer = CLCalc.Program.Variable.Create(new ComputeBuffer<FaceLandmarks>(CLCalc.Program.Context, ComputeMemoryFlags.ReadWrite, 1));
            try
            {
                CLCalc.Program.Compile(capture.GetPrimaryDevice().GetPreprocessCode() + src);

            }
            catch (BuildProgramFailureComputeException ex)
            {
                System.Console.WriteLine(ex.Message);
                Environment.Exit(1);
            }
            irImageBuffer = CLCalc.Program.Variable.Create(new ComputeBuffer<byte>(CLCalc.Program.Context, ComputeMemoryFlags.ReadWrite | ComputeMemoryFlags.CopyHostPointer, ir = new byte[width * height]));
            kernelCopyIRImage = new CLCalc.Program.Kernel("CopyIRImage");
            kernelFindFaceLandmarks = new CLCalc.Program.Kernel("FindFaceLandmarks");
        }
Esempio n. 29
0
        /// <summary>Compiles code and initializes kernel for this svm stance</summary>
        private void CLSVMInit()
        {
            if (CLResource == null) CLResource = new int[0];

            lock (CLResource)
            {
                if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.Unknown) CLCalc.InitCL();
                if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.UsingCL)
                {
                    if (kernelComputeKernelRBF == null)
                    {
                        CLSVMSrc s = new CLSVMSrc();
                        CLCalc.Program.Compile(new string[] { s.srcKernels, s.srcFindMaxMinErr, s.srcMultClass });

                        //Kernel computation
                        kernelComputeKernelRBF = new CLCalc.Program.Kernel("ComputeKernelRBF");

                        kernelMaxErr = new CLCalc.Program.Kernel("maxErr");
                        kernelComputeMax = new CLCalc.Program.Kernel("computeMax");
                        kernelMinErr = new CLCalc.Program.Kernel("minErr");
                        kernelComputeMin = new CLCalc.Program.Kernel("computeMin");
                        kernelGetResp = new CLCalc.Program.Kernel("getResp");

                        //Update error
                        kernelUpdateErr = new CLCalc.Program.Kernel("UpdateErr");

                        //Multiple classification
                        kernelComputeMultiKernelRBF = new CLCalc.Program.Kernel("ComputeMultiKernelRBF");
                        kernelSumKernels=new CLCalc.Program.Kernel("SumKernels");
                    }

                    //Memory obbjects

                    //Find max/min
                    CLErrLen = new CLCalc.Program.Variable(new int[1]);
                    HostResp = new int[1];
                    CLResp = new CLCalc.Program.Variable(HostResp);
                    CLMaxMinErrs = new CLCalc.Program.Variable(new float[MAXMINWORKSIZE]);
                    CLMaxMinInds = new CLCalc.Program.Variable(new int[MAXMINWORKSIZE]);
                    //Update error
                    CLUpdtErrParams = new CLCalc.Program.Variable(new float[3]);
                }
            }
        }
Esempio n. 30
0
 private static void InitKernels()
 {
     string s = new CLFFTSrc().s;
     CLCalc.InitCL();
     try
     {
         CLCalc.Program.Compile(s);
     }
     catch
     {
     }
     kernelfft_radix16 = new CLCalc.Program.Kernel("fft_radix16");
     kernelfft_radix4 = new CLCalc.Program.Kernel("fft_radix4");
     kernelConjugate = new CLCalc.Program.Kernel("Conjugate");
     CLp = new CLCalc.Program.Variable(new int[1]);
 }
Esempio n. 31
0
        private void InitKernel()
        {
            if (kernelExtractFeatures == null)
            {
                CLExtractFeatSrc src = new CLExtractFeatSrc();
                CLBracketRegionsSrc src2 = new CLBracketRegionsSrc();

                CLCalc.Program.Compile(new string[] { src2.src, src.src });

                kernelExtractFeatures = new CLCalc.Program.Kernel("ExtractFeatures");
                kernelComputeFrameDiff = new CLCalc.Program.Kernel("ComputeFrameDiff");
                kernelSegregateSkin = new CLCalc.Program.Kernel("SegregateSkin");
            }
        }
        public void Initialize(BaseCameraApplication capture, GLAdvancedRender glw)
        {
            try
            {
                CLCalc.Program.Compile(capture.GetPrimaryDevice().GetPreprocessCode() + src);

            }
            catch (BuildProgramFailureComputeException ex)
            {
                System.Console.WriteLine(ex.Message);
                Environment.Exit(1);
            }
            DepthCameraFrame frame = capture.GetDevices()[0].GetDepthImage();
            kernelCopyBmp = new CLCalc.Program.Kernel("CopyImageToPointCloud");
            int size = frame.Width * frame.Height;
            bufs = new int[4];

            ColorData = new float[4 * size];
            PositionData = new float[4 * size];

            GL.GenBuffers(2, bufs);

            GL.BindBuffer(BufferTarget.ArrayBuffer, bufs[0]);
            GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(ColorData.Length * sizeof(float)), ColorData, BufferUsageHint.StreamDraw);

            GL.BindBuffer(BufferTarget.ArrayBuffer, bufs[1]);
            GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(PositionData.Length * sizeof(float)), PositionData, BufferUsageHint.StreamDraw);//Notice STREAM DRAW
            GL.Enable(EnableCap.PointSmooth);
            GL.PointSize(4.0f);
            positions = new CLCalc.Program.Variable(bufs[1], typeof(float));
            colors = new CLCalc.Program.Variable(bufs[0], typeof(float));
        }
Esempio n. 33
0
        /// <summary>Initializes CL kernels</summary>
        public static void Init()
        {
            if (kernelCholeskyDiagBlock == null)
            {
                if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.Unknown) CLCalc.InitCL();

                if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.UsingCL)
                {
                    if (kernelCholeskyDiagBlock == null)
                    {
                        SUBMATRIXSIZE = (int)Math.Sqrt((double)CLCalc.Program.CommQueues[CLCalc.Program.DefaultCQ].Device.MaxWorkGroupSize);
                        SUBMATRIXSIZE = Math.Min(16, SUBMATRIXSIZE);

                        string strSubSize = SUBMATRIXSIZE.ToString();
                        string strTotSize = (SUBMATRIXSIZE * (SUBMATRIXSIZE + 1) / 2).ToString();

                        LinalgSrc src = new LinalgSrc();
                        string srcBlockChol = src.srcBlockCholesky.Replace("CONSTSUBMATRIXSIZE", strSubSize).Replace("CONSTGLOBALSIZE", strTotSize);
                        CLCalc.Program.Compile(new string[] { srcBlockChol, src.srcBkSubs, src.srcOperations, src.srcVecSum,
                            src.srcpNorm, src.strFeasibFunc, src.srcLogistReg });

                        kernelCholeskyDiagBlock = new CLCalc.Program.Kernel("CholeskyDiagBlock");
                        kernelCholeskyComputePanel = new CLCalc.Program.Kernel("CholeskyComputePanel");
                        kernelCholeskyForwardProp = new CLCalc.Program.Kernel("CholeskyForwardProp");

                        kernelFwdUpperBackSubs = new CLCalc.Program.Kernel("FwdUpperBackSubs");
                        kernelBkLowerBackSubs = new CLCalc.Program.Kernel("BkLowerBackSubs");
                        kernelFwdPropag = new CLCalc.Program.Kernel("FwdPropag");
                        kernelFwdPropag2 = new CLCalc.Program.Kernel("FwdPropag2");
                        kernelBackPropag = new CLCalc.Program.Kernel("BackPropag");
                        kernelBackPropag2 = new CLCalc.Program.Kernel("BackPropag2");

                        kernelInPlaceSubtract = new CLCalc.Program.Kernel("InPlaceSubtract");
                        kernelElemWiseAbs = new CLCalc.Program.Kernel("ElemWiseAbs");

                        kernelInnerProd = new CLCalc.Program.Kernel("InnerProd");

                        //Linear algebra
                        kernelSymMatrVecMultiply = new CLCalc.Program.Kernel("SymMatrVecMultiply");
                        kernelSymMatrMatrMultiply = new CLCalc.Program.Kernel("SymMatrMatrMultiply");
                        kernelComputeAtWA = new CLCalc.Program.Kernel("ComputeAtWA");
                        kernelComputeAinvHAt = new CLCalc.Program.Kernel("ComputeAinvHAt");
                        kernelRegularMatrTranspMatrProd = new CLCalc.Program.Kernel("RegularMatrTranspMatrProd");

                        kernelCopyBuffer = new CLCalc.Program.Kernel("CopyBuffer");
                        kernelLinearComb = new CLCalc.Program.Kernel("LinearComb");
                        kernelMatrVecProd = new CLCalc.Program.Kernel("MatrVecProd");
                        kernelTranspMatrVecProdW = new CLCalc.Program.Kernel("TranspMatrVecProdW");
                        kernelMatrVecProdSumVec = new CLCalc.Program.Kernel("MatrVecProdSumVec");
                        kernelDiagVecProd = new CLCalc.Program.Kernel("DiagVecProd");
                        kernelDiagTranspMatProd = new CLCalc.Program.Kernel("DiagTranspMatProd");
                        kernelElemWiseProd = new CLCalc.Program.Kernel("ElemWiseProd");
                        kernelElemWiseInv = new CLCalc.Program.Kernel("ElemWiseInv");
                        kernelElemWiseInv2 = new CLCalc.Program.Kernel("ElemWiseInv2");

                        kernelClear = new CLCalc.Program.Kernel("ClearResps");
                        kernelPreSum = new CLCalc.Program.Kernel("PreSum");
                        kernelCoalLocalSum = new CLCalc.Program.Kernel("CoalLocalSum");

                        kernelHasPositiveEntry = new CLCalc.Program.Kernel("HasPositiveEntry");

                        //pNorm minimization
                        floatOptimization.CurveFitting.kernelpNorm = new CLCalc.Program.Kernel("pNorm");
                        floatOptimization.CurveFitting.kerneldpNorm = new CLCalc.Program.Kernel("dpNorm");

                        //Logistic regression
                        floatOptimization.LogisticRegression.kernelComputeLogistRegParams = new CLCalc.Program.Kernel("ComputeLogistRegParams");
                        floatOptimization.LogisticRegression.kernelpNorm = floatOptimization.CurveFitting.kernelpNorm;
                        floatOptimization.LogisticRegression.kerneldpNorm = floatOptimization.CurveFitting.kerneldpNorm;

                        //Feasibility
                        floatOptimization.QuadraticProgramming.kernelgetLast = new CLCalc.Program.Kernel("getLast");
                    }
                }
            }
        }
Esempio n. 34
0
        private void frmCLInfo_Load(object sender, EventArgs e)
        {
            CLCalc.InitCL(ComputeDeviceTypes.All);

            if (CLCalc.CLAcceleration != CLCalc.CLAccelerationType.UsingCL)
            {
                cmbPlat.Items.Add("OpenCL ERROR");
                if (cmbPlat.Items.Count > 0) cmbPlat.SelectedIndex = 0;
            }
            else
            {
                foreach(ComputePlatform p in CLCalc.CLPlatforms)
                {
                    cmbPlat.Items.Add(p.Name + " " + p.Profile + " " + p.Vendor + " " + p.Version);
                }
                if (cmbPlat.Items.Count > 0) cmbPlat.SelectedIndex = 0;

                int i=0;
                foreach (ComputeDevice d in CLCalc.CLDevices)
                {
                    //if (d.CLDeviceAvailable)
                    //{
                        cmbDevices.Items.Add(d.Name + " " + d.Type + " " + d.Vendor + " " + d.Version);
                        cmbCurDevice.Items.Add(d.Name + " " + d.Type + " " + d.Vendor + " " + d.Version);
                    //}
                    //else
                    //{
                    //    cmbDevices.Items.Add("NOT AVAILABLE: " + d.CLDeviceName + " " + d.CLDeviceType + " " + d.CLDeviceVendor + " " + d.CLDeviceVersion);
                    //    cmbCurDevice.Items.Add("NOT AVAILABLE: " + d.CLDeviceName + " " + d.CLDeviceType + " " + d.CLDeviceVendor + " " + d.CLDeviceVersion);
                    //}

                    i++;
                }

                if (cmbDevices.Items.Count > 0)
                {
                    cmbDevices.SelectedIndex = 0;
                    cmbCurDevice.SelectedIndex = CLCalc.Program.DefaultCQ;
                }
            }

            ReadImportantRegistryEntries();

            //int[] n = new int[3] {1,1,1};
            //int[] nn = new int[3];
            //CLCalc.Program.Variable v = new CLCalc.Program.Variable(n);

            //v.WriteToDevice(n);

            //v.ReadFromDeviceTo(nn);

            string s = @" kernel void teste() {}";

            CLCalc.Program.Compile(s);
            try
            {
                CLCalc.Program.Kernel k = new CLCalc.Program.Kernel("teste");
            }
            catch
            {
                MessageBox.Show("");
            }
        }
Esempio n. 35
0
        public void Initialize()
        {
            try
            {
                CLCalc.Program.Compile(src);

            }
            catch (Exception ex)
            {
                System.Console.WriteLine(ex.Message);
                Environment.Exit(1);
            }
            kernelUpdateImageGradients = new CLCalc.Program.Kernel("UpdateGradients");
        }
Esempio n. 36
0
        private void frmCLInfo_Load(object sender, EventArgs e)
        {
            CLCalc.InitCL(ComputeDeviceTypes.All);

            if (CLCalc.CLAcceleration != CLCalc.CLAccelerationType.UsingCL)
            {
                cmbPlat.Items.Add("OpenCL ERROR");
                if (cmbPlat.Items.Count > 0)
                {
                    cmbPlat.SelectedIndex = 0;
                }
            }
            else
            {
                foreach (ComputePlatform p in CLCalc.CLPlatforms)
                {
                    cmbPlat.Items.Add(p.Name + " " + p.Profile + " " + p.Vendor + " " + p.Version);
                }
                if (cmbPlat.Items.Count > 0)
                {
                    cmbPlat.SelectedIndex = 0;
                }

                int i = 0;
                foreach (ComputeDevice d in CLCalc.CLDevices)
                {
                    //if (d.CLDeviceAvailable)
                    //{
                    cmbDevices.Items.Add(d.Name + " " + d.Type + " " + d.Vendor + " " + d.Version);
                    cmbCurDevice.Items.Add(d.Name + " " + d.Type + " " + d.Vendor + " " + d.Version);
                    //}
                    //else
                    //{
                    //    cmbDevices.Items.Add("NOT AVAILABLE: " + d.CLDeviceName + " " + d.CLDeviceType + " " + d.CLDeviceVendor + " " + d.CLDeviceVersion);
                    //    cmbCurDevice.Items.Add("NOT AVAILABLE: " + d.CLDeviceName + " " + d.CLDeviceType + " " + d.CLDeviceVendor + " " + d.CLDeviceVersion);
                    //}

                    i++;
                }

                if (cmbDevices.Items.Count > 0)
                {
                    cmbDevices.SelectedIndex   = 0;
                    cmbCurDevice.SelectedIndex = CLCalc.Program.DefaultCQ;
                }
            }

            ReadImportantRegistryEntries();



            //int[] n = new int[3] {1,1,1};
            //int[] nn = new int[3];
            //CLCalc.Program.Variable v = new CLCalc.Program.Variable(n);

            //v.WriteToDevice(n);

            //v.ReadFromDeviceTo(nn);

            string s = @" kernel void teste() {}";

            CLCalc.Program.Compile(s);
            try
            {
                CLCalc.Program.Kernel k = new CLCalc.Program.Kernel("teste");
            }
            catch
            {
                MessageBox.Show("");
            }
        }
Esempio n. 37
0
        static LaserLineTrack()
        {
            if (CLCalc.CLAcceleration == CLCalc.CLAccelerationType.Unknown)
            {
                CLCalc.InitCL();
            }

            #region Source

            string src = @"

constant int PIXELSTOSEARCH = PXtoSearch;

const sampler_t smp = CLK_NORMALIZED_COORDS_FALSE | //Natural coordinates
                      CLK_ADDRESS_CLAMP | //Clamp to zeros
                      CLK_FILTER_NEAREST; //Don't interpolate

__kernel void initIntM(__read_only image2d_t img,
                       __global    float *   intM,
                       __constant  float *   threshold)
{
      int y = get_global_id(0);
      uint4 imgColor = read_imageui(img, smp, (int2)(0,y));
      
      float intens = ((float)imgColor.x + (float)imgColor.y + (float)imgColor.z) * 0.001307189542f; // *1.0f/(3*255)

      intM[y] = intens > threshold[0] ? intens : 0.0f;
}

//penalties[0] = distancePenalty, penalties[1] = changePenalty
__kernel void integrateM(__read_only image2d_t img,
                         __global    float *   intM,
                         __constant  float *   threshold,
                         __constant  int   *   x,
                         __constant  float *   penalties)
{
      int y = get_global_id(0);
      int H = get_global_size(0);

      uint4 imgColor = read_imageui(img, smp, (int2)(x[0],y));
      float intens = ((float)imgColor.x + (float)imgColor.y + (float)imgColor.z) * 0.001307189542f; // *1.0f/(3*255)

      float maxv = -1e-8f; //intM[H*(x[0] - 1) + y] - penalties[0];
      for (int k = -PIXELSTOSEARCH; k <= PIXELSTOSEARCH; k++)
      {
         if (y + k >= 0 && y + k < H)
            maxv = fmax(maxv, intM[H*(x[0] - 1) + y + k] - sqrt(1.0f + k * k) * penalties[0] - (k != 0 ? penalties[1] : 0.0f));
      }
      intM[y + H*x[0]] = maxv + (intens > threshold[0] ? intens : 0.0f);
}

__kernel void incCounter(__global int * x)
{
   x[0]++;
}

__kernel void backTrack( __global    float *   intM,
                         __global    int   *   path,
                         __constant  int   *   Dimensions)
{
      int W = Dimensions[0];
      int H = Dimensions[1];

      int idMax = 0;
      float valMax = intM[H*(W - 1)];

      //find most amplified path
      for (int y = 0; y < H; y++)
      {
         if (valMax < intM[H*(W - 1) + y])
         {
             valMax = intM[H*(W - 1) + y];
             idMax = y;
         }
     }

     path[W - 1] = idMax;

     for (int x = W - 2; x >= 0; x--)
     {
         int y = path[x + 1];

         float maxv = -1e8f;
         int idv = -1;

         for (int k = -PIXELSTOSEARCH; k <= PIXELSTOSEARCH; k++)
         {
             if (y + k >= 0 && y + k < H)
             {
                 if (intM[H*x + y + k] > maxv)
                 {
                     maxv = intM[H* x + y + k];
                     idv = y + k;
                 }
             }
         }

         path[x] = idv;
     }
}
";

            #endregion

            CLCalc.Program.Compile(src.Replace("PXtoSearch", PIXELSTOSEARCH.ToString()));
            CLthresh    = new CLCalc.Program.Variable(new float[1]);
            CLx         = new CLCalc.Program.Variable(new int[1]);
            CLDim       = new CLCalc.Program.Variable(new int[2]);
            CLpenalties = new CLCalc.Program.Variable(new float[2]);

            kernelinitIntM   = new CLCalc.Program.Kernel("initIntM");
            kernelintM       = new CLCalc.Program.Kernel("integrateM");
            kernelBackTrack  = new CLCalc.Program.Kernel("backTrack");
            kernelincCounter = new CLCalc.Program.Kernel("incCounter");
        }