diff options
author | hongyu zhong <hongyu@multicorewareinc.com> | 2013-11-11 16:36:43 +0800 |
---|---|---|
committer | I-Jui (Ray) Sung <ray@multicorewareinc.com> | 2013-11-15 11:54:24 -0600 |
commit | 9d45000281e10b724f3a88ca95ee2c68c09bd736 (patch) | |
tree | 7d7eb0faa3b6354224a73c0d1586782e24d61789 | |
parent | 758dc9e3051514ff5d5441ac2ebe782a57533a7c (diff) |
GPU Calc: implemented BINOMDIST
AMLOEXT-192 FIX
Change-Id: I36d95c4b68aa8b7bba12a9db0a363a68c56ddb19
Signed-off-by: haochen <haochen@multicorewareinc.com>
Signed-off-by: I-Jui (Ray) Sung <ray@multicorewareinc.com>
-rw-r--r-- | sc/source/core/opencl/formulagroupcl.cxx | 4 | ||||
-rw-r--r-- | sc/source/core/opencl/op_statistical.cxx | 187 | ||||
-rw-r--r-- | sc/source/core/opencl/op_statistical.hxx | 7 |
3 files changed, 198 insertions, 0 deletions
diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx index eb74294031d0..b6a4bcdad10a 100644 --- a/sc/source/core/opencl/formulagroupcl.cxx +++ b/sc/source/core/opencl/formulagroupcl.cxx @@ -1341,6 +1341,10 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments( mvSubArguments.push_back(SoPHelper(ts, ft->Children[i], new OpSkewp)); break; + case ocBinomDist: + mvSubArguments.push_back(SoPHelper(ts, + ft->Children[i],new OpBinomdist)); + break; case ocExternal: if ( !(pChild->GetExternal().compareTo(OUString( "com.sun.star.sheet.addin.Analysis.getEffect")))) diff --git a/sc/source/core/opencl/op_statistical.cxx b/sc/source/core/opencl/op_statistical.cxx index d02313a8c0e4..b88bb4064361 100644 --- a/sc/source/core/opencl/op_statistical.cxx +++ b/sc/source/core/opencl/op_statistical.cxx @@ -3845,6 +3845,193 @@ void OpChiDist::GenSlidingWindowFunction( ss << " return tmp;\n"; ss << "}\n"; } +void OpBinomdist::BinInlineFun(std::set<std::string>& decls, + std::set<std::string>& funs) +{ + decls.insert(fMachEpsDecl); + funs.insert(""); + decls.insert(MinDecl); + funs.insert(""); + decls.insert(fMaxGammaArgumentDecl); + funs.insert(""); + decls.insert(GetBinomDistPMFDecl); + funs.insert(GetBinomDistPMF); + decls.insert(GetBetaDistDecl); + funs.insert(GetBetaDist); + decls.insert(lcl_GetBinomDistRangeDecl); + funs.insert(lcl_GetBinomDistRange); + decls.insert(lcl_GetBetaHelperContFracDecl); + funs.insert(lcl_GetBetaHelperContFrac); + decls.insert(GetBetaDistPDFDecl); + funs.insert(GetBetaDistPDF); + decls.insert(GetLogBetaDecl); + funs.insert(GetLogBeta); + decls.insert(GetBetaDecl); + funs.insert(GetBeta); + decls.insert(lcl_getLanczosSumDecl); + funs.insert(lcl_getLanczosSum); +} +void OpBinomdist::GenSlidingWindowFunction( + std::stringstream &ss,const std::string sSymName, + SubArguments &vSubArguments) +{ + ss << "\ndouble " << sSymName; + ss << "_"<< BinFuncName() <<"("; + for (unsigned i = 0; i < vSubArguments.size(); i++) + { + if (i) + ss << ","; + vSubArguments[i]->GenSlidingWindowDecl(ss); + } + ss << ")\n"; + ss << "{\n"; + ss << " double tmp0,tmp1,tmp2,tmp3;\n"; + ss << " int gid0=get_global_id(0);\n"; + size_t i = vSubArguments.size(); + size_t nItems = 0; + ss <<"\n "; + //while (i-- > 1) + for (i = 0; i < vSubArguments.size(); i++) + { + FormulaToken *pCur = vSubArguments[i]->GetFormulaToken(); + assert(pCur); + if (pCur->GetType() == formula::svDoubleVectorRef) + { + const formula::DoubleVectorRefToken* pDVR = + dynamic_cast<const formula::DoubleVectorRefToken *>(pCur); + size_t nCurWindowSize = pDVR->GetRefRowSize(); + ss << "for (int i = "; + if (!pDVR->IsStartFixed() && pDVR->IsEndFixed()) { +#ifdef ISNAN + ss << "gid0; i < " << pDVR->GetArrayLength(); + ss << " && i < " << nCurWindowSize << "; i++){\n"; +#else + ss << "gid0; i < "<< nCurWindowSize << "; i++)\n"; +#endif + } else if (pDVR->IsStartFixed() && !pDVR->IsEndFixed()) { +#ifdef ISNAN + ss << "0; i < " << pDVR->GetArrayLength(); + ss << " && i < gid0+"<< nCurWindowSize << "; i++){\n"; +#else + ss << "0; i < gid0+"<< nCurWindowSize << "; i++)\n"; +#endif + } else if (!pDVR->IsStartFixed() && !pDVR->IsEndFixed()){ +#ifdef ISNAN + ss << "0; i + gid0 < " << pDVR->GetArrayLength(); + ss << " && i < "<< nCurWindowSize << "; i++){\n"; +#else + ss << "0; i < "<< nCurWindowSize << "; i++)\n"; +#endif + } + else { +#ifdef ISNAN + ss << "0; i < "<< nCurWindowSize << "; i++){\n"; +#else + ss << "0; i < "<< nCurWindowSize << "; i++)\n"; +#endif + } + nItems += nCurWindowSize; + } + else if (pCur->GetType() == formula::svSingleVectorRef) + { +#ifdef ISNAN + const formula::SingleVectorRefToken* pSVR = + dynamic_cast< const formula::SingleVectorRefToken* >(pCur); + ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n"; +#else + nItems += 1; +#endif + } + else if (pCur->GetType() == formula::svDouble) + { +#ifdef ISNAN + ss << "{\n"; +#endif + nItems += 1; + } + else + { +#ifdef ISNAN +#endif + nItems += 1; + } +#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"; + } +#else + ss << "tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef(); + ss <<";\n "; +#endif + } + ss << " double rq = (0.5 - tmp1) + 0.5;\n"; + ss << " if (tmp2 < 0.0 || tmp0 < 0.0 || tmp0 > tmp2 ||"; + ss << "tmp1 < 0.0 || tmp1 > 1.0)\n"; + ss << " {\n"; + ss << " return DBL_MIN;\n"; + ss << " }\n"; + ss << " if(tmp1 == 0)\n"; + ss << " return ( (tmp0 == 0.0 || tmp3) ? 1.0 : 0.0 );"; + ss << " if(tmp1 == 1.0);\n"; + ss << " return ( (tmp0 == tmp2) ? 1.0 : 0.0);\n"; + ss << " if(!tmp3)\n"; + ss << " return ( GetBinomDistPMF(tmp0, tmp2, tmp1));\n"; + ss << " else \n"; + ss << " {\n"; + ss << " if(tmp0 == tmp2)\n"; + ss << " return 1.0;\n"; + ss << " else\n"; + ss << " {\n"; + ss << " double fFactor = pow(tmp1,tmp2);\n"; + ss << " if(tmp0 == 0.0)\n"; + ss << " return (fFactor);\n"; + ss << " else if(fFactor <= Min)\n"; + ss << " {\n"; + ss << " fFactor = pow(tmp1,tmp2);\n"; + ss << " if(fFactor <= Min)\n"; + ss << " return GetBetaDist"; + ss << " (tmp1, tmp2 - tmp0, tmp0 + 1.0);\n"; + ss << " else\n"; + ss << " {\n"; + ss << " if(fFactor > fMachEps)\n"; + ss << " {\n"; + ss << " double fSum = 1.0 - fFactor;\n"; + ss << " unsigned int max = ((tmp2 - tmp0)-1);\n"; + ss << " for (uint i = 0; i < max && fFactor > 0.0;"; + ss << " i++)\n"; + ss << " {\n"; + ss << " fFactor *= (tmp2 - i)/(i + 1)*"; + ss << "tmp1/tmp1;\n"; + ss << " fSum -= fFactor;\n"; + ss << " }\n"; + ss << " return ( (fSum < 0.0) ? 0.0 : fSum );\n"; + ss << " }\n"; + ss << " else \n"; + ss << " return (lcl_GetBinomDistRange"; + ss << "(tmp2, tmp2 - tmp1, tmp2, fFactor, rq, tmp1));\n"; + ss << " }\n"; + ss << " }\n"; + ss << " else\n"; + ss << " return ( lcl_GetBinomDistRange"; + ss << "(tmp2, 0.0, tmp0, fFactor, tmp1, rq));\n"; + ss << " }\n"; + ss << " }\n"; + ss << "}\n"; +} + void OpChiSqDist::BinInlineFun(std::set<std::string>& decls, std::set<std::string>& funs) { diff --git a/sc/source/core/opencl/op_statistical.hxx b/sc/source/core/opencl/op_statistical.hxx index e80075e87391..31550181eb95 100644 --- a/sc/source/core/opencl/op_statistical.hxx +++ b/sc/source/core/opencl/op_statistical.hxx @@ -274,6 +274,13 @@ class OpChiDist:public Normal{ virtual void BinInlineFun(std::set<std::string>& ,std::set<std::string>&); virtual std::string BinFuncName(void) const { return "OpChiDist"; } }; +class OpBinomdist:public Normal{ + public: + virtual void GenSlidingWindowFunction(std::stringstream &ss, + const std::string sSymName, SubArguments &vSubArguments); + virtual void BinInlineFun(std::set<std::string>& ,std::set<std::string>&); + virtual std::string BinFuncName(void) const { return "OpBinomdist"; } +}; class OpChiSqDist: public CheckVariables { public: |