diff options
author | mulei <mulei@multicorewareinc.com> | 2013-12-04 16:28:30 +0800 |
---|---|---|
committer | I-Jui (Ray) Sung <ray@multicorewareinc.com> | 2013-12-18 20:34:55 -0600 |
commit | 9a4bc2541d92bf935408a08e19547bfc00e59223 (patch) | |
tree | 2515cdcafd00fa428f7fb6ac5d5714dc5811787c /sc/source | |
parent | 2180b1c9b0e944378288e6e7fe46b1b1cc1ca9af (diff) |
GPU Calc: Optimized NOMINAL
AMLOEXT-265
Change-Id: I497b5cd9c89fc1c1afc4091023335b7db9fc8f4b
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/source')
-rw-r--r-- | sc/source/core/opencl/op_financial.cxx | 73 |
1 files changed, 51 insertions, 22 deletions
diff --git a/sc/source/core/opencl/op_financial.cxx b/sc/source/core/opencl/op_financial.cxx index 016214eacd52..ccf2bf4d1b4d 100644 --- a/sc/source/core/opencl/op_financial.cxx +++ b/sc/source/core/opencl/op_financial.cxx @@ -102,7 +102,8 @@ void RRI::GenSlidingWindowFunction( } void OpNominal::GenSlidingWindowFunction( - std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments) + std::stringstream &ss, const std::string sSymName, SubArguments & +vSubArguments) { ss << "\ndouble " << sSymName; ss << "_"<< BinFuncName() <<"("; @@ -114,31 +115,59 @@ void OpNominal::GenSlidingWindowFunction( } ss << ") {\n\t"; ss << "double tmp = 0;\n\t"; + ss << "double temp = 0;\n\t"; ss << "int gid0 = get_global_id(0);\n\t"; - ss <<"double tmp0 = "; - ss <<vSubArguments[0]->GenSlidingWindowDeclRef()<<";\n\t"; - ss <<"double tmp1 = "; - ss <<vSubArguments[1]->GenSlidingWindowDeclRef()<<";\n\t"; -#ifdef ISNAN - - FormulaToken *tmpCur0 = vSubArguments[0] - ->GetFormulaToken(); - const formula::SingleVectorRefToken*tmpCurDVR0= dynamic_cast<const - formula::SingleVectorRefToken *>(tmpCur0); - ss<<"if("<<tmpCurDVR0->GetArrayLength()<<"<=gid0||"; - ss <<"isNan(tmp0))\n\t\t"; - ss<<" tmp0= 0;\n\t"; - FormulaToken *tmpCur1 = vSubArguments[1] - ->GetFormulaToken(); - const formula::SingleVectorRefToken*tmpCurDVR1= dynamic_cast<const - formula::SingleVectorRefToken *>(tmpCur1); - ss<<"if("<<tmpCurDVR1->GetArrayLength()<<"<=gid0||"; - ss <<"isNan(tmp1))\n\t\t"; - ss<<" tmp1= 0;\n\t"; + ss << "double tmp0=0,tmp1=0;\n"; + for (unsigned 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"; +#else +#endif + } + else if (pCur->GetType() == formula::svDouble) + { +#ifdef ISNAN + ss << "{\n"; +#endif + } + else + { +#ifdef ISNAN #endif + } +#ifdef ISNAN + if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) + { + ss <<" temp="<<vSubArguments[i]->GenSlidingWindowDeclRef(); + ss <<";\n"; + ss <<" if (isNan(temp))\n"; + ss <<" tmp"<<i<<"= 0;\n"; + ss <<" else\n"; + ss <<" tmp"<<i<<"=temp;\n"; + ss <<" }\n"; + } + else + { + ss <<" tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef( +); + ss <<";\n"; + } +#else + ss <<" tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef(); + ss <<";\n"; +#endif + } ss<<"if(tmp1==0)\n\t"; ss<<"\treturn 0;\n\t"; - ss<<"tmp=( pow( tmp0+ 1.0, 1.0 / tmp1 ) - 1.0 ) *"; + ss<<"tmp=pow( tmp1,-1);\n\t"; + ss<<"tmp=( pow( tmp0+ 1.0, tmp ) - 1.0 ) *"; ss<<"tmp1;\n\t"; ss << "return tmp;\n"; ss << "}"; |