[Libreoffice-commits] core.git: 2 commits - sc/qa sc/source

yiming ju yiming at multicorewareinc.com
Sun Nov 17 11:02:42 PST 2013


 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 <yiming at 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 <haochen at multicorewareinc.com>
    Signed-off-by: I-Jui (Ray) Sung <ray at 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 <yiming at 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 <haochen at multicorewareinc.com>
    Signed-off-by: I-Jui (Ray) Sung <ray at 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);


More information about the Libreoffice-commits mailing list