sc/qa/unit/data/xls/opencl/math/sumproduct_mixSliding.xls |binary sc/qa/unit/opencl-test.cxx | 38 +++++++++ sc/source/core/opencl/formulagroupcl.cxx | 57 +++++++++++--- 3 files changed, 86 insertions(+), 9 deletions(-)
New commits: commit 59c0051b26c28a0b277a83177f7e7d5db012b6cf Author: yiming ju <yim...@multicorewareinc.com> Date: Sun Nov 17 18:29:16 2013 +0800 GPU Calc: unit test cases for SUMPRODUCT WITH FIXED WINDOWS AMLOEXT-214 BUG Change-Id: Ib5adff235593b3a38f6aa7e63edf0196d31b8e82 Signed-off-by: haochen <haoc...@multicorewareinc.com> Signed-off-by: I-Jui (Ray) Sung <r...@multicorewareinc.com> diff --git a/sc/qa/unit/data/xls/opencl/math/sumproduct_mixSliding.xls b/sc/qa/unit/data/xls/opencl/math/sumproduct_mixSliding.xls new file mode 100644 index 0000000..09ff33e Binary files /dev/null and b/sc/qa/unit/data/xls/opencl/math/sumproduct_mixSliding.xls differ diff --git a/sc/qa/unit/opencl-test.cxx b/sc/qa/unit/opencl-test.cxx index 0cbf365..987fc40 100644 --- a/sc/qa/unit/opencl-test.cxx +++ b/sc/qa/unit/opencl-test.cxx @@ -240,6 +240,7 @@ public: void testStatisticalFormulaStDevP(); void testStatisticalFormulaCovar(); void testLogicalFormulaAnd(); + void testMathFormulaSumProduct(); CPPUNIT_TEST_SUITE(ScOpenclTest); CPPUNIT_TEST(testSharedFormulaXLS); CPPUNIT_TEST(testFinacialFormula); @@ -411,6 +412,7 @@ public: CPPUNIT_TEST(testStatisticalFormulaStDevP); CPPUNIT_TEST(testStatisticalFormulaCovar); CPPUNIT_TEST(testLogicalFormulaAnd); + CPPUNIT_TEST(testMathFormulaSumProduct); CPPUNIT_TEST_SUITE_END(); private: @@ -4716,6 +4718,42 @@ void ScOpenclTest:: testArrayFormulaSumXMY2() xDocSh->DoClose(); xDocShRes->DoClose(); } +//[AMLOEXT-214] +void ScOpenclTest::testMathFormulaSumProduct() +{ + if (!detectOpenCLDevice()) + return; + ScDocShellRef xDocSh = loadDoc("opencl/math/sumproduct_mixSliding.", XLS); + ScDocument* pDoc = xDocSh->GetDocument(); + CPPUNIT_ASSERT(pDoc); + enableOpenCL(); + pDoc->CalcAll(); + ScDocShellRef xDocShRes = loadDoc("opencl/math/sumproduct_mixSliding.", XLS); + ScDocument* pDocRes = xDocShRes->GetDocument(); + CPPUNIT_ASSERT(pDocRes); + // Check the results of formula cells in the shared formula range. + for (SCROW i = 0; i <= 9; ++i) + { + double fLibre = pDoc->GetValue(ScAddress(2,i,0)); + double fExcel = pDocRes->GetValue(ScAddress(2,i,0)); + if ( i == 1 ) + CPPUNIT_ASSERT_DOUBLES_EQUAL(82, fLibre, fabs(0.0001*fExcel)); + else if ( i == 2 ) + CPPUNIT_ASSERT_DOUBLES_EQUAL(113, fLibre, fabs(0.0001*fExcel)); + else if ( i == 4 ) + CPPUNIT_ASSERT_DOUBLES_EQUAL(175, fLibre, fabs(0.0001*fExcel)); + else if ( i == 5 ) + CPPUNIT_ASSERT_DOUBLES_EQUAL(206, fLibre, fabs(0.0001*fExcel)); + else if ( i == 6 ) + CPPUNIT_ASSERT_DOUBLES_EQUAL(237, fLibre, fabs(0.0001*fExcel)); + else if ( i == 7 ) + CPPUNIT_ASSERT_DOUBLES_EQUAL(268, fLibre, fabs(0.0001*fExcel)); + else + CPPUNIT_ASSERT_DOUBLES_EQUAL(fExcel, fLibre, fabs(0.0001*fExcel)); + } + xDocSh->DoClose(); + xDocShRes->DoClose(); +} //[AMLOEXT-217] void ScOpenclTest:: testLogicalFormulaAnd() { commit 62f23965591ad3e2a3ee772e518d3fccd6b5ae9f Author: yiming ju <yim...@multicorewareinc.com> Date: Sun Nov 17 18:58:23 2013 +0800 GPU Calc: implemented SUMPRODUCT WITH FIXED WINDOWS AMLOEXT-214 FIX Change-Id: Ifb2797899ec30f998a2387ce9c5752c8e8a03b79 Signed-off-by: haochen <haoc...@multicorewareinc.com> Signed-off-by: I-Jui (Ray) Sung <r...@multicorewareinc.com> diff --git a/sc/source/core/opencl/formulagroupcl.cxx b/sc/source/core/opencl/formulagroupcl.cxx index 85ebdf0..43aa30d 100644 --- a/sc/source/core/opencl/formulagroupcl.cxx +++ b/sc/source/core/opencl/formulagroupcl.cxx @@ -808,6 +808,8 @@ public: const std::string sSymName, SubArguments &vSubArguments) { size_t nCurWindowSize = 0; + FormulaToken *tmpCur = NULL; + const formula::DoubleVectorRefToken *pCurDVR = NULL; ss << "\ndouble " << sSymName; ss << "_"<< BinFuncName() <<"("; for (unsigned i = 0; i < vSubArguments.size(); i++) @@ -816,15 +818,50 @@ public: ss << ","; vSubArguments[i]->GenSlidingWindowDecl(ss); size_t nCurChildWindowSize = vSubArguments[i]->GetWindowSize(); - nCurWindowSize = (nCurWindowSize < nCurChildWindowSize) ? + nCurWindowSize = (nCurWindowSize < nCurChildWindowSize)? nCurChildWindowSize:nCurWindowSize; + tmpCur = vSubArguments[i]->GetFormulaToken(); + if ( ocPush==tmpCur->GetOpCode() ) + { + + pCurDVR = dynamic_cast< + const formula::DoubleVectorRefToken*>(tmpCur); + if ( ! + ( (!pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()) + || (pCurDVR->IsStartFixed() && pCurDVR->IsEndFixed()) ) + ) + throw Unhandled(); + } + } - 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 << "int currentCount = i+gid0+1;\n"; - ss << "tmp += "; + ss << ") {\n"; + ss << " double tmp = 0.0;\n"; + ss << " int gid0 = get_global_id(0);\n"; + ss << " int i ;\n"; + ss << " for (i = 0; i < "<< nCurWindowSize <<"; i++)\n"; + ss << " {\n"; + for (unsigned i = 0; i < vSubArguments.size(); i++) + { + tmpCur = vSubArguments[i]->GetFormulaToken(); + if(ocPush==tmpCur->GetOpCode()) + { + pCurDVR= dynamic_cast< + const formula::DoubleVectorRefToken *>(tmpCur); + if(!pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()) + { + ss << " int currentCount"; + ss << i; + ss <<" =i+gid0+1;\n"; + } + else + { + ss << " int currentCount"; + ss << i; + ss << " =i+1;\n"; + } + } + } + ss << " tmp += "; for (unsigned i = 0; i < vSubArguments.size(); i++) { if (i) @@ -833,7 +870,9 @@ public: if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) { ss <<"("; - ss <<"(currentCount>"; + ss <<"(currentCount"; + ss << i; + ss<< ">"; if(vSubArguments[i]->GetFormulaToken()->GetType() == formula::svSingleVectorRef) { @@ -850,7 +889,7 @@ public: (vSubArguments[i]->GetFormulaToken()); ss<<pSVR->GetArrayLength(); } - ss << ")&&isNan("<<vSubArguments[i] + ss << ")||isNan("<<vSubArguments[i] ->GenSlidingWindowDeclRef(true); ss << ")?0:"; ss << vSubArguments[i]->GenSlidingWindowDeclRef(true); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits