summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorminwang <min@multicorewareinc.com>2013-12-24 14:35:55 +0800
committerI-Jui (Ray) Sung <ray@multicorewareinc.com>2013-12-30 15:05:28 -0600
commite600adae34fe99373eb9695864aadabc06682773 (patch)
treea1840c68345a7964357705c70e92415a0f646f03
parent9d5b5dfeb2d4d913900de86a97387e6d997c5e38 (diff)
GPU Calc: Optimized AMORLINC
AMLOEXT-228 Change-Id: Ie48898fd7b783bb94e3dcf0121ae40d9aa32916e 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>
-rw-r--r--sc/source/core/opencl/op_financial.cxx115
1 files changed, 54 insertions, 61 deletions
diff --git a/sc/source/core/opencl/op_financial.cxx b/sc/source/core/opencl/op_financial.cxx
index f7b7ed04b92e..17f37bf6a0f2 100644
--- a/sc/source/core/opencl/op_financial.cxx
+++ b/sc/source/core/opencl/op_financial.cxx
@@ -4189,11 +4189,11 @@ void OpAmorlinc::BinInlineFun(std::set<std::string>& decls,
decls.insert(nKorrValDecl); decls.insert(RoundDecl);
decls.insert(IsLeapYearDecl);decls.insert(DaysInMonthDecl);
decls.insert(DaysToDateDecl); decls.insert(DateToDaysDecl);
- decls.insert(GetNullDateDecl); decls.insert(GetYearFracDecl);
+ decls.insert(GetYearFracDecl);
funs.insert(Round);
funs.insert(IsLeapYear);funs.insert(DaysInMonth);
funs.insert(DaysToDate);funs.insert(DateToDays);
- funs.insert(GetNullDate);funs.insert(GetYearFrac);
+ funs.insert(GetYearFrac);
}
void OpAmorlinc::GenSlidingWindowFunction(std::stringstream &ss,
const std::string sSymName, SubArguments &vSubArguments)
@@ -4208,112 +4208,105 @@ void OpAmorlinc::GenSlidingWindowFunction(std::stringstream &ss,
}
ss << ") {\n";
ss << " int gid0 = get_global_id(0);\n";
- ss << " double tmp = " << GetBottom() <<";\n";
+ ss << " double tmp = 0;\n";
ss << " double fCost,fRestVal,fPer,fRate;\n";
ss << " int nDate,nFirstPer,nBase;\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);
FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken();
- const formula::SingleVectorRefToken*tmpCurDVR3= dynamic_cast<const
- formula::SingleVectorRefToken *>(tmpCur3);
FormulaToken *tmpCur4 = vSubArguments[4]->GetFormulaToken();
- const formula::SingleVectorRefToken*tmpCurDVR4= dynamic_cast<const
- formula::SingleVectorRefToken *>(tmpCur4);
FormulaToken *tmpCur5 = vSubArguments[5]->GetFormulaToken();
- const formula::SingleVectorRefToken*tmpCurDVR5= dynamic_cast<const
- formula::SingleVectorRefToken *>(tmpCur5);
FormulaToken *tmpCur6 = vSubArguments[6]->GetFormulaToken();
- const formula::SingleVectorRefToken*tmpCurDVR6= dynamic_cast<const
- formula::SingleVectorRefToken *>(tmpCur6);
- ss<< " int buffer_Cost_len = ";
- ss<< tmpCurDVR0->GetArrayLength();
- ss<< ";\n";
- ss<< " int buffer_Date_len = ";
- ss<< tmpCurDVR1->GetArrayLength();
- ss << ";\n";
- ss<< " int buffer_FirstPer_len = ";
- ss<< tmpCurDVR2->GetArrayLength();
- ss << ";\n";
- ss<< " int buffer_RestVal_len = ";
- ss<< tmpCurDVR3->GetArrayLength();
- ss << ";\n";
- ss<< " int buffer_Per_len = ";
- ss<< tmpCurDVR4->GetArrayLength();
- ss << ";\n";
- ss<< " int buffer_Rate_len = ";
- ss<< tmpCurDVR5->GetArrayLength();
- ss << ";\n";
- ss<< " int buffer_Base_len = ";
- ss<< tmpCurDVR6->GetArrayLength();
- ss << ";\n";
#endif
#ifdef ISNAN
- ss <<" if(gid0 >= buffer_Cost_len || isNan(";
- ss <<vSubArguments[0]->GenSlidingWindowDeclRef();
- ss <<"))\n";
+ if(tmpCur0->GetType() == formula::svSingleVectorRef)
+ {
+ const formula::SingleVectorRefToken*tmpCurDVR0= dynamic_cast<const
+ formula::SingleVectorRefToken *>(tmpCur0);
+ ss <<" if(isNan("<<vSubArguments[0]->GenSlidingWindowDeclRef();
+ ss <<")||(gid0 >="<<tmpCurDVR0->GetArrayLength()<<"))\n";
ss <<" fCost = 0;\n else\n";
+ }
#endif
ss << " fCost=";
ss << vSubArguments[0]->GenSlidingWindowDeclRef();
ss <<";\n";
#ifdef ISNAN
- ss <<" if(gid0 >= buffer_Date_len || isNan(";
- ss <<vSubArguments[1]->GenSlidingWindowDeclRef();
- ss <<"))\n";
+ if(tmpCur1->GetType() == formula::svSingleVectorRef)
+ {
+ const formula::SingleVectorRefToken*tmpCurDVR1= dynamic_cast<const
+ formula::SingleVectorRefToken *>(tmpCur1);
+ ss <<" if(isNan("<<vSubArguments[1]->GenSlidingWindowDeclRef();
+ ss <<")||(gid0 >="<<tmpCurDVR1->GetArrayLength()<<"))\n";
ss <<" nDate = 0;\n else\n";
+ }
#endif
ss << " nDate=(int)";
ss << vSubArguments[1]->GenSlidingWindowDeclRef();
ss << ";\n";
#ifdef ISNAN
- ss <<" if(gid0 >= buffer_FirstPer_len || isNan(";
- ss <<vSubArguments[2]->GenSlidingWindowDeclRef();
- ss <<"))\n";
+ if(tmpCur2->GetType() == formula::svSingleVectorRef)
+ {
+ const formula::SingleVectorRefToken*tmpCurDVR2= dynamic_cast<const
+ formula::SingleVectorRefToken *>(tmpCur2);
+ ss <<" if(isNan("<<vSubArguments[2]->GenSlidingWindowDeclRef();
+ ss <<")||(gid0 >="<<tmpCurDVR2->GetArrayLength()<<"))\n";
ss <<" nFirstPer = 0;\n else\n";
+ }
#endif
ss << " nFirstPer=(int)";
ss << vSubArguments[2]->GenSlidingWindowDeclRef();
ss <<";\n";
#ifdef ISNAN
- ss <<" if(gid0 >= buffer_RestVal_len || isNan(";
- ss <<vSubArguments[3]->GenSlidingWindowDeclRef();
- ss <<"))\n";
+ if(tmpCur3->GetType() == formula::svSingleVectorRef)
+ {
+ const formula::SingleVectorRefToken*tmpCurDVR3= dynamic_cast<const
+ formula::SingleVectorRefToken *>(tmpCur3);
+ ss <<" if(isNan(" <<vSubArguments[3]->GenSlidingWindowDeclRef();
+ ss <<")||(gid0 >="<<tmpCurDVR3->GetArrayLength()<<"))\n";
ss <<" fRestVal = 0;\n else\n";
+ }
#endif
ss << " fRestVal=";
ss << vSubArguments[3]->GenSlidingWindowDeclRef();
ss << ";\n";
#ifdef ISNAN
- ss <<" if(gid0 >= buffer_Per_len || isNan(";
- ss <<vSubArguments[4]->GenSlidingWindowDeclRef();
- ss <<"))\n";
+ if(tmpCur4->GetType() == formula::svSingleVectorRef)
+ {
+ const formula::SingleVectorRefToken*tmpCurDVR4= dynamic_cast<const
+ formula::SingleVectorRefToken *>(tmpCur4);
+ ss <<" if(isNan(" <<vSubArguments[4]->GenSlidingWindowDeclRef();
+ ss <<")||(gid0 >="<<tmpCurDVR4->GetArrayLength()<<"))\n";
ss <<" fPer = 0;\n else\n";
+ }
#endif
ss << " fPer = ";
ss << vSubArguments[4]->GenSlidingWindowDeclRef();
ss <<";\n";
#ifdef ISNAN
- ss <<" if(gid0 >= buffer_Rate_len || isNan(";
- ss <<vSubArguments[5]->GenSlidingWindowDeclRef();
- ss <<"))\n";
+ if(tmpCur5->GetType() == formula::svSingleVectorRef)
+ {
+ const formula::SingleVectorRefToken*tmpCurDVR5= dynamic_cast<const
+ formula::SingleVectorRefToken *>(tmpCur5);
+ ss <<" if(isNan(" <<vSubArguments[5]->GenSlidingWindowDeclRef();
+ ss <<")||(gid0 >="<<tmpCurDVR5->GetArrayLength()<<"))\n";
ss <<" fRate = 0;\n else\n";
+ }
#endif
ss << " fRate=";
ss << vSubArguments[5]->GenSlidingWindowDeclRef();
ss << ";\n";
#ifdef ISNAN
- ss <<" if(gid0 >= buffer_Base_len || isNan(";
- ss <<vSubArguments[6]->GenSlidingWindowDeclRef();
- ss <<"))\n";
+ if(tmpCur6->GetType() == formula::svSingleVectorRef)
+ {
+ const formula::SingleVectorRefToken*tmpCurDVR6= dynamic_cast<const
+ formula::SingleVectorRefToken *>(tmpCur6);
+ ss <<" if(isNan(" <<vSubArguments[6]->GenSlidingWindowDeclRef();
+ ss <<")||(gid0 >="<<tmpCurDVR6->GetArrayLength()<<"))\n";
ss <<" nBase = 0;\n else\n";
+ }
#endif
ss << " nBase = (int)";
ss << vSubArguments[6]->GenSlidingWindowDeclRef();
@@ -4321,10 +4314,10 @@ void OpAmorlinc::GenSlidingWindowFunction(std::stringstream &ss,
ss <<" int nPer = convert_int( fPer );\n";
ss <<" double fOneRate = fCost * fRate;\n";
ss <<" double fCostDelta = fCost - fRestVal;\n";
- ss <<" double f0Rate = GetYearFrac( GetNullDate(),";
+ ss <<" double f0Rate = GetYearFrac( 693594,";
ss <<"nDate, nFirstPer, nBase )* fRate * fCost;\n";
ss <<" int nNumOfFullPeriods = (int)";
- ss <<"( ( fCost - fRestVal - f0Rate) /fOneRate );\n";
+ ss <<"( ( fCost - fRestVal - f0Rate) *pow(fOneRate,-1) );\n";
ss <<" if( nPer == 0 )\n";
ss <<" tmp = f0Rate;\n";
ss <<" else if( nPer <= nNumOfFullPeriods )\n";