summaryrefslogtreecommitdiff
path: root/sc/source/core/opencl/op_financial.cxx
diff options
context:
space:
mode:
authormulei <mulei@multicorewareinc.com>2013-12-04 16:28:30 +0800
committerI-Jui (Ray) Sung <ray@multicorewareinc.com>2013-12-18 20:34:55 -0600
commit9a4bc2541d92bf935408a08e19547bfc00e59223 (patch)
tree2515cdcafd00fa428f7fb6ac5d5714dc5811787c /sc/source/core/opencl/op_financial.cxx
parent2180b1c9b0e944378288e6e7fe46b1b1cc1ca9af (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/core/opencl/op_financial.cxx')
-rw-r--r--sc/source/core/opencl/op_financial.cxx73
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 << "}";