sc/qa/unit/data/xls/opencl/logical/not.xls |binary sc/qa/unit/data/xls/opencl/logical/xor.xls |binary sc/qa/unit/opencl-test.cxx | 5 sc/source/core/opencl/op_statistical.cxx | 612 ++++++++++++++++------------- 4 files changed, 357 insertions(+), 260 deletions(-)
New commits: commit 3d0152ba5f551e23b3de5a32e0c45e9d73f482ed Author: Wei Wei <[email protected]> Date: Wed Dec 18 16:34:56 2013 -0600 GPU Calc: remove the warning; shrink the test case number for XOR and NOT Change-Id: Ib184aa27a4bd4553886fb9422c937dac9c053a4e Signed-off-by: I-Jui (Ray) Sung <[email protected]> diff --git a/sc/qa/unit/data/xls/opencl/logical/not.xls b/sc/qa/unit/data/xls/opencl/logical/not.xls index 651a8f9..7cd86a0 100644 Binary files a/sc/qa/unit/data/xls/opencl/logical/not.xls and b/sc/qa/unit/data/xls/opencl/logical/not.xls differ diff --git a/sc/qa/unit/data/xls/opencl/logical/xor.xls b/sc/qa/unit/data/xls/opencl/logical/xor.xls index fccba9b..7737727 100644 Binary files a/sc/qa/unit/data/xls/opencl/logical/xor.xls and b/sc/qa/unit/data/xls/opencl/logical/xor.xls differ diff --git a/sc/qa/unit/opencl-test.cxx b/sc/qa/unit/opencl-test.cxx index 9d28359..09c8a48 100644 --- a/sc/qa/unit/opencl-test.cxx +++ b/sc/qa/unit/opencl-test.cxx @@ -4942,7 +4942,7 @@ void ScOpenclTest:: testLogicalFormulaNot() ScDocShellRef xDocShRes = loadDoc("opencl/logical/not.", XLS); ScDocument *pDocRes = xDocShRes->GetDocument(); CPPUNIT_ASSERT(pDocRes); - for (SCROW i = 0; i < 30000; ++i) + for (SCROW i = 0; i < 3000; ++i) { double fLibre = pDoc->GetValue(ScAddress(1, i, 0)); double fExcel = pDocRes->GetValue(ScAddress(1, i, 0)); @@ -4964,7 +4964,7 @@ void ScOpenclTest:: testLogicalFormulaXor() ScDocShellRef xDocShRes = loadDoc("opencl/logical/xor.", XLS); ScDocument *pDocRes = xDocShRes->GetDocument(); CPPUNIT_ASSERT(pDocRes); - for (SCROW i = 0; i < 30000; ++i) + for (SCROW i = 0; i < 3000; ++i) { double fLibre = pDoc->GetValue(ScAddress(1, i, 0)); double fExcel = pDocRes->GetValue(ScAddress(1, i, 0)); diff --git a/sc/source/core/opencl/op_statistical.cxx b/sc/source/core/opencl/op_statistical.cxx index 47c5ccf..c3b8a5d 100644 --- a/sc/source/core/opencl/op_statistical.cxx +++ b/sc/source/core/opencl/op_statistical.cxx @@ -3798,7 +3798,7 @@ void OpPearson::GenSlidingWindowFunction( ss <<"\n"; for (i = 0; i < vSubArguments.size(); i++) { - FormulaToken *pCur = vSubArguments[i]->GetFormulaToken(); + pCur = vSubArguments[i]->GetFormulaToken(); assert(pCur); if (pCur->GetType() == formula::svDoubleVectorRef) { @@ -4066,7 +4066,7 @@ vSubArguments) ss << " double tmp = 0;\n"; for (unsigned i = 0; i < vSubArguments.size(); i++) { - FormulaToken *pCur = vSubArguments[i]->GetFormulaToken(); + pCur = vSubArguments[i]->GetFormulaToken(); assert(pCur); if (pCur->GetType() == formula::svDoubleVectorRef) { @@ -4334,13 +4334,13 @@ void OpRsq::GenSlidingWindowFunction( ss <<"\n"; for (i = 0; i < vSubArguments.size(); i++) { - FormulaToken *pCur = vSubArguments[i]->GetFormulaToken(); + 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(); + nCurWindowSize = pDVR->GetRefRowSize(); ss << "for (int i = "; if (!pDVR->IsStartFixed() && pDVR->IsEndFixed()) { #ifdef ISNAN @@ -5354,13 +5354,13 @@ void OpKurt:: GenSlidingWindowFunction(std::stringstream &ss, ss << " double tmp = 0;\n"; for (unsigned i = 0; i < vSubArguments.size(); i++) { - FormulaToken *pCur = vSubArguments[i]->GetFormulaToken(); + 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(); + nCurWindowSize = pDVR->GetRefRowSize(); ss << " for (int i = 0; i <" << nCurWindowSize; ss << "; i++)\n"; ss << " {\n"; commit ef25611384dc4fe872a6b31806fea668f9ab645d Author: hongyu zhong <[email protected]> Date: Tue Dec 10 10:50:49 2013 +0800 GPU Calc: Optimized NORMDIST AMLOEXT-284 Change-Id: I5028ebbee91d6c7a64e9993b97b5f942f039d92c Signed-off-by: haochen <[email protected]> Signed-off-by: Wei Wei <[email protected]> Signed-off-by: I-Jui (Ray) Sung <[email protected]> diff --git a/sc/source/core/opencl/op_statistical.cxx b/sc/source/core/opencl/op_statistical.cxx index d818062..47c5ccf 100644 --- a/sc/source/core/opencl/op_statistical.cxx +++ b/sc/source/core/opencl/op_statistical.cxx @@ -4600,70 +4600,56 @@ void OpNormdist::GenSlidingWindowFunction( ss << "{\n"; ss << " double x,mue,sigma,c;\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); - FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken(); - const formula::SingleVectorRefToken*tmpCurDVR2= dynamic_cast<const - formula::SingleVectorRefToken *>(tmpCur2); - FormulaToken *tmpCur3 = vSubArguments[3]->GetFormulaToken(); - const formula::SingleVectorRefToken*tmpCurDVR3= dynamic_cast<const - formula::SingleVectorRefToken *>(tmpCur3); - ss << " int buffer_x_len = "; - ss << tmpCurDVR0->GetArrayLength(); - ss << ";\n"; - ss << " int buffer_mue_len = "; - ss << tmpCurDVR1->GetArrayLength(); - ss << ";\n"; - ss << " int buffer_sigma_len = "; - ss << tmpCurDVR2->GetArrayLength(); - ss << ";\n"; - ss << " int buffer_c_len = "; - ss << tmpCurDVR3->GetArrayLength(); - ss << ";\n"; -#endif -#ifdef ISNAN - ss <<"if((gid0)>=buffer_c_len || isNan("; - ss << vSubArguments[3]->GenSlidingWindowDeclRef(); - ss <<"))\n"; - ss <<" c = 0;\nelse \n"; -#endif - ss << " c = "<<vSubArguments[3]->GenSlidingWindowDeclRef(); - ss << ";\n"; -#ifdef ISNAN - ss <<"if((gid0)>=buffer_sigma_len || isNan("; - ss << vSubArguments[2]->GenSlidingWindowDeclRef(); - ss <<"))\n"; - ss <<" sigma = 0;\nelse \n"; + ss << " double tmp0,tmp1,tmp2,tmp3;\n"; + size_t i = vSubArguments.size(); + ss <<"\n "; + for (i = 0; i < vSubArguments.size(); i++) + { + FormulaToken *pCur = vSubArguments[i]->GetFormulaToken(); + assert(pCur); + if (pCur->GetType() == formula::svSingleVectorRef) + { +#ifdef ISNAN + const formula::SingleVectorRefToken* pSVR = + dynamic_cast< const formula::SingleVectorRefToken* >(pCur); + ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n"; #endif - ss <<" sigma = "<<vSubArguments[2]->GenSlidingWindowDeclRef(); - ss <<";\n"; -#ifdef ISNAN - ss <<" if((gid0)>=buffer_mue_len || isNan("; - ss << vSubArguments[1]->GenSlidingWindowDeclRef(); - ss <<"))\n"; - ss <<" mue = 0;\nelse \n"; + } + else if (pCur->GetType() == formula::svDouble) + { +#ifdef ISNAN + ss << "{\n"; #endif - ss <<" mue = "<<vSubArguments[1]->GenSlidingWindowDeclRef(); - ss <<";\n"; -#ifdef ISNAN - ss<<" if((gid0)>=buffer_x_len || isNan("; - ss << vSubArguments[0]->GenSlidingWindowDeclRef(); - ss<<"))\n"; - ss<<" x = 0;\nelse \n"; + } +#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"; + } + else + { + ss << "tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef(); + ss <<";\n"; + } #endif - ss <<" x = "<<vSubArguments[0]->GenSlidingWindowDeclRef(); - ss << ";\n"; + } + ss << "x = tmp0;\n"; + ss << "mue = tmp1;\n"; + ss << "sigma = tmp2;\n"; + ss << "c = tmp3;\n"; ss << "double mid,tmp;\n"; ss << "mid = (x - mue)/sigma;\n"; ss << "if(c)\n"; ss << " tmp = 0.5 *erfc(-mid * 0.7071067811865475);\n"; ss << "else \n"; - ss <<" tmp=(0.39894228040143268*exp(-(mid * mid)/2.0))/sigma;\n"; + ss <<" tmp=(0.39894228040143268*exp(-pow(mid,2)/2.0))/sigma;\n"; ss << "return tmp;\n"; ss << "}\n"; } commit d5dac04897ca6953c72f7d4563c7f7ffd9c962c4 Author: hongyu zhong <[email protected]> Date: Tue Dec 10 10:53:41 2013 +0800 GPU Calc: Optimized NORMINV AMLOEXT-285 Change-Id: I362d51a2e1dd750dfbafc7a8830c4a8b7611daed Signed-off-by: haochen <[email protected]> Signed-off-by: Wei Wei <[email protected]> Signed-off-by: I-Jui (Ray) Sung <[email protected]> diff --git a/sc/source/core/opencl/op_statistical.cxx b/sc/source/core/opencl/op_statistical.cxx index 4af1fd3..d818062 100644 --- a/sc/source/core/opencl/op_statistical.cxx +++ b/sc/source/core/opencl/op_statistical.cxx @@ -4868,58 +4868,59 @@ void OpNorminv::GenSlidingWindowFunction( ss << "{\n"; ss <<" double q,t,z;\n"; ss <<" double x,mue,sigma;\n"; + ss <<" double tmp0,tmp1,tmp2;\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); - FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken(); - const formula::SingleVectorRefToken*tmpCurDVR2= dynamic_cast<const - formula::SingleVectorRefToken *>(tmpCur2); - ss << " int buffer_x_len = "; - ss << tmpCurDVR0->GetArrayLength(); - ss << ";\n"; - ss << " int buffer_mue_len = "; - ss << tmpCurDVR1->GetArrayLength(); - ss << ";\n"; - ss << " int buffer_sigma_len = "; - ss << tmpCurDVR2->GetArrayLength(); - ss << ";\n"; + size_t i = vSubArguments.size(); + ss <<"\n"; + for (i = 0; i < vSubArguments.size(); i++) + { + FormulaToken *pCur = vSubArguments[i]->GetFormulaToken(); + assert(pCur); + if (pCur->GetType() == formula::svSingleVectorRef) + { +#ifdef ISNAN + const formula::SingleVectorRefToken* pSVR = + dynamic_cast< const formula::SingleVectorRefToken* >(pCur); + ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n"; #endif -#ifdef ISNAN - ss <<" if((gid0)>=buffer_x_len || isNan("; - ss << vSubArguments[0]->GenSlidingWindowDeclRef(); - ss <<"))\n"; - ss <<" x = 0;\n"; - ss <<" else \n"; + } + else if (pCur->GetType() == formula::svDouble) + { +#ifdef ISNAN + ss << "{\n"; #endif - ss <<" x ="<<vSubArguments[0]->GenSlidingWindowDeclRef(); - ss << ";\n"; -#ifdef ISNAN - ss <<" if((gid0)>=buffer_mue_len || isNan("; - ss << vSubArguments[1]->GenSlidingWindowDeclRef(); - ss <<"))\n"; - ss <<" mue = 0;\n"; - ss <<" else \n"; + } + else + { +#ifdef ISNAN #endif - ss <<" mue ="<<vSubArguments[1]->GenSlidingWindowDeclRef(); - ss << ";\n"; -#ifdef ISNAN - ss <<" if((gid0)>=buffer_sigma_len || isNan("; - ss << vSubArguments[2]->GenSlidingWindowDeclRef(); - ss <<"))\n"; - ss <<" sigma = 0;\n"; - ss <<"else \n"; + } +#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"; + } + else + { + ss << "tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef(); + ss <<";\n"; + } #endif - ss <<" sigma ="<<vSubArguments[2]->GenSlidingWindowDeclRef(); - ss << ";\n"; + } + ss <<" x = tmp0;\n"; + ss <<" mue = tmp1;\n"; + ss <<" sigma = tmp2;\n"; ss <<" q = x -0.5;\n"; ss <<" if(fabs(q)<=.425)\n"; ss <<" {\n"; - ss <<" t=0.180625-q*q;\n"; + ss <<" t=0.180625-pow(q,2);\n"; ss <<" z=\n" "q*\n" "(\n" @@ -5068,7 +5069,7 @@ void OpNorminv::GenSlidingWindowFunction( "*t+1.0\n" ");\n"; ss<<"}\n"; - ss<<"if(q<0.0) z=-z;\n"; + ss << "z = q < 0.0 ? (-1)*z : z;\n"; ss<<"}\n"; ss<<"double tmp = z*sigma + mue;\n"; ss<<"return tmp;\n"; commit 19013b913249c035e8519a46b9634b675e2026f1 Author: hongyu zhong <[email protected]> Date: Fri Dec 6 10:27:39 2013 +0800 GPU Calc: Optimized NEGBINOMDIST AMLOEXT-282 Change-Id: Ie6dcd77fc11b91647722b5a9a73deb0d6a97989c Signed-off-by: haochen <[email protected]> Signed-off-by: Wei Wei <[email protected]> Signed-off-by: I-Jui (Ray) Sung <[email protected]> diff --git a/sc/qa/unit/opencl-test.cxx b/sc/qa/unit/opencl-test.cxx index 7796b57..9d28359 100644 --- a/sc/qa/unit/opencl-test.cxx +++ b/sc/qa/unit/opencl-test.cxx @@ -1494,7 +1494,6 @@ void ScOpenclTest::testStatisticalFormulaNegbinomdist() { double fLibre = pDoc->GetValue(ScAddress(3,i,0)); double fExcel = pDocRes->GetValue(ScAddress(3,i,0)); - std::cout<<fLibre<<"\t"<<fExcel<<"\n"; CPPUNIT_ASSERT_DOUBLES_EQUAL(fExcel, fLibre, fabs(0.0001*fExcel)); } xDocSh->DoClose(); diff --git a/sc/source/core/opencl/op_statistical.cxx b/sc/source/core/opencl/op_statistical.cxx index 1769056..4af1fd3 100644 --- a/sc/source/core/opencl/op_statistical.cxx +++ b/sc/source/core/opencl/op_statistical.cxx @@ -3708,64 +3708,63 @@ void OpNegbinomdist::GenSlidingWindowFunction( } ss << ")\n"; ss << "{\n\t"; - ss << "double f,s,p;\n\t"; - ss << " int gid0=get_global_id(0);\n\t"; -#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); - - FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken(); - const formula::SingleVectorRefToken*tmpCurDVR2= dynamic_cast<const - formula::SingleVectorRefToken *>(tmpCur2); - ss<< "int buffer_f_len = "; - ss<< tmpCurDVR0->GetArrayLength(); - ss << ";\n\t"; - - ss<< "int buffer_s_len = "; - ss<< tmpCurDVR1->GetArrayLength(); - ss << ";\n\t"; - - ss<< "int buffer_p_len = "; - ss<< tmpCurDVR2->GetArrayLength(); - ss << ";\n\t"; + ss << "double f,s,p,tmp0,tmp1,tmp2;\n"; + ss << " int gid0=get_global_id(0);\n"; + size_t i = vSubArguments.size(); + ss <<"\n"; + for (i = 0; i < vSubArguments.size(); i++) + { + FormulaToken *pCur = vSubArguments[i]->GetFormulaToken(); + assert(pCur); + if (pCur->GetType() == formula::svSingleVectorRef) + { +#ifdef ISNAN + const formula::SingleVectorRefToken* pSVR = + dynamic_cast< const formula::SingleVectorRefToken* >(pCur); + ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n"; #endif -#ifdef ISNAN - ss<<"if((gid0)>=buffer_p_len || isNan("; - ss << vSubArguments[2]->GenSlidingWindowDeclRef(); - ss<<"))\n\t\t"; - ss<<"p = 0;\n\telse \n\t\t"; + } + else if (pCur->GetType() == formula::svDouble) + { +#ifdef ISNAN + ss << "{\n"; #endif - ss << " p = "<<vSubArguments[2]->GenSlidingWindowDeclRef(); - ss << " ;\n\t"; -#ifdef ISNAN - ss<<"if((gid0)>=buffer_s_len || isNan("; - ss << vSubArguments[1]->GenSlidingWindowDeclRef(); - ss<<"))\n\t\t"; - ss<<"s = 0;\n\telse \n\t\t"; + } + else + { +#ifdef ISNAN #endif - ss << " s = "<<vSubArguments[1]->GenSlidingWindowDeclRef(); - ss << " ;\n\t"; -#ifdef ISNAN - ss<<"if((gid0)>=buffer_f_len || isNan("; - ss << vSubArguments[0]->GenSlidingWindowDeclRef(); - ss<<"))\n\t\t"; - ss<<"f = 0;\n\telse \n\t\t"; + } +#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"; + } + else + { + ss << "tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef(); + ss <<";\n"; + } #endif - ss << " f = "<<vSubArguments[0]->GenSlidingWindowDeclRef(); - ss << " ;\n\t"; + } + ss << " p = tmp2;\n"; + ss << " s = tmp1;\n"; + ss << " f = tmp0;\n"; ss << " double q = 1.0 - p;\n\t"; ss << " double fFactor = pow(p,s);\n\t"; ss << " for(int i=0; i<f; i++)\n\t"; ss << " {\n\t"; - ss << " fFactor *= ((double)i+s)/((double)i+1.0)*q;\n\t"; + ss << " fFactor *= ((double)i+s)*pow(((double)i+1.0),-1.0)/pow(q,-1);\n"; ss << " }\n\t"; - ss << " double tmp=fFactor;\n\t"; - ss << " return tmp;\n"; + ss << " double temp=fFactor;\n\t"; + ss << " return temp;\n"; ss << "}\n"; } commit 7e8aedcd8e0d683aaf891d6373d4cf5f33ddbe39 Author: hongyu zhong <[email protected]> Date: Fri Dec 6 10:40:15 2013 +0800 GPU Calc: Optimized PEARSON AMLOEXT-281 Change-Id: I98d17f007a77aedff3778b251b6cfd399d34464c Signed-off-by: haochen <[email protected]> Signed-off-by: Wei Wei <[email protected]> Signed-off-by: I-Jui (Ray) Sung <[email protected]> diff --git a/sc/source/core/opencl/op_statistical.cxx b/sc/source/core/opencl/op_statistical.cxx index 4d657fc..1769056 100644 --- a/sc/source/core/opencl/op_statistical.cxx +++ b/sc/source/core/opencl/op_statistical.cxx @@ -3787,16 +3787,72 @@ void OpPearson::GenSlidingWindowFunction( vSubArguments[i]->GenSlidingWindowDecl(ss); } ss << ")\n"; - ss << "{\n\t"; - ss << "int gid0=get_global_id(0);\n\t"; - ss << "double fCount = 0.0;\n\t"; - ss << "double fSumX = 0.0;\n\t"; - ss << "double fSumY = 0.0;\n\t"; - ss << "double fSumDeltaXDeltaY = 0.0;\n\t"; - ss << "double fSumSqrDeltaX = 0.0;\n\t"; - ss << "double fSumSqrDeltaY = 0.0;\n\t"; - ss << "double fInx;\n\t"; - ss << "double fIny;\n\t"; + ss << "{\n"; + ss << " int gid0=get_global_id(0);\n"; + ss << " double fCount = 0.0;\n"; + ss << " double fSumX = 0.0;\n"; + ss << " double fSumY = 0.0;\n"; + ss << " double fSumDeltaXDeltaY = 0.0;\n"; + ss << " double fInx;\n"; + ss << " double fIny;\n"; + size_t i = vSubArguments.size(); + 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 + } 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 + } 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 + } + else { +#ifdef ISNAN + ss << "0; i < "<< nCurWindowSize << "; i++){\n"; +#else + ss << "0; i < "<< nCurWindowSize << "; i++)\n"; +#endif + } + } + else if (pCur->GetType() == formula::svSingleVectorRef) + { +#ifdef ISNAN + const formula::SingleVectorRefToken* pSVR = + dynamic_cast< const formula::SingleVectorRefToken* >(pCur); + ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n"; +#endif + } + else if (pCur->GetType() == formula::svDouble) + { +#ifdef ISNAN + ss << "{\n"; +#endif + } + ss << "\n}\n"; + } #ifdef ISNAN FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); const formula::DoubleVectorRefToken*tmpCurDVR0= dynamic_cast<const @@ -3806,55 +3862,55 @@ void OpPearson::GenSlidingWindowFunction( const formula::DoubleVectorRefToken*tmpCurDVR1= dynamic_cast<const formula::DoubleVectorRefToken *>(tmpCur1); - ss<< "int buffer_fInx_len = "; - ss<< tmpCurDVR0->GetArrayLength(); - ss << ";\n\t"; + ss << " int buffer_fInx_len = "; + ss << tmpCurDVR0->GetArrayLength(); + ss << ";\n"; - ss<< "int buffer_fIny_len = "; - ss<< tmpCurDVR1->GetArrayLength(); - ss << ";\n\t"; + ss << " int buffer_fIny_len = "; + ss << tmpCurDVR1->GetArrayLength(); + ss << ";\n"; #endif - ss << "for(int i=0; i<"<<CurWindowSize<<"; i++)\n\t"; - ss << "{\n\t"; + ss << " for(int i=0; i<"<<CurWindowSize<<"; i++)\n"; + ss << " {\n"; #ifdef ISNAN - ss<<"if((gid0+i)>=buffer_fInx_len || isNan("; + ss <<" if((gid0+i)>=buffer_fInx_len || isNan("; ss << vSubArguments[0]->GenSlidingWindowDeclRef(); - ss<<"))\n\t\t"; - ss<<"fInx = 0;\n\telse \n\t"; + ss <<"))\n"; + ss <<" fInx = 0;\n"; + ss <<" else\n"; #endif - ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef(); - ss << " ;\n\t"; + ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef(); + ss << ";\n"; #ifdef ISNAN - ss<<"if((gid0+i)>=buffer_fIny_len || isNan("; + ss <<" if((gid0+i)>=buffer_fIny_len || isNan("; ss << vSubArguments[1]->GenSlidingWindowDeclRef(); - ss<<"))\n\t\t"; - ss<<"fIny = 0;\n\telse \n\t"; -#endif - ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef(); - ss << " ;\n\t"; - ss << " double fValX = fInx;\n\t"; - ss << " double fValY = fIny;\n\t"; - ss << " fSumX += fValX;\n\t"; - ss << " fSumY += fValY;\n\t"; - ss << " fCount = fCount + 1;\n\t"; - ss << "}\n\t"; - ss << "const double fMeanX = fSumX / fCount;\n\t"; - ss << "const double fMeanY = fSumY / fCount;\n\t"; - ss << "for(int i=0; i<"<<CurWindowSize<<"; i++)\n\t"; - ss << "{\n\t"; - ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef(); - ss << " ;\n\t"; - ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef(); - ss << " ;\n\t"; - ss << " const double fValX = fInx;\n\t"; - ss << " const double fValY = fIny;\n\t"; - ss << " fSumDeltaXDeltaY += (fValX - fMeanX) * (fValY - fMeanY);\n\t"; - ss << " fSumSqrDeltaX += (fValX - fMeanX) * (fValX - fMeanX);\n\t"; - ss << " fSumSqrDeltaY += (fValY - fMeanY) * (fValY - fMeanY);\n\t"; - ss << "}\n\t"; - ss << "double tmp = ( fSumDeltaXDeltaY / "; - ss << "sqrt( fSumSqrDeltaX * fSumSqrDeltaY));\n\t"; - ss << "return tmp;\n"; + ss <<"))\n"; + ss <<" fIny = 0;\n"; + ss <<" else\n"; +#endif + ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef(); + ss << " ;\n"; + ss << " fSumX += fInx;\n"; + ss << " fSumY += fIny;\n"; + ss << " fCount = fCount + 1;\n"; + ss << " }\n"; + ss << " double fMeanX = fSumX / fCount;\n"; + ss << " double fMeanY = fSumY / fCount;\n"; + ss << " fSumX = 0.0;\n"; + ss << " fSumY = 0.0;\n"; + ss << " for(int i=0; i<"<<CurWindowSize<<"; i++)\n"; + ss << " {\n"; + ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef(); + ss << " ;\n"; + ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef(); + ss << " ;\n"; + ss << " fSumDeltaXDeltaY += (fInx - fMeanX) * (fIny - fMeanY);\n"; + ss << " fSumX += pow(fInx - fMeanX,2);\n"; + ss << " fSumY += pow(fIny - fMeanY,2);\n"; + ss << " }\n"; + ss << " double tmp = ( fSumDeltaXDeltaY / "; + ss << "sqrt( fSumX * fSumY));\n\t"; + ss << " return tmp;\n"; ss << "}\n"; } commit 3005ed48f14e4712e7d9d2fa6db859a6ebe8a781 Author: hongyu zhong <[email protected]> Date: Fri Dec 6 10:44:03 2013 +0800 GPU Calc: Optimized RSQ AMLOEXT-280 Change-Id: I92bc0daeb74e7322479e4f8e57b816b7de45b1b0 Signed-off-by: haochen <[email protected]> Signed-off-by: Wei Wei <[email protected]> Signed-off-by: I-Jui (Ray) Sung <[email protected]> diff --git a/sc/source/core/opencl/op_statistical.cxx b/sc/source/core/opencl/op_statistical.cxx index edf2910..4d657fc 100644 --- a/sc/source/core/opencl/op_statistical.cxx +++ b/sc/source/core/opencl/op_statistical.cxx @@ -4266,16 +4266,73 @@ void OpRsq::GenSlidingWindowFunction( vSubArguments[i]->GenSlidingWindowDecl(ss); } ss << ")\n"; - ss << "{\n\t"; - ss << "int gid0=get_global_id(0);\n\t"; - ss << "double fCount = 0.0;\n\t"; - ss << "double fSumX = 0.0;\n\t"; - ss << "double fSumY = 0.0;\n\t"; - ss << "double fSumDeltaXDeltaY = 0.0;\n\t"; - ss << "double fSumSqrDeltaX = 0.0;\n\t"; - ss << "double fSumSqrDeltaY = 0.0;\n\t"; - ss << "double fInx;\n\t"; - ss << "double fIny;\n\t"; + ss << "{\n"; + ss << " int gid0=get_global_id(0);\n"; + ss << " double fCount = 0.0;\n"; + ss << " double fSumX = 0.0;\n"; + ss << " double fSumY = 0.0;\n"; + ss << " double fSumDeltaXDeltaY = 0.0;\n"; + ss << " double fInx;\n"; + ss << " double fIny;\n"; + ss << " double tmp0,tmp1;\n"; + size_t i = vSubArguments.size(); + 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 + } 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 + } 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 + } + else { +#ifdef ISNAN + ss << "0; i < "<< nCurWindowSize << "; i++){\n"; +#else + ss << "0; i < "<< nCurWindowSize << "; i++)\n"; +#endif + } + } + else if (pCur->GetType() == formula::svSingleVectorRef) + { +#ifdef ISNAN + const formula::SingleVectorRefToken* pSVR = + dynamic_cast< const formula::SingleVectorRefToken* >(pCur); + ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n"; +#endif + } + else if (pCur->GetType() == formula::svDouble) + { +#ifdef ISNAN + ss << "{\n"; +#endif + } + ss << "\n}\n"; + } #ifdef ISNAN FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); const formula::DoubleVectorRefToken*tmpCurDVR0= dynamic_cast<const @@ -4283,54 +4340,53 @@ void OpRsq::GenSlidingWindowFunction( FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken(); const formula::DoubleVectorRefToken*tmpCurDVR1= dynamic_cast<const formula::DoubleVectorRefToken *>(tmpCur1); - ss<< "int buffer_fInx_len = "; - ss<< tmpCurDVR0->GetArrayLength(); - ss << ";\n\t"; - - ss<< "int buffer_fIny_len = "; - ss<< tmpCurDVR1->GetArrayLength(); - ss << ";\n\t"; + ss << " int buffer_fInx_len = "; + ss << tmpCurDVR0->GetArrayLength(); + ss << ";\n"; + ss << " int buffer_fIny_len = "; + ss << tmpCurDVR1->GetArrayLength(); + ss << ";\n"; #endif - ss << "for(int i=0; i<"<<nCurWindowSize<<"; i++)\n\t"; - ss << "{\n\t"; + ss << " for(int i=0; i<"<<nCurWindowSize<<"; i++)\n"; + ss << " {\n"; #ifdef ISNAN - ss<<"if((gid0+i)>=buffer_fInx_len || isNan("; + ss << " if((gid0+i)>=buffer_fInx_len || isNan("; ss << vSubArguments[0]->GenSlidingWindowDeclRef(); - ss<<"))\n\t\t"; - ss<<"fInx = 0;\n\telse \n\t"; + ss << "))\n"; + ss << " fInx = 0;\n"; + ss << " else\n"; #endif - ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef(); - ss << " ;\n\t"; + ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef(); + ss << ";\n"; #ifdef ISNAN - ss<<"if((gid0+i)>=buffer_fIny_len || isNan("; + ss << " if((gid0+i)>=buffer_fIny_len || isNan("; ss << vSubArguments[1]->GenSlidingWindowDeclRef(); - ss<<"))\n\t\t"; - ss<<"fIny = 0;\n\telse \n\t"; -#endif - ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef(); - ss << " ;\n\t"; - ss << " double fValX = fInx;\n\t"; - ss << " double fValY = fIny;\n\t"; - ss << " fSumX += fValX;\n\t"; - ss << " fSumY += fValY;\n\t"; - ss << " fCount = fCount + 1;\n\t"; - ss << "}\n\t"; - ss << "const double fMeanX = fSumX / fCount;\n\t"; - ss << "const double fMeanY = fSumY / fCount;\n\t"; - ss << "for(int i=0; i<"<<nCurWindowSize<<"; i++)\n\t"; - ss << "{\n\t"; - ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef(); - ss << " ;\n\t"; - ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef(); - ss << " ;\n\t"; - ss << " const double fValX = fInx;\n\t"; - ss << " const double fValY = fIny;\n\t"; - ss << " fSumDeltaXDeltaY += (fValX - fMeanX) * (fValY - fMeanY);\n\t"; - ss << " fSumSqrDeltaX += (fValX - fMeanX) * (fValX - fMeanX);\n\t"; - ss << " fSumSqrDeltaY += (fValY - fMeanY) * (fValY - fMeanY);\n\t"; - ss << "}\n\t"; - ss << "double tmp = ( fSumDeltaXDeltaY / sqrt( fSumSqrDeltaX * fSumSqrDeltaY));\n\t"; - ss << "return (tmp * tmp);\n"; + ss << "))\n"; + ss << " fIny = 0;\n"; + ss << " else\n"; +#endif + ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef(); + ss << " ;\n"; + ss << " fSumX += fInx;\n"; + ss << " fSumY += fIny;\n"; + ss << " fCount = fCount + 1;\n"; + ss << " }\n"; + ss << " double fMeanX = fSumX / fCount;\n"; + ss << " double fMeanY = fSumY / fCount;\n"; + ss << " fSumX = 0.0;\n"; + ss << " fSumY = 0.0;\n"; + ss << " for(int i=0; i<"<<nCurWindowSize<<"; i++)\n"; + ss << " {\n"; + ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef(); + ss << " ;\n"; + ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef(); + ss << " ;\n"; + ss << " fSumDeltaXDeltaY += (fInx - fMeanX) * (fIny - fMeanY);\n"; + ss << " fSumX += pow(fInx - fMeanX,2);\n"; + ss << " fSumY += pow(fIny - fMeanY,2);\n"; + ss << " }\n"; + ss << " double tmp = pow( fSumDeltaXDeltaY,2) / (fSumX * fSumY);\n"; + ss << " return tmp ;\n"; ss << "}\n"; } _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
