[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