summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorhaochen <haochen@multicorewareinc.com>2013-10-24 16:48:09 +0800
committerKohei Yoshida <kohei.yoshida@collabora.com>2013-10-29 17:00:20 -0400
commit2fc29f1114e974be290b3ca2eabd76995386d790 (patch)
treef29b570f878def75ccd77801920994590dd71ca9 /sc
parent639777b714b0cb0431d0c1720518ce4e7e47bb99 (diff)
Implement fix for CORREL in GPU Calc
Change-Id: I2dc3fde8b113a08e3a22482540a9eea1f7b2a297 Signed-off-by: Wei Wei <weiwei@multicorewareinc.com>
Diffstat (limited to 'sc')
-rw-r--r--sc/source/core/opencl/OP_Statistical.cxx211
-rw-r--r--sc/source/core/opencl/formulagroupcl.cxx4
2 files changed, 215 insertions, 0 deletions
diff --git a/sc/source/core/opencl/OP_Statistical.cxx b/sc/source/core/opencl/OP_Statistical.cxx
index 976b55f4a740..2f9b5c27494f 100644
--- a/sc/source/core/opencl/OP_Statistical.cxx
+++ b/sc/source/core/opencl/OP_Statistical.cxx
@@ -110,6 +110,217 @@ class OpGamma:public Normal{
}
virtual std::string BinFuncName(void) const { return "Gamma"; }
};
+class OpCorrel:public Normal{
+public:
+ virtual void GenSlidingWindowFunction(std::stringstream &ss,
+ const std::string sSymName, SubArguments &vSubArguments)
+ {
+ ss << "\ndouble " << sSymName;
+ ss << "_"<< BinFuncName() <<"(";
+ for (unsigned i = 0; i < vSubArguments.size(); i++)
+ {
+ if (i)
+ ss << ",";
+ vSubArguments[i]->GenSlidingWindowDecl(ss);
+ }
+ ss << ") {\n\t";
+ ss << "double vSum = 0.0;\n\t";
+ ss << "double vXSum = 0.0;\n\t";
+ ss << "double vYSum = 0.0;\n\t";
+ ss << "double vXMean = 0.0;\n\t";
+ ss << "double vYMean = 0.0;\n\t";
+
+ ss << "int gid0 = get_global_id(0);\n\t";
+ ss << "double arg0 = 0.0;\n\t";
+ ss << "double arg1 = 0.0;\n\t";
+ ss << "int cnt = 0;\n\t";
+
+ FormulaToken *pCurX = vSubArguments[0]->GetFormulaToken();
+ FormulaToken *pCurY = vSubArguments[1]->GetFormulaToken();
+ const formula::DoubleVectorRefToken* pCurDVRX =
+ dynamic_cast<const formula::DoubleVectorRefToken *>(pCurX);
+ const formula::DoubleVectorRefToken* pCurDVRY =
+ dynamic_cast<const formula::DoubleVectorRefToken *>(pCurY);
+ size_t nCurWindowSizeX = pCurDVRX->GetRefRowSize();
+ size_t nCurWindowSizeY = pCurDVRY->GetRefRowSize();
+ if(nCurWindowSizeX == nCurWindowSizeY)
+ {
+ ss << "for (int i = ";
+ if (!pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) {
+ ss << "gid0; i < " << nCurWindowSizeX << "; i++) {\n\t\t";
+ ss << "arg0 = " << vSubArguments[0]
+ ->GenSlidingWindowDeclRef() << ";\n\t\t";
+ ss << "arg1 = " << vSubArguments[1]
+ ->GenSlidingWindowDeclRef() << ";\n\t\t";
+#ifdef ISNAN
+ ss << "if(isNan(arg0) || isNan(arg1) || (i >= ";
+ ss << pCurDVRX->GetArrayLength() << ") || (i >=";
+ ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t";
+ ss << "arg0 = 0.0;\n\t\t\t";
+ ss << "arg1 = 0.0;\n\t\t\t";
+ ss << "--cnt;\n\t\t";
+ ss << "}\n\t\t";
+#endif
+ ss << "++cnt;\n\t\t";
+ ss << "vXSum += arg0;\n\t\t";
+ ss << "vYSum += arg1;\n\t";
+ ss << "}\n\t";
+ } else if (pCurDVRX->IsStartFixed() && !pCurDVRX->IsEndFixed()) {
+ ss << "0; i < gid0 + " << nCurWindowSizeX << "; i++) {\n\t\t";
+ ss << "arg0 = " << vSubArguments[0]
+ ->GenSlidingWindowDeclRef() << ";\n\t\t";
+ ss << "arg1 = " << vSubArguments[1]
+ ->GenSlidingWindowDeclRef() << ";\n\t\t";
+#ifdef ISNAN
+ ss << "if(isNan(arg0) || isNan(arg1) || (i >= ";
+ ss << pCurDVRX->GetArrayLength() << ") || (i >=";
+ ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t";
+ ss << "arg0 = 0.0;\n\t\t\t";
+ ss << "arg1 = 0.0;\n\t\t\t";
+ ss << "--cnt;\n\t\t";
+ ss << "}\n\t\t";
+#endif
+ ss << "++cnt;\n\t\t";
+ ss << "vXSum += arg0;\n\t\t";
+ ss << "vYSum += arg1;\n\t";
+ ss << "}\n\t";
+ }
+ else if (pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) {
+ ss << "0; i < " << nCurWindowSizeX << "; i++) {\n\t\t";
+ ss << "arg0 = " << vSubArguments[0]
+ ->GenSlidingWindowDeclRef() << ";\n\t\t";
+ ss << "arg1 = " << vSubArguments[1]
+ ->GenSlidingWindowDeclRef() << ";\n\t\t";
+#ifdef ISNAN
+ ss << "if(isNan(arg0) || isNan(arg1) || (i >= ";
+ ss << pCurDVRX->GetArrayLength() << ") || (i >=";
+ ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t";
+ ss << "arg0 = 0.0;\n\t\t\t";
+ ss << "arg1 = 0.0;\n\t\t\t";
+ ss << "--cnt;\n\t\t";
+ ss << "}\n\t\t";
+#endif
+ ss << "++cnt;\n\t\t";
+ ss << "vXSum += arg0;\n\t\t";
+ ss << "vYSum += arg1;\n\t";
+ ss << "}\n\t";
+ } else {
+ ss << "0; i < " << nCurWindowSizeX << "; i++) {\n\t\t";
+ ss << "arg0 = " << vSubArguments[0]
+ ->GenSlidingWindowDeclRef() << ";\n\t\t";
+ ss << "arg1 = " << vSubArguments[1]
+ ->GenSlidingWindowDeclRef() << ";\n\t\t";
+#ifdef ISNAN
+ ss << "if(isNan(arg0) || isNan(arg1) || (i + gid0 >= ";
+ ss << pCurDVRX->GetArrayLength() << ") || (i + gid0 >=";
+ ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t";
+ ss << "arg0 = 0.0;\n\t\t\t";
+ ss << "arg1 = 0.0;\n\t\t\t";
+ ss << "--cnt;\n\t\t";
+ ss << "}\n\t\t";
+#endif
+ ss << "++cnt;\n\t\t";
+ ss << "vXSum += arg0;\n\t\t";
+ ss << "vYSum += arg1;\n\t";
+ ss << "}\n\t";
+ }
+
+ ss << "if(cnt < 1) {\n\t\t";
+ ss << "return DBL_MIN;\n\t";
+ ss << "}\n\t";
+ ss << "else {\n\t\t";
+ ss << "vXMean = vXSum/cnt;\n\t\t";
+ ss << "vYMean = vYSum/cnt;\n\t\t";
+ ss << "vXSum = 0.0;\n\t\t";
+ ss << "vYSum = 0.0;\n\t\t";
+
+ ss << "for (int i = ";
+ if (!pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) {
+ ss << "gid0; i < " << nCurWindowSizeX << "; i++) {\n\t\t\t";
+ ss << "arg0 = " << vSubArguments[0]
+ ->GenSlidingWindowDeclRef() << ";\n\t\t\t";
+ ss << "arg1 = " << vSubArguments[1]
+ ->GenSlidingWindowDeclRef() << ";\n\t\t\t";
+#ifdef ISNAN
+ ss << "if(isNan(arg0) || isNan(arg1) || (i >= ";
+ ss << pCurDVRX->GetArrayLength() << ") || (i >=";
+ ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t\t";
+ ss << "arg0 = vXMean;\n\t\t\t\t";
+ ss << "arg1 = vYMean;\n\t\t\t";
+ ss << "}\n\t\t\t";
+#endif
+ ss << "vXSum += pow(arg0 - vXMean, 2);\n\t\t\t";
+ ss << "vYSum += pow(arg1 - vYMean, 2);\n\t\t\t";
+ ss << "vSum += (arg0 - vXMean)*(arg1 - vYMean);\n\t\t";
+ ss << "}\n\t\t";
+ } else if (pCurDVRX->IsStartFixed() && !pCurDVRX->IsEndFixed()) {
+ ss << "0; i < gid0 + " << nCurWindowSizeX << "; i++) {\n\t\t\t";
+ ss << "arg0 = " << vSubArguments[0]
+ ->GenSlidingWindowDeclRef() << ";\n\t\t\t";
+ ss << "arg1 = " << vSubArguments[1]
+ ->GenSlidingWindowDeclRef() << ";\n\t\t\t";
+#ifdef ISNAN
+ ss << "if(isNan(arg0) || isNan(arg1) || (i >= ";
+ ss << pCurDVRX->GetArrayLength() << ") || (i >=";
+ ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t\t";
+ ss << "arg0 = vXMean;\n\t\t\t\t";
+ ss << "arg1 = vYMean;\n\t\t\t";
+ ss << "}\n\t\t\t";
+#endif
+ ss << "vXSum += pow(arg0 - vXMean, 2);\n\t\t\t";
+ ss << "vYSum += pow(arg1 - vYMean, 2);\n\t\t\t";
+ ss << "vSum += (arg0 - vXMean)*(arg1 - vYMean);\n\t\t";
+ ss << "}\n\t\t";
+ } else if (pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) {
+ ss << "0; i < " << nCurWindowSizeX << "; i++) {\n\t\t\t";
+ ss << "arg0 = " << vSubArguments[0]
+ ->GenSlidingWindowDeclRef() << ";\n\t\t\t";
+ ss << "arg1 = " << vSubArguments[1]
+ ->GenSlidingWindowDeclRef() << ";\n\t\t\t";
+#ifdef ISNAN
+ ss << "if(isNan(arg0) || isNan(arg1) || (i >= ";
+ ss << pCurDVRX->GetArrayLength() << ") || (i >=";
+ ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t\t";
+ ss << "arg0 = vXMean;\n\t\t\t\t";
+ ss << "arg1 = vYMean;\n\t\t\t";
+ ss << "}\n\t\t\t";
+#endif
+ ss << "vXSum += pow(arg0 - vXMean, 2);\n\t\t\t";
+ ss << "vYSum += pow(arg1 - vYMean, 2);\n\t\t\t";
+ ss << "vSum += (arg0 - vXMean)*(arg1 - vYMean);\n\t\t";
+ ss << "}\n\t\t";
+ } else {
+ ss << "0; i < " << nCurWindowSizeX << "; i++) {\n\t\t\t";
+ ss << "arg0 = " << vSubArguments[0]
+ ->GenSlidingWindowDeclRef() << ";\n\t\t\t";
+ ss << "arg1 = " << vSubArguments[1]
+ ->GenSlidingWindowDeclRef() << ";\n\t\t\t";
+#ifdef ISNAN
+ ss << "if(isNan(arg0) || isNan(arg1) || (i + gid0 >= ";
+ ss << pCurDVRX->GetArrayLength() << ") || (i + gid0 >=";
+ ss << pCurDVRY->GetArrayLength() << ")) {\n\t\t\t\t";
+ ss << "arg0 = vXMean;\n\t\t\t\t";
+ ss << "arg1 = vYMean;\n\t\t\t";
+ ss << "}\n\t\t\t";
+#endif
+ ss << "vXSum += ((arg0 - vXMean)*(arg0 - vXMean));\n\t\t\t";
+ ss << "vYSum += ((arg1 - vYMean)*(arg1 - vYMean));\n\t\t\t";
+ ss << "vSum += (arg0 - vXMean)*(arg1 - vYMean);\n\t\t";
+ ss << "}\n\t\t";
+ }
+
+ ss << "if(vXSum == 0.0 || vYSum == 0.0) {\n\t\t\t";
+ ss << "return DBL_MIN;\n\t\t";
+ ss << "}\n\t\t";
+ ss << "else {\n\t\t\t";
+ ss << "return vSum/pow(vXSum*vYSum, 0.5);\n\t\t";
+ ss << "}\n\t";
+ ss << "}\n";
+ ss << "}";
+ }
+ }
+ virtual std::string BinFuncName(void) const { return "Correl"; }
+};
class OpGammaLn:public Normal{
public:
diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx
index d44679778b4a..bc4c83357145 100644
--- a/sc/source/core/opencl/formulagroupcl.cxx
+++ b/sc/source/core/opencl/formulagroupcl.cxx
@@ -799,6 +799,10 @@ DynamicKernelSoPArguments<Op>::DynamicKernelSoPArguments(const std::string &s,
mvSubArguments.push_back(SoPHelper<OpSYD>(ts,
ft->Children[i]));
break;
+ case ocCorrel:
+ mvSubArguments.push_back(SoPHelper<OpCorrel>(ts,
+ ft->Children[i]));
+ break;
case ocExternal:
if ( !(pChild->GetExternal().compareTo(OUString(
"com.sun.star.sheet.addin.Analysis.getEffect"))))