From 2009d74a2f610f5a656f778b458866fa079b38f7 Mon Sep 17 00:00:00 2001 From: mingli Date: Mon, 16 Dec 2013 15:58:55 +0800 Subject: GPU Calc:Fix the accuracy problem of 'Harmean' AMLOEXT-366 Change-Id: Ic368b8301c4e80ad76e1d0b33b69bee6a87b9d89 Signed-off-by: haochen Signed-off-by: Wei Wei Signed-off-by: I-Jui (Ray) Sung --- sc/source/core/opencl/op_statistical.cxx | 49 +++++++++++++++++++------------- 1 file changed, 30 insertions(+), 19 deletions(-) (limited to 'sc') 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(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="<GetFormulaToken(); + FormulaToken *pCur = vSubArguments[i]->GetFormulaToken(); assert(pCur); if (pCur->GetType() == formula::svDoubleVectorRef) { const formula::DoubleVectorRefToken* pDVR = dynamic_cast(pCur); - nCurWindowSize = pDVR->GetRefRowSize(); + size_t nCurWindowSize = pDVR->GetRefRowSize(); + ss << " length="<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 << "}"; } -- cgit