summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWei Wei <weiwei@multicorewareinc.com>2013-12-17 15:42:24 -0600
committerI-Jui (Ray) Sung <ray@multicorewareinc.com>2013-12-18 20:34:50 -0600
commit79a3ec433e03e5e13f0c1adfb72ed2aa4ddd53dc (patch)
tree08e7a142cde50a62441c33453950244be5bf0565
parentfe5218aabe3acee09189b7a2208e653ababc8fd2 (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.cxx92
-rw-r--r--sc/source/core/opencl/opinlinefun_statistical.cxx4
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"