diff options
author | yiming ju <yiming@multicorewareinc.com> | 2013-12-31 11:23:54 +0800 |
---|---|---|
committer | I-Jui (Ray) Sung <ray@multicorewareinc.com> | 2013-12-31 17:20:01 -0600 |
commit | de6cd548c108a9001158946e4fba251b281c0bf0 (patch) | |
tree | cec3b23ca767128586c568e35f7a956d1c718a1b /sc | |
parent | dc6639a4f2556bec5d0031cbefca230e6e31eef5 (diff) |
GPU Calc: Fix bug of Averageif not support double vector
AMLOEXT-386 FIX
Change-Id: If8bd95079c725c690e5ca10c6c5954d01f971c0e
Signed-off-by: haochen <haochen@multicorewareinc.com>
Signed-off-by: Wei Wei <weiwei@multicorewareinc.com>
Signed-off-by: I-Jui (Ray) Sung <ray@multicorewareinc.com>
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/core/opencl/op_math.cxx | 163 |
1 files changed, 131 insertions, 32 deletions
diff --git a/sc/source/core/opencl/op_math.cxx b/sc/source/core/opencl/op_math.cxx index 3422b3b8133a..9b7dca065a6d 100644 --- a/sc/source/core/opencl/op_math.cxx +++ b/sc/source/core/opencl/op_math.cxx @@ -2961,12 +2961,7 @@ void OpProduct::GenSlidingWindowFunction(std::stringstream &ss, void OpAverageIf::GenSlidingWindowFunction(std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments) { - FormulaToken *tmpCur = vSubArguments[0]->GetFormulaToken(); - const formula::DoubleVectorRefToken*pCurDVR= dynamic_cast<const - formula::DoubleVectorRefToken *>(tmpCur); - size_t nCurWindowSize = pCurDVR->GetArrayLength() < - pCurDVR->GetRefRowSize() ? pCurDVR->GetArrayLength(): - pCurDVR->GetRefRowSize() ; + ss << "\ndouble " << sSymName; ss << "_"<< BinFuncName() <<"("; for (unsigned i = 0; i < vSubArguments.size(); i++) @@ -2978,39 +2973,143 @@ void OpAverageIf::GenSlidingWindowFunction(std::stringstream &ss, ss << " int gid0=get_global_id(0);\n"; ss << " double tmp =0;\n"; ss << " double count=0;\n"; + ss << " int singleIndex =gid0;\n"; + ss << " int doubleIndex;\n"; ss << " int i ;\n"; + ss << " int j ;\n"; GenTmpVariables(ss,vSubArguments); - ss << " for (i = "; - if (!pCurDVR->IsStartFixed() && pCurDVR->IsEndFixed()) { - ss << "gid0; i < "<< nCurWindowSize <<"; i++)\n"; - } else if (pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()) { - ss << "0; i < gid0+"<< nCurWindowSize <<"; i++)\n"; - } else { - ss << "0; i < "<< nCurWindowSize <<"; i++)\n"; + + unsigned paraOneIsDoubleVector = 0; + unsigned paraOneWidth = 1; + unsigned paraTwoWidth = 1; + unsigned paraThreeWidth = 1; + unsigned loopTimes = 0; + unsigned loopIndex = 0; + if(vSubArguments[0]->GetFormulaToken()->GetType() == + formula::svDoubleVectorRef) + { + paraOneIsDoubleVector = 1; + FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); + const formula::DoubleVectorRefToken*pCurDVR0= dynamic_cast<const + formula::DoubleVectorRefToken *>(tmpCur0); + paraOneWidth = pCurDVR0->GetArrays().size(); + loopTimes = paraOneWidth; + if(paraOneWidth > 1) + { + throw Unhandled(); + } } - ss << " {\n"; - if(!pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()) - { - ss << " int doubleIndex =i+gid0;\n"; - }else + + if(vSubArguments[paraOneWidth]->GetFormulaToken()->GetType() == + formula::svDoubleVectorRef) + { - ss << " int doubleIndex =i;\n"; + FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken(); + const formula::DoubleVectorRefToken*pCurDVR1= dynamic_cast<const + formula::DoubleVectorRefToken *>(tmpCur1); + paraTwoWidth = pCurDVR1->GetArrays().size(); + if(paraTwoWidth > 1) + { + throw Unhandled(); + } + ss << " i = "; + if (!pCurDVR1->IsStartFixed() && pCurDVR1->IsEndFixed()) { + ss << "gid0;\n"; + } else { + ss << "0;\n"; + } + if(!pCurDVR1->IsStartFixed() && !pCurDVR1->IsEndFixed()) + { + ss << " doubleIndex =i+gid0;\n"; + }else + { + ss << " doubleIndex =i;\n"; + } } - ss << " int singleIndex =gid0;\n"; - CheckSubArgumentIsNan(ss,vSubArguments,0); - CheckSubArgumentIsNan(ss,vSubArguments,1); - ss << " if ( isequal( tmp0 , tmp1 ) ) \n"; - ss << " {"; - if(vSubArguments.size() == 2) - ss << " tmp += tmp0;\n"; - else + + CheckSubArgumentIsNan(ss,vSubArguments,paraOneWidth); + + unsigned paraThreeIndex = paraOneWidth + paraTwoWidth; + if(vSubArguments.size() > paraThreeIndex) + { + if(vSubArguments[paraThreeIndex]->GetFormulaToken()->GetType() == + formula::svDoubleVectorRef) + { + FormulaToken *tmpCur2 = + vSubArguments[paraThreeIndex]->GetFormulaToken(); + const formula::DoubleVectorRefToken*pCurDVR2= dynamic_cast<const + formula::DoubleVectorRefToken *>(tmpCur2); + paraThreeWidth = pCurDVR2->GetArrays().size(); + if(paraThreeWidth > 1) + { + throw Unhandled(); + } + } + } + + if(paraOneIsDoubleVector) + { + FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); + const formula::DoubleVectorRefToken*pCurDVR0= dynamic_cast<const + formula::DoubleVectorRefToken *>(tmpCur0); + size_t nCurWindowSize = pCurDVR0->GetArrayLength() < + pCurDVR0->GetRefRowSize() ? pCurDVR0->GetArrayLength(): + pCurDVR0->GetRefRowSize() ; + + for(loopIndex =0; loopIndex < loopTimes; loopIndex++) + { + ss << " for (i = "; + if (!pCurDVR0->IsStartFixed() && pCurDVR0->IsEndFixed()) { + ss << "gid0; i < "<< nCurWindowSize <<"; i++)\n"; + } else if (pCurDVR0->IsStartFixed() && !pCurDVR0->IsEndFixed()) { + ss << "0; i < gid0+"<< nCurWindowSize <<"; i++)\n"; + } else { + ss << "0; i < "<< nCurWindowSize <<"; i++)\n"; + } + ss << " {\n"; + if(!pCurDVR0->IsStartFixed() && !pCurDVR0->IsEndFixed()) + { + ss << " doubleIndex =i+gid0;\n"; + }else + { + ss << " doubleIndex =i;\n"; + } + + CheckSubArgumentIsNan(ss,vSubArguments, loopIndex); + + ss << " if ( isequal( tmp"; + ss << loopIndex<<" , tmp"<<paraOneWidth<<") ) \n"; + ss << " {\n"; + if(vSubArguments.size() == paraThreeIndex) + ss << " tmp += tmp"<<loopIndex<<";\n"; + else + { + CheckSubArgumentIsNan(ss,vSubArguments, + paraThreeIndex+loopIndex); + ss << " tmp += tmp"; + ss << paraThreeIndex+loopIndex<<";\n"; + } + ss << " count+=1.0;\n"; + ss << " }\n"; + ss << " }\n"; + } + } + else { - CheckSubArgumentIsNan(ss,vSubArguments,2); - ss << " tmp += tmp2;\n"; + CheckSubArgumentIsNan(ss,vSubArguments, 0); + ss << " if ( isequal( tmp0 , tmp1 ) ) \n"; + ss << " {\n"; + if(vSubArguments.size() == 2) + ss << " tmp += tmp0;\n"; + else + { + CheckSubArgumentIsNan(ss,vSubArguments,2); + ss << " tmp += tmp2;\n"; + } + ss << " count+=1.0;\n"; + ss << " }\n"; } - ss << " count+=1.0;\n"; - ss << " }\n"; - ss << " }\n"; + ss << " if(count!=0)\n"; ss << " tmp=tmp/count;\n"; ss << " else\n"; |