summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormingli <mingli@multicorewareinc.com>2013-12-16 15:58:55 +0800
committerI-Jui (Ray) Sung <ray@multicorewareinc.com>2013-12-19 17:54:03 -0600
commit2009d74a2f610f5a656f778b458866fa079b38f7 (patch)
tree77c2b1c9a9c207287617666d213b8a8757830d6c
parent436fe90db05317e31c855e1ea01b3c4263784f07 (diff)
GPU Calc:Fix the accuracy problem of 'Harmean'
AMLOEXT-366 Change-Id: Ic368b8301c4e80ad76e1d0b33b69bee6a87b9d89 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_statistical.cxx49
1 files changed, 30 insertions, 19 deletions
diff --git a/sc/source/core/opencl/op_statistical.cxx b/sc/source/core/opencl/op_statistical.cxx
index 43dd939357ba..9786682957c3 100644
--- a/sc/source/core/opencl/op_statistical.cxx
+++ b/sc/source/core/opencl/op_statistical.cxx
@@ -4381,11 +4381,7 @@ void OpHarMean::GenSlidingWindowFunction(
std::stringstream &ss, const std::string sSymName, SubArguments &
vSubArguments)
{
- FormulaToken *pCur = vSubArguments[0]->GetFormulaToken();
- assert(pCur);
- const formula::DoubleVectorRefToken* pCurDVR =
- dynamic_cast<const formula::DoubleVectorRefToken *>(pCur);
- size_t nCurWindowSize = pCurDVR->GetRefRowSize();
+
ss << "\ndouble " << sSymName;
ss << "_"<< BinFuncName() <<"( ";
for (unsigned i = 0; i < vSubArguments.size(); i++)
@@ -4394,23 +4390,27 @@ vSubArguments)
ss << ",";
vSubArguments[i]->GenSlidingWindowDecl(ss);
}
- ss << ") {\n";
+ ss << ")\n";
+ ss <<"{\n";
ss << " int gid0 = get_global_id(0);\n";
ss << " double nVal=0.0;\n";
- ss << " int length="<<nCurWindowSize<<";\n";
ss << " double tmp = 0;\n";
+ ss << " int length;\n";
+ ss << " int totallength=0;\n";
for (unsigned i = 0; i < vSubArguments.size(); i++)
{
- pCur = vSubArguments[i]->GetFormulaToken();
+ FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
assert(pCur);
if (pCur->GetType() == formula::svDoubleVectorRef)
{
const formula::DoubleVectorRefToken* pDVR =
dynamic_cast<const formula::DoubleVectorRefToken *>(pCur);
- nCurWindowSize = pDVR->GetRefRowSize();
+ size_t nCurWindowSize = pDVR->GetRefRowSize();
+ ss << " length="<<nCurWindowSize;
+ ss << ";\n";
ss << " for (int i = ";
-#ifdef ISNAN
- ss << "0; i < "<< nCurWindowSize << "; i++){\n";
+ ss << "0; i < "<< nCurWindowSize << "; i++)\n";
+ ss << " {\n";
ss << " double arg"<<i<<" = ";
ss << vSubArguments[i]->GenSlidingWindowDeclRef();
ss << ";\n";
@@ -4423,24 +4423,35 @@ vSubArguments)
ss << " continue;\n";
ss << " }\n";
#endif
- ss << " nVal += pow(arg"<<i<<",-1);\n";
+ ss << " nVal += (1.0 *pow(";
+ ss << " arg"<<i<<",-1));\n";
ss << " }\n";
-#endif
+ ss << " totallength +=length;\n";
}
else if (pCur->GetType() == formula::svSingleVectorRef)
{
-#ifdef ISNAN
- ss << "return HUGE_VAL";
+ ss << " double arg0 = ";
+ ss << vSubArguments[i]->GenSlidingWindowDeclRef();
+ ss << ";\n";
+#ifdef ISNAN
+ ss << " if(isNan(arg0))\n";
+ ss << " {\n";
+ ss << " continue;\n";
+ ss << " }\n";
#endif
+ ss << " nVal += (1.0 * pow( arg0,-1));\n";
+ ss << " totallength +=1;\n";
}
else if (pCur->GetType() == formula::svDouble)
{
-#ifdef ISNAN
- ss << "return HUGE_VAL";
-#endif
+ ss << " double arg0 = ";
+ ss << vSubArguments[i]->GenSlidingWindowDeclRef();
+ ss << ";\n";
+ ss << " nVal += (1.0 *pow( arg0,-1));\n";
+ ss << " totallength +=1;\n";
}
}
- ss << " tmp = length/nVal;\n\t";
+ ss << " tmp = totallength*pow(nVal,-1);\n";
ss << " return tmp;\n";
ss << "}";
}