diff options
author | haochen <haochen@multicorewareinc.com> | 2013-10-25 20:38:04 +0800 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@collabora.com> | 2013-10-29 17:00:27 -0400 |
commit | d0cfbf8871ef6e9a3ebe14ce143b4887389a46f2 (patch) | |
tree | 645de62a8943c4cbbd6261a5273dd368bcf804ad /sc | |
parent | c45c29a6037dc3d9065666b38309dee352122925 (diff) |
Fix NAN argumetn in ground_water, stock_history, sum_ex
Change-Id: I10eae800889cd25e819720861a30e6b5edaca88b
Signed-off-by: Wei Wei <weiwei@multicorewareinc.com>
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/core/opencl/formulagroupcl.cxx | 137 |
1 files changed, 125 insertions, 12 deletions
diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx index 3b06b30fdd30..784e6226da49 100644 --- a/sc/source/core/opencl/formulagroupcl.cxx +++ b/sc/source/core/opencl/formulagroupcl.cxx @@ -296,36 +296,113 @@ public: ss << ") {\n\t"; ss << "double tmp = " << GetBottom() <<";\n\t"; ss << "int gid0 = get_global_id(0);\n\t"; + ss << "int nCount = 0;\n\t"; + ss << "double tmpBottom;\n\t"; unsigned i = vSubArguments.size(); size_t nItems = 0; while (i--) { FormulaToken *pCur = vSubArguments[i]->GetFormulaToken(); assert(pCur); - if (const formula::DoubleVectorRefToken* pCurDVR = - dynamic_cast<const formula::DoubleVectorRefToken *>(pCur)) + if (pCur->GetType() == formula::svDoubleVectorRef) { - size_t nCurWindowSize = pCurDVR->GetRefRowSize(); + const formula::DoubleVectorRefToken* pDVR = + dynamic_cast<const formula::DoubleVectorRefToken *>(pCur); + size_t nCurWindowSize = pDVR->GetRefRowSize(); ss << "for (int i = "; - if (!pCurDVR->IsStartFixed() && pCurDVR->IsEndFixed()) { - ss << "gid0; i < "<< nCurWindowSize <<"; i++)\n\t\t"; - } else if (pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()) { - ss << "0; i < gid0+"<< nCurWindowSize <<"; i++)\n\t\t"; - } else { - ss << "0; i < "<< nCurWindowSize <<"; i++)\n\t\t"; + if (!pDVR->IsStartFixed() && pDVR->IsEndFixed()) { +#ifdef ISNAN + ss << "gid0; i < " << pDVR->GetArrayLength(); + ss << " && i < " << nCurWindowSize << "; i++){\n\t\t"; +#else + ss << "gid0; i < "<< nCurWindowSize << "; i++)\n\t\t"; +#endif + } else if (pDVR->IsStartFixed() && !pDVR->IsEndFixed()) { +#ifdef ISNAN + ss << "0; i < " << pDVR->GetArrayLength(); + ss << " && i < gid0+"<< nCurWindowSize << "; i++){\n\t\t"; +#else + ss << "0; i < gid0+"<< nCurWindowSize << "; i++)\n\t\t"; +#endif + } else if (!pDVR->IsStartFixed() && !pDVR->IsEndFixed()){ +#ifdef ISNAN + ss << "0; i + gid0 < " << pDVR->GetArrayLength(); + ss << " && i < "<< nCurWindowSize << "; i++){\n\t\t"; +#else + ss << "0; i < "<< nCurWindowSize << "; i++)\n\t\t"; +#endif + } + else { +#ifdef ISNAN + ss << "0; i < "<< nCurWindowSize << "; i++){\n\t\t"; +#else + ss << "0; i < "<< nCurWindowSize << "; i++)\n\t\t"; +#endif } nItems += nCurWindowSize; - } else { + } + else if (pCur->GetType() == formula::svSingleVectorRef) + { +#ifdef ISNAN + const formula::SingleVectorRefToken* pSVR = + dynamic_cast< const formula::SingleVectorRefToken* >(pCur); + ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n\t\t"; +#else nItems += 1; +#endif } + else if (pCur->GetType() == formula::svDouble) + { +#ifdef ISNAN + ss << "{\n\t\t"; +#endif + nItems += 1; + } + else + { +#ifdef ISNAN + ss << "nCount += 1;\n\t\t"; +#endif + nItems += 1; + } +#ifdef ISNAN + if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) + { + ss << "tmpBottom = " << GetBottom() << ";\n\t\t"; + ss << "if (isNan("; + ss << vSubArguments[i]->GenSlidingWindowDeclRef(); + ss << "))\n\t\t\t"; + ss << "tmp = "; + ss << Gen2("tmpBottom", "tmp") << ";\n\t\t"; + ss << "else{\n\t\t\t"; + ss << "tmp = "; + ss << Gen2(vSubArguments[i]->GenSlidingWindowDeclRef(), "tmp"); + ss << ";\n\t\t\t"; + ss << "nCount += 1;\n\t\t"; + ss << "}\n\t"; + ss << "}\n\t"; + } + else + { + ss << "tmp = "; + ss << Gen2(vSubArguments[i]->GenSlidingWindowDeclRef(), "tmp"); + ss << ";\n\t"; + } +#else ss << "tmp = "; // Generate the operation in binary form ss << Gen2(vSubArguments[i]->GenSlidingWindowDeclRef(), "tmp"); ss << ";\n\t"; +#endif } ss << "return tmp"; +#ifdef ISNAN + if (isAverage()) + ss << "/(double)nCount"; +#else if (isAverage()) ss << "/(double)"<<nItems; +#endif ss << ";\n}"; } virtual bool isAverage() const { return false; } @@ -377,15 +454,47 @@ public: ss << ") {\n\t"; ss << "double tmp = 0.0;\n\t"; ss << "int gid0 = get_global_id(0);\n\t"; - ss << "for (int i = 0; i <" << nCurWindowSize << "; i++)\n\t\t"; + ss << "for (int i = 0; i <" << nCurWindowSize << "; i++){\n\t\t"; + ss << "int currentCount = i+gid0+1;\n"; ss << "tmp += "; for (unsigned i = 0; i < vSubArguments.size(); i++) { if (i) ss << "*"; +#ifdef ISNAN + if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) + { + ss <<"("; + ss <<"(currentCount>"; + if(vSubArguments[i]->GetFormulaToken()->GetType() == + formula::svSingleVectorRef) + { + const formula::SingleVectorRefToken* pSVR = + dynamic_cast< const formula::SingleVectorRefToken*> + (vSubArguments[i]->GetFormulaToken()); + ss<<pSVR->GetArrayLength(); + } + else if(vSubArguments[i]->GetFormulaToken()->GetType() == + formula::svDoubleVectorRef) + { + const formula::DoubleVectorRefToken* pSVR = + dynamic_cast< const formula::DoubleVectorRefToken*> + (vSubArguments[i]->GetFormulaToken()); + ss<<pSVR->GetArrayLength(); + } + ss << ")&&isNan("<<vSubArguments[i] + ->GenSlidingWindowDeclRef(true); + ss << ")?0:"; + ss << vSubArguments[i]->GenSlidingWindowDeclRef(true); + ss << ")"; + } + else + ss << vSubArguments[i]->GenSlidingWindowDeclRef(true); +#else ss << vSubArguments[i]->GenSlidingWindowDeclRef(true); +#endif } - ss << ";\n\t"; + ss << ";\n\t}\n\t"; ss << "return tmp;\n"; ss << "}"; } @@ -408,7 +517,11 @@ public: virtual std::string Gen2(const std::string &lhs, const std::string &rhs) const { std::stringstream ss; +#ifdef ISNAN + ss << "(0 =="<< lhs << ")? tmp : (" << rhs<<"+1.0)"; +#else ss << "(isNan(" << lhs << ")?"<<rhs<<":"<<rhs<<"+1.0)"; +#endif return ss.str(); } virtual std::string BinFuncName(void) const { return "fcount"; } |