summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshiming zhang <shiming@multicorewareinc.com>2013-12-16 11:43:55 +0800
committerI-Jui (Ray) Sung <ray@multicorewareinc.com>2013-12-19 17:54:01 -0600
commit07566812ebf152dfc760091ab391bc89c993c4d7 (patch)
tree446b86954f82753ceb52e8229f2e5fdc83b7a574
parent6595a7bdbb8048d3b4221b053d2664fb13aa1554 (diff)
GPU Calc: implemented STDEVA
AMLOEXT-220 FIX Change-Id: I93bf659a31835c8e4ecaf63f473ad2ffc22a7566 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/formulagroupcl.cxx4
-rw-r--r--sc/source/core/opencl/op_statistical.cxx421
-rw-r--r--sc/source/core/opencl/op_statistical.hxx9
3 files changed, 434 insertions, 0 deletions
diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx
index f2dea68168d0..2cad226d0c25 100644
--- a/sc/source/core/opencl/formulagroupcl.cxx
+++ b/sc/source/core/opencl/formulagroupcl.cxx
@@ -2569,6 +2569,10 @@ DynamicKernelSoPArguments::DynamicKernelSoPArguments(
mvSubArguments.push_back(SoPHelper(ts,
ft->Children[i], new OpVarPA));
break;
+ case ocStDevA:
+ mvSubArguments.push_back(SoPHelper(ts,
+ ft->Children[i], new OpStDevA));
+ break;
case ocExternal:
if ( !(pChild->GetExternal().compareTo(OUString(
"com.sun.star.sheet.addin.Analysis.getEffect"))))
diff --git a/sc/source/core/opencl/op_statistical.cxx b/sc/source/core/opencl/op_statistical.cxx
index 3068d8a089b2..6061d88e51b5 100644
--- a/sc/source/core/opencl/op_statistical.cxx
+++ b/sc/source/core/opencl/op_statistical.cxx
@@ -10405,6 +10405,427 @@ void OpVarPA::GenSlidingWindowFunction(std::stringstream &ss,
ss << " return vSum * pow(fCount,-1.0);\n";
ss << "}\n";
}
+void OpStDevA::GenSlidingWindowFunction(std::stringstream &ss,
+ const std::string sSymName, SubArguments &vSubArguments)
+{
+ int isMixedDV = 0;
+ int isMixedSV = 0;
+ ss << "\ndouble " << sSymName;
+ ss << "_" << BinFuncName() << "(";
+ for (unsigned i = 0; i < vSubArguments.size(); i++)
+ {
+ if (i)
+ ss << ",";
+ vSubArguments[i]->GenSlidingWindowDecl(ss);
+ }
+ ss << "){\n";
+ ss << " int gid0 = get_global_id(0);\n";
+ ss << " double fSum = 0.0;\n";
+ ss << " double fMean = 0.0;\n";
+ ss << " double vSum = 0.0;\n";
+ ss << " double fCount = 0.0;\n";
+ ss << " double arg = 0.0;\n";
+ unsigned i = vSubArguments.size();
+ while (i--)
+ {
+ FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
+ assert(pCur);
+
+ if(ocPush == vSubArguments[i]->GetFormulaToken()->GetOpCode())
+ {
+ if (pCur->GetType() == formula::svDoubleVectorRef)
+ {
+ const formula::DoubleVectorRefToken* pDVR =
+ dynamic_cast<const formula::DoubleVectorRefToken *>(pCur);
+ if(pDVR->GetArrays()[0].mpNumericArray
+ && pDVR->GetArrays()[0].mpStringArray)
+ isMixedDV = svDoubleVectorRefDoubleString;
+ else if(pDVR->GetArrays()[0].mpNumericArray)
+ isMixedDV = svDoubleVectorRefDouble;
+ else if(pDVR->GetArrays()[0].mpStringArray)
+ isMixedDV = svDoubleVectorRefString;
+ else
+ isMixedDV = svDoubleVectorRefNULL;
+
+ size_t nCurWindowSize = pDVR->GetRefRowSize();
+ ss << " for (int i = ";
+ if (!pDVR->IsStartFixed() && pDVR->IsEndFixed())
+ {
+#ifdef ISNAN
+ ss << "gid0; i < " << pDVR->GetArrayLength();
+ ss << " && i < " << nCurWindowSize << "; i++)\n";
+ ss << " {\n";
+#else
+ ss << "gid0; i < " << nCurWindowSize << "; i++)\n";
+ ss << " {\n";
+#endif
+ }
+ else if (pDVR->IsStartFixed() && !pDVR->IsEndFixed())
+ {
+#ifdef ISNAN
+ ss << "0; i < " << pDVR->GetArrayLength();
+ ss << " && i < gid0+" << nCurWindowSize << "; i++)\n";
+ ss << " {\n";
+#else
+ ss << "0; i < gid0+" << nCurWindowSize << "; i++)\n";
+ ss << " {\n";
+#endif
+ }
+ else if (!pDVR->IsStartFixed() && !pDVR->IsEndFixed())
+ {
+#ifdef ISNAN
+ ss << "0; i + gid0 < " << pDVR->GetArrayLength();
+ ss << " && i < " << nCurWindowSize << "; i++)\n";
+ ss << " {\n";
+#else
+ ss << "0; i < " << nCurWindowSize << "; i++)\n";
+ ss << " {\n";
+#endif
+ }
+ else
+ {
+#ifdef ISNAN
+ ss << "0; i < " << pDVR->GetArrayLength() << "; i++)\n";
+ ss << " {\n";
+#else
+ ss << "0; i < " << pDVR->GetArrayLength() << "; i++)\n";
+ ss << " {\n";
+#endif
+ }
+
+ if(isMixedDV == svDoubleVectorRefDoubleString)
+ {
+ ss << " arg = ";
+ ss << vSubArguments[i]->GenDoubleSlidingWindowDeclRef();
+ ss << ";\n";
+#ifdef ISNAN
+ ss << " if (isNan(arg) && ";
+ ss << vSubArguments[i]->GenStringSlidingWindowDeclRef();
+ ss << " == 0)\n";
+ ss << " continue;\n";
+ ss << " if(isNan(arg) && ";
+ ss << vSubArguments[i]->GenStringSlidingWindowDeclRef();
+ ss << " != 0)\n";
+ ss << " {\n";
+ ss << " fCount = fCount + 1.0;\n";
+ ss << " continue;\n";
+ ss << " }\n";
+#endif
+ ss << " fSum += arg;\n";
+ ss << " fCount = fCount + 1.0;\n";
+ ss << " }\n";
+ }
+ else if(isMixedDV == svDoubleVectorRefDouble)
+ {
+ ss << " arg = ";
+ ss << vSubArguments[i]->GenSlidingWindowDeclRef();
+ ss << ";\n";
+#ifdef ISNAN
+ ss << " if (isNan(arg))\n";
+ ss << " continue;\n";
+#endif
+ ss << " fSum += arg;\n";
+ ss << " fCount = fCount + 1.0;\n";
+ ss << " }\n";
+ }
+ else if(isMixedDV == svDoubleVectorRefString)
+ {
+ ss << " if (";
+ ss << vSubArguments[i]->GenSlidingWindowDeclRef();
+ ss << " == 0)\n";
+ ss << " continue;\n";
+ ss << " fCount = fCount + 1.0;\n";
+ ss << " }\n";
+ }
+ else
+ {
+ ss << " continue;\n";
+ ss << " }\n";
+ }
+
+ }
+ else if (pCur->GetType() == formula::svSingleVectorRef)
+ {
+ const formula::SingleVectorRefToken* pSVR =
+ dynamic_cast< const formula::SingleVectorRefToken* >(pCur);
+ assert(pSVR);
+ if(pSVR->GetArray().mpNumericArray
+ && pSVR->GetArray().mpStringArray)
+ isMixedSV = svSingleVectorRefDoubleString;
+ else if(pSVR->GetArray().mpNumericArray)
+ isMixedSV = svSingleVectorRefDouble;
+ else if(pSVR->GetArray().mpStringArray)
+ isMixedSV = svSingleVectorRefString;
+ else
+ isMixedSV = svSingleVectorRefNULL;
+
+ if(isMixedSV == svSingleVectorRefDoubleString)
+ {
+#ifdef ISNAN
+ ss << " if (gid0 < " << pSVR->GetArrayLength() << ")\n";
+ ss << " {\n";
+#endif
+ ss << " arg = ";
+ ss << vSubArguments[i]->GenDoubleSlidingWindowDeclRef();
+ ss << ";\n";
+#ifdef ISNAN
+ ss << " if (!isNan(arg))\n";
+ ss << " {\n";
+#endif
+ ss << " fSum += arg;\n";
+ ss << " fCount = fCount + 1.0;\n";
+#ifdef ISNAN
+ ss << " }\n";
+ ss << " if (isNan(arg) && ";
+ ss << vSubArguments[i]->GenStringSlidingWindowDeclRef();
+ ss << " != 0)\n";
+ ss << " fCount = fCount + 1.0;\n";
+ ss << " }\n";
+#endif
+ }
+ else if(isMixedSV == svSingleVectorRefDouble)
+ {
+#ifdef ISNAN
+ ss << " if (gid0 < " << pSVR->GetArrayLength() << ")\n";
+ ss << " {\n";
+#endif
+ ss << " arg = ";
+ ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
+#ifdef ISNAN
+ ss << " if (!isNan(arg))\n";
+ ss << " {\n";
+#endif
+ ss << " fSum += arg;\n";
+ ss << " fCount += 1.0;\n";
+#ifdef ISNAN
+ ss << " }\n";
+ ss << " }\n";
+#endif
+ }
+ else if(isMixedSV == svSingleVectorRefString)
+ {
+
+ ss << " if (gid0 < " << pSVR->GetArrayLength() << ")\n";
+ ss << " {\n";
+ ss << " if (";
+ ss << vSubArguments[i]->GenSlidingWindowDeclRef();
+ ss << " != 0)\n";
+ ss << " fCount = fCount + 1.0;\n";
+ ss << " }\n";
+ }
+ else
+ {
+ ss << " arg =0.0;\n";
+ }
+ }
+ else
+ {
+ ss << " arg = " << pCur->GetDouble() << ";\n";
+ ss << " fSum += arg;\n";
+ ss << " fCount = fCount + 1.0;\n";
+ }
+ }
+ else
+ {
+ ss << " arg = ";
+ ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
+ ss << " fSum += arg;\n";
+ ss << " fCount = fCount + 1.0;\n";
+ }
+ if (i == 0)
+ {
+ ss << " fMean = fSum * pow(fCount,-1.0);\n";
+ }
+ }
+ i = vSubArguments.size();
+ while (i--)
+ {
+ FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
+ assert(pCur);
+
+ if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
+ {
+ if (pCur->GetType() == formula::svDoubleVectorRef)
+ {
+ const formula::DoubleVectorRefToken* pDVR =
+ dynamic_cast<const formula::DoubleVectorRefToken *>(pCur);
+ size_t nCurWindowSize = pDVR->GetRefRowSize();
+ ss << " for (int i = ";
+ if (!pDVR->IsStartFixed() && pDVR->IsEndFixed())
+ {
+#ifdef ISNAN
+ ss << "gid0; i < " << pDVR->GetArrayLength();
+ ss << " && i < " << nCurWindowSize << "; i++)\n";
+ ss << " {\n";
+#else
+ ss << "gid0; i < " << nCurWindowSize << "; i++)\n";
+ ss << " {\n";
+#endif
+ }
+ else if (pDVR->IsStartFixed() && !pDVR->IsEndFixed())
+ {
+#ifdef ISNAN
+ ss << "0; i < " << pDVR->GetArrayLength();
+ ss << " && i < gid0+" << nCurWindowSize << "; i++)\n";
+ ss << " {\n";
+#else
+ ss << "0; i < gid0+" << nCurWindowSize << "; i++)\n";
+ ss << " {\n";
+#endif
+ }
+ else if (!pDVR->IsStartFixed() && !pDVR->IsEndFixed())
+ {
+#ifdef ISNAN
+ ss << "0; i + gid0 < " << pDVR->GetArrayLength();
+ ss << " && i < " << nCurWindowSize << "; i++)\n";
+ ss << " {\n";
+#else
+ ss << "0; i < " << nCurWindowSize << "; i++)\n";
+ ss << " {\n";
+#endif
+ }
+ else
+ {
+#ifdef ISNAN
+ ss << "0; i < " << pDVR->GetArrayLength() << "; i++)\n";
+ ss << " {\n";
+#else
+ ss << "0; i < " << pDVR->GetArrayLength() << "; i++)\n";
+ ss << " {\n";
+#endif
+ }
+ if(isMixedDV == svDoubleVectorRefDoubleString)
+ {
+ ss << " arg = ";
+ ss << vSubArguments[i]->GenDoubleSlidingWindowDeclRef();
+ ss << ";\n";
+#ifdef ISNAN
+ ss << " if (isNan(arg) && ";
+ ss << vSubArguments[i]->GenStringSlidingWindowDeclRef();
+ ss << " == 0)\n";
+ ss << " continue;\n";
+ ss << " if(isNan(arg) && ";
+ ss << vSubArguments[i]->GenStringSlidingWindowDeclRef();
+ ss << " != 0)\n";
+ ss << " arg = 0.0;\n";
+#endif
+ ss << " vSum += (arg - fMean) * (arg - fMean);\n";
+ ss << " }\n";
+
+ }
+ else if(isMixedDV == svDoubleVectorRefDouble)
+ {
+ ss << " arg = ";
+ ss << vSubArguments[i]->GenSlidingWindowDeclRef();
+ ss << ";\n";
+#ifdef ISNAN
+ ss << " if (isNan(arg))\n";
+ ss << " continue;\n";
+#endif
+ ss << " vSum += (arg - fMean) * (arg - fMean);\n";
+ ss << " }\n";
+
+ }
+ else if(isMixedDV == svDoubleVectorRefString)
+ {
+ ss << " if (";
+ ss << vSubArguments[i]->GenSlidingWindowDeclRef();
+ ss << " == 0)\n";
+ ss << " continue;\n";
+ ss << " arg = 0.0;\n";
+ ss << " vSum += (arg - fMean) * (arg - fMean);\n";
+ ss << " }\n";
+ }
+ else
+ {
+ ss << " continue;\n";
+ ss << " }\n";
+ }
+ }
+ else if (pCur->GetType() == formula::svSingleVectorRef)
+ {
+ const formula::SingleVectorRefToken* pSVR =
+ dynamic_cast< const formula::SingleVectorRefToken* >(pCur);
+ assert(pSVR);
+ if(isMixedSV == svSingleVectorRefDoubleString)
+ {
+#ifdef ISNAN
+ ss << " if (gid0 < " << pSVR->GetArrayLength() << ")\n";
+ ss << " {\n";
+#endif
+ ss << " arg = ";
+ ss << vSubArguments[i]->GenDoubleSlidingWindowDeclRef();
+ ss << ";\n";
+#ifdef ISNAN
+ ss << " if (!isNan(arg))\n";
+#endif
+ ss << " vSum += (arg - fMean)*(arg - fMean);\n";
+#ifdef ISNAN
+ ss << " if (isNan(arg) && ";
+ ss << vSubArguments[i]->GenStringSlidingWindowDeclRef();
+ ss << " != 0)\n";
+ ss << " {\n";
+ ss << " arg = 0.0;\n";
+ ss << " vSum += (arg - fMean)*(arg - fMean);\n";
+ ss << " }\n";
+ ss << " }\n";
+#endif
+ }
+ else if(isMixedSV == svSingleVectorRefDouble)
+ {
+#ifdef ISNAN
+ ss << " if (gid0 < " << pSVR->GetArrayLength() << ")\n";
+ ss << " {\n";
+#endif
+ ss << " arg = ";
+ ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
+#ifdef ISNAN
+ ss << " if (!isNan(arg))\n";
+ ss << " {\n";
+#endif
+ ss << " vSum += (arg - fMean)*(arg - fMean);\n";
+#ifdef ISNAN
+ ss << " }\n";
+ ss << " }\n";
+#endif
+ }
+ else if(isMixedSV == svSingleVectorRefString)
+ {
+ ss << " if (gid0 < " << pSVR->GetArrayLength() << ")\n";
+ ss << " {\n";
+ ss << " if (";
+ ss << vSubArguments[i]->GenSlidingWindowDeclRef();
+ ss << " != 0)\n";
+ ss << " {\n";
+ ss << " arg = 0.0;\n";
+ ss << " vSum += (arg - fMean)*(arg - fMean);\n";
+ ss << " }\n";
+ ss << " }\n";
+ }
+ else
+ {
+ ss << " arg = 0.0;\n";
+ }
+ }
+ else
+ {
+ ss << " arg = " << pCur->GetDouble() << ";\n";
+ ss << " vSum += (arg - fMean) * (arg - fMean);\n";
+ }
+ }
+ else
+ {
+ ss << " arg = ";
+ ss << vSubArguments[i]->GenSlidingWindowDeclRef() << ";\n";
+ ss << " vSum += (arg - fMean) * (arg - fMean);\n";
+ }
+ }
+ ss << " if (fCount <= 1.0)\n";
+ ss << " return DBL_MAX;\n";
+ ss << " else\n";
+ ss << " return sqrt(vSum * pow(fCount - 1.0,-1.0));\n";
+ ss << "}\n";
+}
}}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/core/opencl/op_statistical.hxx b/sc/source/core/opencl/op_statistical.hxx
index 3e3f1961d6ef..100cb07b55e7 100644
--- a/sc/source/core/opencl/op_statistical.hxx
+++ b/sc/source/core/opencl/op_statistical.hxx
@@ -514,6 +514,15 @@ public:
virtual bool takeString() const { return true; }
virtual bool takeNumeric() const { return true; }
};
+class OpStDevA: public Normal
+{
+public:
+ virtual void GenSlidingWindowFunction(std::stringstream &ss,
+ const std::string sSymName, SubArguments &vSubArguments);
+ virtual std::string BinFuncName(void) const { return "OpStDevA"; }
+ virtual bool takeString() const { return true; }
+ virtual bool takeNumeric() const { return true; }
+};
}}
#endif