diff options
author | Wei Wei <weiwei@multicorewareinc.com> | 2013-12-17 15:42:24 -0600 |
---|---|---|
committer | I-Jui (Ray) Sung <ray@multicorewareinc.com> | 2013-12-18 20:34:50 -0600 |
commit | 79a3ec433e03e5e13f0c1adfb72ed2aa4ddd53dc (patch) | |
tree | 08e7a142cde50a62441c33453950244be5bf0565 | |
parent | fe5218aabe3acee09189b7a2208e653ababc8fd2 (diff) |
GPU Calc: optimize POISSON
Change-Id: I39d7801da3cce2aaaeafa48fbec615e254691661
Signed-off-by: I-Jui (Ray) Sung <ray@multicorewareinc.com>
-rw-r--r-- | sc/source/core/opencl/op_statistical.cxx | 92 | ||||
-rw-r--r-- | sc/source/core/opencl/opinlinefun_statistical.cxx | 4 |
2 files changed, 48 insertions, 48 deletions
diff --git a/sc/source/core/opencl/op_statistical.cxx b/sc/source/core/opencl/op_statistical.cxx index dddbeb50fadc..a35071c041b0 100644 --- a/sc/source/core/opencl/op_statistical.cxx +++ b/sc/source/core/opencl/op_statistical.cxx @@ -6903,56 +6903,56 @@ void OpPoisson::GenSlidingWindowFunction( } ss << ")\n"; ss << "{\n"; - ss << " double x,lambda,tmp;\n"; + ss << " double x,lambda,tmp,tmp0,tmp1,tmp2;\n"; ss << " int bCumulative;\n"; ss << " int gid0=get_global_id(0);\n"; -#ifdef ISNAN - FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); - const formula::SingleVectorRefToken*tmpCurDVR0= dynamic_cast<const - formula::SingleVectorRefToken *>(tmpCur0); - FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken(); - const formula::SingleVectorRefToken*tmpCurDVR1= dynamic_cast<const - formula::SingleVectorRefToken *>(tmpCur1); - FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken(); - const formula::SingleVectorRefToken*tmpCurDVR2= dynamic_cast<const - formula::SingleVectorRefToken *>(tmpCur2); - ss << " int buffer_x_len = "; - ss << tmpCurDVR0->GetArrayLength(); - ss << ";\n"; - ss << " int buffer_lambda_len = "; - ss << tmpCurDVR1->GetArrayLength(); - ss << ";\n"; - ss << " int buffer_bCumulative_len = "; - ss << tmpCurDVR2->GetArrayLength(); - ss << ";\n"; + size_t i = vSubArguments.size(); + ss <<"\n "; + for (i = 0; i < vSubArguments.size(); i++) + { + FormulaToken *pCur = vSubArguments[i]->GetFormulaToken(); + assert(pCur); + if (pCur->GetType() == formula::svSingleVectorRef) + { +#ifdef ISNAN + const formula::SingleVectorRefToken* pSVR = + dynamic_cast< const formula::SingleVectorRefToken* >(pCur); + ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n"; #endif -#ifdef ISNAN - ss <<" if((gid0)>=buffer_x_len || isNan("; - ss << vSubArguments[0]->GenSlidingWindowDeclRef(); - ss <<"))\n"; - ss <<" x = 0;\n"; - ss <<" else \n"; + } + else if (pCur->GetType() == formula::svDouble) + { +#ifdef ISNAN + ss << "{\n"; #endif - ss <<" x ="<<vSubArguments[0]->GenSlidingWindowDeclRef(); - ss << ";\n"; -#ifdef ISNAN - ss <<" if((gid0)>=buffer_lambda_len || isNan("; - ss << vSubArguments[1]->GenSlidingWindowDeclRef(); - ss <<"))\n"; - ss <<" lambda = 0;\n"; - ss <<" else \n"; + } + else + { +#ifdef ISNAN #endif - ss <<" lambda ="<<vSubArguments[1]->GenSlidingWindowDeclRef(); - ss << ";\n"; -#ifdef ISNAN - ss <<" if((gid0)>=buffer_bCumulative_len || isNan("; - ss << vSubArguments[2]->GenSlidingWindowDeclRef(); - ss <<"))\n"; - ss <<" bCumulative = 0;\n"; - ss <<"else \n"; + } +#ifdef ISNAN + if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) + { + ss << " if (isNan("; + ss << vSubArguments[i]->GenSlidingWindowDeclRef(); + ss << "))\n"; + ss << " tmp"<<i<<"= 0;\n"; + ss << " else\n"; + ss << " tmp"<<i<<"=\n"; + ss << vSubArguments[i]->GenSlidingWindowDeclRef(); + ss << ";\n}\n"; + } + else + { + ss << "tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef(); + ss <<";\n"; + } #endif - ss <<" bCumulative ="<<vSubArguments[2]->GenSlidingWindowDeclRef(); - ss << ";\n"; + } + ss << " x = floor(tmp0);\n"; + ss << " lambda = tmp1;\n"; + ss << " bCumulative = tmp2;\n "; ss << " if (!bCumulative)\n"; ss << " {\n"; ss << " if(lambda == 0.0)\n"; @@ -6970,7 +6970,7 @@ void OpPoisson::GenSlidingWindowFunction( ss << " {\n"; ss << " double fPoissonVar = 1.0;\n"; ss << " for ( int f = 0; f < x; ++f )\n"; - ss << " fPoissonVar *= lambda / ( (double)f + 1.0 );\n"; + ss << " fPoissonVar *= lambda * pow(( (double)f + 1.0 ),-1);\n"; ss << " tmp = ( fPoissonVar * exp( -lambda ) );\n"; ss << " return tmp;\n"; ss << " }\n"; @@ -7002,7 +7002,7 @@ void OpPoisson::GenSlidingWindowFunction( ss << " int nEnd = (int) (x + 0.5);\n"; ss << " for (int i = 1; i <= nEnd; i++)\n"; ss << " {\n"; - ss << " fSummand = (fSummand*lambda)/(double)i;\n"; + ss << " fSummand = (fSummand*lambda)*pow((double)i,-1);\n"; ss << " fSum += fSummand;\n"; ss << " }\n"; ss << " tmp = fSum;\n"; diff --git a/sc/source/core/opencl/opinlinefun_statistical.cxx b/sc/source/core/opencl/opinlinefun_statistical.cxx index 12e71b1b4e07..81e8150b06bf 100644 --- a/sc/source/core/opencl/opinlinefun_statistical.cxx +++ b/sc/source/core/opencl/opinlinefun_statistical.cxx @@ -900,9 +900,9 @@ std::string lcl_GetGammaHelper = " double fGamma = lcl_getLanczosSum(fZ);\n" " double fg = 6.024680040776729583740234375;\n" " double fZgHelp = fZ + fg - 0.5;\n" -" double fHalfpower = pow( fZgHelp, fZ / 2 - 0.25);\n" +" double fHalfpower = pow( fZgHelp, fZ*pow(2,-1.0) - 0.25);\n" " fGamma *= fHalfpower;\n" -" fGamma /= exp(fZgHelp);\n" +" fGamma = fGamma*pow(exp(fZgHelp),-1.0);\n" " fGamma *= fHalfpower;\n" " fGamma = 120.4;\n" " if (fZ <= 20.0 && fZ == (int)fZ)\n" |