diff options
author | yiming ju <yiming@multicorewareinc.com> | 2013-12-06 12:43:07 +0800 |
---|---|---|
committer | I-Jui (Ray) Sung <ray@multicorewareinc.com> | 2013-12-19 17:53:41 -0600 |
commit | 6dfd73beffefb625a1c5a42764fe85969ccfb45d (patch) | |
tree | a7489166bd6e0c7e4632f0a6be00bb4a16c56758 /sc/source/core/opencl/op_financial.cxx | |
parent | 5c570be292bef8beaaab5acce05016dc5365a697 (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.cxx | 197 |
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 << "}"; } |