summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWei Wei <weiwei@multicorewareinc.com>2013-12-17 16:23:42 -0600
committerI-Jui (Ray) Sung <ray@multicorewareinc.com>2013-12-18 20:34:50 -0600
commitc0d1c49bba7c0cb58c61e55671aeb1ee026467af (patch)
tree6616f0ed5dc8866b3d0cab2e270a973264a72c3d
parent79a3ec433e03e5e13f0c1adfb72ed2aa4ddd53dc (diff)
GPU Calc: optimize CHIDIST
Change-Id: Icac5dcb2615854ead9c3e15163ad2925c7ad0e96 Signed-off-by: I-Jui (Ray) Sung <ray@multicorewareinc.com>
-rw-r--r--sc/source/core/opencl/op_statistical.cxx118
1 files changed, 88 insertions, 30 deletions
diff --git a/sc/source/core/opencl/op_statistical.cxx b/sc/source/core/opencl/op_statistical.cxx
index a35071c041b0..589c7047db6a 100644
--- a/sc/source/core/opencl/op_statistical.cxx
+++ b/sc/source/core/opencl/op_statistical.cxx
@@ -5834,40 +5834,98 @@ void OpChiDist::GenSlidingWindowFunction(
}
ss << ")\n";
ss << "{\n";
- ss << " double fx,fDF,tmp;\n";
+ ss << " double fx,fDF,tmp=0,tmp0=0,tmp1=0;\n";
ss << " int gid0=get_global_id(0);\n";
-#ifdef ISNAN
- FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
- const formula::SingleVectorRefToken*tmpCurDVR0= dynamic_cast<const
- formula::SingleVectorRefToken *>(tmpCur0);
- FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
- const formula::SingleVectorRefToken*tmpCurDVR1= dynamic_cast<const
- formula::SingleVectorRefToken *>(tmpCur1);
- ss << " int buffer_fx_len = ";
- ss << tmpCurDVR0->GetArrayLength();
- ss << ";\n";
- ss << " int buffer_fDF_len = ";
- ss << tmpCurDVR1->GetArrayLength();
- ss << ";\n";
+
+ size_t i = vSubArguments.size();
+ size_t nItems = 0;
+ ss <<"\n";
+ for (i = 0; i < vSubArguments.size(); i++)
+ {
+ FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
+ assert(pCur);
+ 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";
+#else
+ ss << "gid0; i < "<< nCurWindowSize << "; i++)\n";
#endif
-#ifdef ISNAN
- ss <<" if((gid0)>=buffer_fx_len || isNan(";
- ss << vSubArguments[0]->GenSlidingWindowDeclRef();
- ss <<"))\n";
- ss <<" fx = 0;\n";
- ss <<" else \n";
+ }
+ else if (pDVR->IsStartFixed() && !pDVR->IsEndFixed())
+ {
+#ifdef ISNAN
+ ss << "0; i < " << pDVR->GetArrayLength();
+ ss << " && i < gid0+"<< nCurWindowSize << "; i++){\n";
+#else
+ ss << "0; i < gid0+"<< nCurWindowSize << "; i++)\n";
#endif
- ss <<" fx ="<<vSubArguments[0]->GenSlidingWindowDeclRef();
- ss << ";\n";
-#ifdef ISNAN
- ss <<" if((gid0)>=buffer_fDF_len || isNan(";
- ss << vSubArguments[1]->GenSlidingWindowDeclRef();
- ss <<"))\n";
- ss <<" fDF = 0;\n";
- ss <<" else \n";
+ }
+ else if (!pDVR->IsStartFixed() && !pDVR->IsEndFixed())
+ {
+#ifdef ISNAN
+ ss << "0; i + gid0 < " << pDVR->GetArrayLength();
+ ss << " && i < "<< nCurWindowSize << "; i++){\n";
+#else
+ ss << "0; i < "<< nCurWindowSize << "; i++)\n";
#endif
- ss <<" fDF ="<<vSubArguments[1]->GenSlidingWindowDeclRef();
- ss <<";\n";
+ }
+ else
+ {
+#ifdef ISNAN
+ ss << "0; i < "<< nCurWindowSize << "; i++){\n";
+#else
+ ss << "0; i < "<< nCurWindowSize << "; i++)\n";
+#endif
+ }
+ nItems += nCurWindowSize;
+ }
+ else if (pCur->GetType() == formula::svSingleVectorRef)
+ {
+#ifdef ISNAN
+ const formula::SingleVectorRefToken* pSVR =
+ dynamic_cast< const formula::SingleVectorRefToken* >(pCur);
+ ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n";
+#else
+ nItems += 1;
+#endif
+ }
+ else if (pCur->GetType() == formula::svDouble)
+ {
+#ifdef ISNAN
+ ss << "{\n";
+#endif
+ nItems += 1;
+ }
+ else
+ {
+#ifdef ISNAN
+#endif
+ nItems += 1;
+ }
+#ifdef ISNAN
+ if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
+ {
+ ss << " if (isNan(";
+ ss << vSubArguments[i]->GenSlidingWindowDeclRef();
+ ss << "))\n";
+ ss << " tmp"<<i<<"= 0;\n";
+ ss << " else\n";
+ ss << " tmp"<<i<<"=\n";
+ ss << vSubArguments[i]->GenSlidingWindowDeclRef();
+ ss << ";\n}\n";
+ }
+#endif
+ }
+ ss << " fx = tmp0;\n";
+ ss << " fDF = floor(tmp1);\n";
ss << " if(fDF < 1.0)\n";
ss << " {\n";
ss << " return DBL_MIN;\n";