Пример #1
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");
                    }
                }
            }
        }
Пример #2
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");
                    }
                }
            }
        }