diff options
author | mingli <mingli@multicorewareinc.com> | 2013-12-03 16:10:43 +0800 |
---|---|---|
committer | I-Jui (Ray) Sung <ray@multicorewareinc.com> | 2013-12-18 20:34:54 -0600 |
commit | de9248a8453702ecb2add5acd1c3e747740235a2 (patch) | |
tree | f59b9c5e75d0a2e0f1398f9f69caa28ea56c5fd0 /sc | |
parent | d8afb5537c471cfc9046e06e27026623efb51696 (diff) |
GPU Calc: Optimized FISHER
AMLOEXT-261
Change-Id: Ic96d701aa8bbe1e1fe15ca196556960b34fd64d3
Signed-off-by: haochen <haochen@multicorewareinc.com>
Signed-off-by: Wei Wei <weiwei@multicorewareinc.com>
Signed-off-by: I-Jui (Ray) Sung <ray@multicorewareinc.com>
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/core/opencl/op_statistical.cxx | 56 |
1 files changed, 42 insertions, 14 deletions
diff --git a/sc/source/core/opencl/op_statistical.cxx b/sc/source/core/opencl/op_statistical.cxx index bf115bd1fe7d..b9aff2dcec66 100644 --- a/sc/source/core/opencl/op_statistical.cxx +++ b/sc/source/core/opencl/op_statistical.cxx @@ -3382,11 +3382,9 @@ void OpSTEYX::GenSlidingWindowFunction(std::stringstream &ss, } } void OpFisher::GenSlidingWindowFunction( - std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments) + std::stringstream &ss, const std::string sSymName, SubArguments & +vSubArguments) { - FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken(); - const formula::SingleVectorRefToken*tmpCurDVR= - dynamic_cast<const formula::SingleVectorRefToken *>(tmpCur); ss << "\ndouble " << sSymName; ss << "_"<< BinFuncName() <<"("; for (unsigned i = 0; i < vSubArguments.size(); i++) @@ -3395,21 +3393,51 @@ void OpFisher::GenSlidingWindowFunction( ss << ","; vSubArguments[i]->GenSlidingWindowDecl(ss); } - ss << ") {\n\t"; - ss <<"int gid0=get_global_id(0);\n\t"; - ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef(); - ss << ";\n\t"; + ss << ") {\n"; + ss <<" int gid0=get_global_id(0);\n"; + ss <<" double arg0;\n"; + if(vSubArguments.size() != 1) + { + ss << " return DBL_MAX;\n"; + return ; + } + FormulaToken *pCur = vSubArguments[0]->GetFormulaToken(); + assert(pCur); + if (pCur->GetType() == formula::svDoubleVectorRef) + { + ss << " return DBL_MAX;\n"; + return ; + } + else if (pCur->GetType() == formula::svSingleVectorRef) + { + const formula::SingleVectorRefToken* pSVR = + dynamic_cast< const formula::SingleVectorRefToken* >(pCur); + ss << " arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef(); + ss << ";\n"; #ifdef ISNAN - ss<< "if(isNan(arg0)||(gid0>="; - ss<<tmpCurDVR->GetArrayLength(); - ss<<"))\n\t\t"; - ss<<"arg0 = 0;\n\t"; + ss<< " if(isNan(arg0)||(gid0>="; + ss<<pSVR->GetArrayLength(); + ss<<"))\n"; + ss<<" arg0 = 0;\n"; #endif - ss << "double tmp=atanh(arg0);\n\t"; - ss << "return tmp;\n"; + } + else if (pCur->GetType() == formula::svDouble) + { + ss << " arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef(); + ss << ";\n"; +#ifdef ISNAN + ss << " if(isNan(arg0))\n"; + ss << " return DBL_MAX;\n"; +#endif + } + ss << " if (fabs(arg0) >= 1.0)\n"; + ss << " return DBL_MAX;\n"; + ss << " double tmp=0.5*log((1+arg0)*pow((1-arg0),-1));\n"; + ss << " return tmp;\n"; ss << "}\n"; } + void OpFisherInv::GenSlidingWindowFunction( std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments) { |