summaryrefslogtreecommitdiff
path: root/sc/source/core/opencl/op_financial.cxx
diff options
context:
space:
mode:
authoryiming ju <yiming@multicorewareinc.com>2013-12-06 12:43:07 +0800
committerI-Jui (Ray) Sung <ray@multicorewareinc.com>2013-12-19 17:53:41 -0600
commit6dfd73beffefb625a1c5a42764fe85969ccfb45d (patch)
treea7489166bd6e0c7e4632f0a6be00bb4a16c56758 /sc/source/core/opencl/op_financial.cxx
parent5c570be292bef8beaaab5acce05016dc5365a697 (diff)
GPU Calc: Optimized RATE
AMLOEXT-327 Change-Id: I3ddba39a495bcfec3070077026a05382eb702163 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.cxx197
1 files changed, 108 insertions, 89 deletions
diff --git a/sc/source/core/opencl/op_financial.cxx b/sc/source/core/opencl/op_financial.cxx
index 98595f84a175..529e76df8b7d 100644
--- a/sc/source/core/opencl/op_financial.cxx
+++ b/sc/source/core/opencl/op_financial.cxx
@@ -4878,98 +4878,117 @@ void RATE::GenSlidingWindowFunction(
const formula::SingleVectorRefToken* pSVR =
dynamic_cast< const formula::SingleVectorRefToken* >(pCur);
assert(pSVR);
- ss << ") {\n\t";
- ss << "double result;\n\t";
- ss << "int gid0 = get_global_id(0);\n\t";
- ss << "bool bValid = true, bFound = false;\n\t";
- ss << "double fX, fXnew, fTerm, fTermDerivation;\n\t";
- ss << "double fGeoSeries, fGeoSeriesDerivation;\n\t";
- ss << "int nIterationsMax = 150;\n\t";
- ss << "int nCount = 0;\n\t";
- ss << "double fEpsilonSmall = 1.0E-14;\n\t";
- ss << "double arg0, arg1, arg2, arg3, arg4, arg5;\n\t";
- ss << "arg0=" << vSubArguments[0]->GenSlidingWindowDeclRef()<<";\n\t";
- ss << "arg1=" << vSubArguments[1]->GenSlidingWindowDeclRef()<<";\n\t";
- ss << "arg2=" << vSubArguments[2]->GenSlidingWindowDeclRef()<<";\n\t";
- ss << "arg3=" << vSubArguments[3]->GenSlidingWindowDeclRef()<<";\n\t";
- ss << "arg4=" << vSubArguments[4]->GenSlidingWindowDeclRef()<<";\n\t";
- ss << "arg5=" << vSubArguments[5]->GenSlidingWindowDeclRef()<<";\n\t";
- ss << "int guessLen = " << pSVR->GetArrayLength() << ";\n\t";
+ ss << ") {\n";
+ ss << " double result;\n";
+ ss << " int gid0 = get_global_id(0);\n";
+ ss << " bool bValid = true, bFound = false;\n";
+ ss << " double fX, fXnew, fTerm, fTermDerivation;\n";
+ ss << " double fGeoSeries, fGeoSeriesDerivation;\n";
+ ss << " int nIterationsMax = 150;\n";
+ ss << " int nCount = 0;\n";
+ ss << " double fEpsilonSmall = 1.0E-14;\n";
+ ss << " double arg0, arg1, arg2, arg3, arg4, arg5;\n";
+ ss << " arg0=" << vSubArguments[0]->GenSlidingWindowDeclRef()<<";\n";
+ ss << " arg1=" << vSubArguments[1]->GenSlidingWindowDeclRef()<<";\n";
+ ss << " arg2=" << vSubArguments[2]->GenSlidingWindowDeclRef()<<";\n";
+ ss << " arg3=" << vSubArguments[3]->GenSlidingWindowDeclRef()<<";\n";
+ ss << " arg4=" << vSubArguments[4]->GenSlidingWindowDeclRef()<<";\n";
+ ss << " arg5=" << vSubArguments[5]->GenSlidingWindowDeclRef()<<";\n";
+ ss << " int guessLen = " << pSVR->GetArrayLength() << ";\n";
#ifdef ISNAN
- ss << "if (isNan(arg0) || isNan(arg1) || isNan(arg2)){\n\t\t";
- ss << "result = 523;\n\t\t";
- ss << "return result;\n\t}\n\t";
- ss << "if (isNan(arg3))\n\t\t";
- ss << "arg3 = 0.0;\n\t";
- ss << "if (isNan(arg4))\n\t\t";
- ss << "arg4 = 0.0;\n\t";
- ss << "if (isNan(arg5))\n\t\t";
- ss << "arg5 = 0.1;\n\t";
- ss << "if (gid0 >= guessLen)\n\t\t";
- ss << "arg5 = 0.1;\n\t";
+ ss << " if (isNan(arg0) || isNan(arg1) || isNan(arg2)){\n";
+ ss << " result = 523;\n";
+ ss << " return result;\n";
+ ss << " }\n";
+ ss << " if (isNan(arg3))\n";
+ ss << " arg3 = 0.0;\n";
+ ss << " if (isNan(arg4))\n";
+ ss << " arg4 = 0.0;\n";
+ ss << " if (isNan(arg5))\n";
+ ss << " arg5 = 0.1;\n";
+ ss << " if (gid0 >= guessLen)\n";
+ ss << " arg5 = 0.1;\n";
#endif
- ss << "arg3 = arg3 - arg1 * arg4;\n\t";
- ss << "arg2 = arg2 + arg1 * arg4;\n\t";
- ss << "if (arg0 == Round(arg0)){\n\t\t";
- ss << "fX = arg5;\n\t\t";
- ss << "double fPowN, fPowNminus1;\n\t\t";
- ss << "while (!bFound && nCount < nIterationsMax)\n\t\t";
- ss << "{\n\t\t\t";
- ss << "fPowNminus1 = pow( 1.0+fX, arg0-1.0);\n\t\t\t";
- ss << "fPowN = fPowNminus1 * (1.0+fX);\n\t\t\t";
- ss << "if (approxEqual( fabs(fX), 0.0))\n\t\t\t" << "{\n\t\t\t\t";
- ss << "fGeoSeries = arg0;\n\t\t\t\t";
- ss << "fGeoSeriesDerivation = arg0 * (arg0-1.0)/2.0;\n\t\t\t";
- ss << "}\n\t\t\t" << "else\n\t\t\t{\n\t\t\t\t";
- ss << "fGeoSeries = (fPowN-1.0)/fX;\n\t\t\t\t";
- ss << "fGeoSeriesDerivation =";
- ss << " arg0 * fPowNminus1 / fX - fGeoSeries /fX;";
- ss << "\n\t\t\t" << "}\n\t\t\t";
- ss << "fTerm = arg3 + arg2 *fPowN+ arg1 * fGeoSeries;\n\t\t\t";
- ss << "fTermDerivation = arg2 * arg0 * fPowNminus1 +";
- ss << " arg1 * fGeoSeriesDerivation;\n\t\t\t";
- ss << "if (fabs(fTerm) < fEpsilonSmall)\n\t\t\t\t";
- ss << "bFound = true;\n\t\t\t";
- ss << "else\n\t\t\t{\n\t\t\t\t";
- ss << "if (approxEqual(fabs(fTermDerivation), 0.0))\n\t\t\t\t\t";
- ss << "fXnew = fX + 1.1 * SCdEpsilon;\n\t\t\t\t";
- ss << "else\n\t\t\t\t\tfXnew = fX - fTerm / fTermDerivation;\n\t\t";
- ss << "nCount++;\n\t\t\t\t";
- ss << "bFound = (fabs(fXnew - fX) < SCdEpsilon);\n\t\t\t\t";
- ss << "fX = fXnew;\n\t\t\t" << "}\n\t\t}\n\t}\n\telse\n\t{\n\t\t";
- ss << "fX = (arg5 < -1.0) ? -1.0 : arg5;\n\t\t";
- ss << "while (bValid && !bFound && nCount < nIterationsMax)\n\t\t";
- ss << "{\n\t\t\t";
- ss << "if (approxEqual(fabs(fX), 0.0)){\n\t\t\t\t";
- ss << "fGeoSeries = arg0;\n\t\t\t\t";
- ss << "fGeoSeriesDerivation = arg0 * (arg0-1.0)/2.0;\n\t\t\t";
- ss << "}else{\n\t\t\t\t";
- ss << "fGeoSeries = (pow( 1.0+fX, arg0) - 1.0) / fX;\n\t\t\t\t";
- ss << "fGeoSeriesDerivation =";
- ss << " arg0 * pow(1.0+fX,arg0-1.0) /";
- ss << " fX - fGeoSeries / fX;\n\t\t\t}\n\t\t\t";
- ss << "fTerm = arg3 + arg2 *pow(1.0+fX, arg0)";
- ss << "+ arg1 * fGeoSeries;\n\t\t\t";
- ss << "fTermDerivation =";
+ ss << " arg3 = arg3 - arg1 * arg4;\n";
+ ss << " arg2 = arg2 + arg1 * arg4;\n";
+ ss << " if (arg0 == Round(arg0)){\n";
+ ss << " fX = arg5;\n";
+ ss << " double fPowN, fPowNminus1;\n";
+ ss << " while (!bFound && nCount < nIterationsMax)\n";
+ ss << " {\n";
+ ss << " fPowNminus1 = pow( 1.0+fX, arg0-1.0);\n";
+ ss << " fPowN = fPowNminus1 * (1.0+fX);\n";
+ ss << " if (approxEqual( fabs(fX), 0.0))\n";
+ ss << " {\n";
+ ss << " fGeoSeries = arg0;\n";
+ ss << " fGeoSeriesDerivation = arg0 * (arg0-1.0)";
+ ss << "*pow(2.0,-1);\n";
+ ss << " }\n";
+ ss << " else\n";
+ ss << " {";
+ ss << " fGeoSeries = (fPowN-1.0)*pow(fX,-1);\n";
+ ss << " fGeoSeriesDerivation =";
+ ss << " arg0 * fPowNminus1 * pow( fX , -1) - fGeoSeries * pow(fX, -1);\n";
+ ss << " }\n";
+ ss << " fTerm = arg3 + arg2 *fPowN+ arg1 * fGeoSeries;\n";
+ ss << " fTermDerivation = arg2 * arg0 * fPowNminus1 +";
+ ss << "arg1 * fGeoSeriesDerivation;\n";
+ ss << " if (fabs(fTerm) < fEpsilonSmall)\n";
+ ss << " bFound = true;\n";
+ ss << " else\n";
+ ss << " {\n";
+ ss << " if (approxEqual(fabs(fTermDerivation), 0.0))\n";
+ ss << " fXnew = fX + 1.1 * SCdEpsilon;\n";
+ ss << " else\n";
+ ss << " fXnew = fX - fTerm ";
+ ss << "*pow( fTermDerivation,-1);\n";
+ ss << " nCount++;\n";
+ ss << " bFound = (fabs(fXnew - fX) < SCdEpsilon);\n";
+ ss << " fX = fXnew;\n";
+ ss << " }\n";
+ ss << " }\n";
+ ss << " }\n";
+ ss << " else\n";
+ ss << " {";
+ ss << " fX = (arg5 < -1.0) ? -1.0 : arg5;\n";
+ ss << " while (bValid && !bFound && nCount < nIterationsMax)\n";
+ ss << " {\n";
+ ss << " if (approxEqual(fabs(fX), 0.0)){\n";
+ ss << " fGeoSeries = arg0;\n";
+ ss << " fGeoSeriesDerivation = arg0 * ";
+ ss << "(arg0-1.0)* pow(2.0,-1);\n";
+ ss << " }else{\n";
+ ss << " fGeoSeries = (pow( 1.0+fX, arg0) - 1.0)";
+ ss << " *pow( fX,-1);\n";
+ ss << " fGeoSeriesDerivation =";
+ ss << " arg0 * pow(1.0+fX,arg0-1.0) *pow(fX,-1)";
+ ss << " - fGeoSeries *pow( fX,-1);\n";
+ ss << " }\n";
+ ss << " fTerm = arg3 + arg2 *pow(1.0+fX, arg0)";
+ ss << "+ arg1 * fGeoSeries;\n";
+ ss << " fTermDerivation =";
ss << "arg2*arg0*pow(1.0+fX,arg0-1.0)";
- ss << "+arg1*fGeoSeriesDerivation;\n\t\t\t";
- ss << "if (fabs(fTerm) < fEpsilonSmall)\n\t\t\t\t";
- ss << "bFound = true;\n\t\t\t";
- ss << "else{\n\t\t\t\t";
- ss << "if (approxEqual(fabs(fTermDerivation), 0.0))\n\t\t\t\t\t";
- ss << "fXnew = fX + 1.1 * SCdEpsilon;\n\t\t\t\t";
- ss << "else\n\t\t\t\t\t";
- ss << "fXnew = fX - fTerm / fTermDerivation;\n\t\t\t\t";
- ss << "nCount++;\n\t\t\t\t";
- ss << "bFound = (fabs(fXnew - fX) < SCdEpsilon);\n\t\t\t\t";
- ss << "fX = fXnew;\n\t\t\t\t";
- ss << "bValid = (fX >= -1.0);\n\t\t\t";
- ss << "}\n\t\t}\n\t}\n\t";
- ss << "if (bValid && bFound)\n\t\t";
- ss << "result = fX;\n\t";
- ss << "else\n\t\t";
- ss << "result = 523;\n\t";
- ss << "return result;\n";
+ ss << "+arg1*fGeoSeriesDerivation;\n";
+ ss << " if (fabs(fTerm) < fEpsilonSmall)\n";
+ ss << " bFound = true;\n";
+ ss << " else{\n";
+ ss << " if (approxEqual(fabs(fTermDerivation), 0.0))\n";
+ ss << " fXnew = fX + 1.1 * SCdEpsilon;\n";
+ ss << " else\n";
+ ss << " fXnew = fX - fTerm ";
+ ss << "*pow( fTermDerivation,-1);\n";
+ ss << " nCount++;\n";
+ ss << " bFound = (fabs(fXnew - fX) < SCdEpsilon);\n";
+ ss << " fX = fXnew;\n";
+ ss << " bValid = (fX >= -1.0);\n";
+ ss << " }\n";
+ ss << " }\n";
+ ss << " }\n";
+ ss << " if (bValid && bFound)\n";
+ ss << " result = fX;\n";
+ ss << " else\n";
+ ss << " result = 523;\n";
+ ss << " return result;\n";
ss << "}";
}