diff options
-rw-r--r-- | sc/source/core/opencl/op_spreadsheet.cxx | 102 |
1 files changed, 55 insertions, 47 deletions
diff --git a/sc/source/core/opencl/op_spreadsheet.cxx b/sc/source/core/opencl/op_spreadsheet.cxx index 3b0646062795..c005d2a89c72 100644 --- a/sc/source/core/opencl/op_spreadsheet.cxx +++ b/sc/source/core/opencl/op_spreadsheet.cxx @@ -39,21 +39,23 @@ void OpVLookup::GenSlidingWindowFunction(std::stringstream &ss, ss << " double intermediate = DBL_MAX;\n"; ss << " int singleIndex = gid0;\n"; ss << " int rowNum = -1;\n"; + GenTmpVariables(ss,vSubArguments); int arg=0; CheckSubArgumentIsNan(ss,vSubArguments,arg++); int secondParaWidth = 1; - if(vSubArguments[1]->GetFormulaToken()->GetType() == - formula::svDoubleVectorRef) + + if (vSubArguments[1]->GetFormulaToken()->GetType() == formula::svDoubleVectorRef) { FormulaToken *tmpCur = vSubArguments[1]->GetFormulaToken(); - const formula::DoubleVectorRefToken*pCurDVR= static_cast<const - formula::DoubleVectorRefToken *>(tmpCur); + const formula::DoubleVectorRefToken*pCurDVR = static_cast<const formula::DoubleVectorRefToken *>(tmpCur); secondParaWidth = pCurDVR->GetArrays().size(); } - arg+=secondParaWidth; + + arg += secondParaWidth; CheckSubArgumentIsNan(ss,vSubArguments,arg++); - if(vSubArguments.size() == (unsigned int)(3+(secondParaWidth-1))) + + if (vSubArguments.size() == (unsigned int)(3+(secondParaWidth-1))) { ss << " double tmp"; ss << 3+(secondParaWidth-1); @@ -64,53 +66,57 @@ void OpVLookup::GenSlidingWindowFunction(std::stringstream &ss, CheckSubArgumentIsNan(ss,vSubArguments,arg++); } - if(vSubArguments[1]->GetFormulaToken()->GetType() == - formula::svDoubleVectorRef) + if (vSubArguments[1]->GetFormulaToken()->GetType() == formula::svDoubleVectorRef) { FormulaToken *tmpCur = vSubArguments[1]->GetFormulaToken(); - const formula::DoubleVectorRefToken*pCurDVR= static_cast<const - formula::DoubleVectorRefToken *>(tmpCur); - size_t nCurWindowSize = pCurDVR->GetArrayLength() < - pCurDVR->GetRefRowSize() ? pCurDVR->GetArrayLength(): - pCurDVR->GetRefRowSize() ; + const formula::DoubleVectorRefToken*pCurDVR = static_cast<const formula::DoubleVectorRefToken *>(tmpCur); + size_t nCurWindowSize = pCurDVR->GetArrayLength() < pCurDVR->GetRefRowSize() ? pCurDVR->GetArrayLength() : pCurDVR->GetRefRowSize() ; int unrollSize = 8; ss << " int loop;\n"; - if (!pCurDVR->IsStartFixed() && pCurDVR->IsEndFixed()) { + if (!pCurDVR->IsStartFixed() && pCurDVR->IsEndFixed()) + { ss << " loop = ("<<nCurWindowSize<<" - gid0)/"; ss << unrollSize<<";\n"; - } else if (pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()) { + } + else if (pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()) + { ss << " loop = ("<<nCurWindowSize<<" + gid0)/"; ss << unrollSize<<";\n"; - } else { + } + else + { ss << " loop = "<<nCurWindowSize<<"/"<< unrollSize<<";\n"; } - for(int i=0;i<secondParaWidth;i++) + for (int i = 0; i < secondParaWidth; i++) { - ss << " for ( int j = 0;j< loop; j++)\n"; ss << " {\n"; ss << " int i = "; - if (!pCurDVR->IsStartFixed()&& pCurDVR->IsEndFixed()) { - ss << "gid0 + j * "<< unrollSize <<";\n"; - }else { - ss << "j * "<< unrollSize <<";\n"; + if (!pCurDVR->IsStartFixed()&& pCurDVR->IsEndFixed()) + { + ss << "gid0 + j * "<< unrollSize <<";\n"; } - if(!pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()) + else { - ss << " int doubleIndex = i+gid0;\n"; - }else + ss << "j * "<< unrollSize <<";\n"; + } + if (!pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()) { - ss << " int doubleIndex = i;\n"; + ss << " int doubleIndex = i+gid0;\n"; + } + else + { + ss << " int doubleIndex = i;\n"; } ss << " if(tmp"; ss << 3+(secondParaWidth-1); ss << " == 1)\n"; ss << " {\n"; - for(int j =0;j < unrollSize;j++) + for (int j = 0;j < unrollSize; j++) { CheckSubArgumentIsNan(ss,vSubArguments,1+i); @@ -131,7 +137,7 @@ void OpVLookup::GenSlidingWindowFunction(std::stringstream &ss, ss << " }else\n"; ss << " {\n"; - for(int j =0;j < unrollSize;j++) + for (int j = 0; j < unrollSize; j++) { CheckSubArgumentIsNan(ss,vSubArguments,1+i); @@ -149,15 +155,14 @@ void OpVLookup::GenSlidingWindowFunction(std::stringstream &ss, ss << " }\n"; ss << " if(rowNum!=-1)\n"; ss << " {\n"; - for(int j=0;j< secondParaWidth; j++) + for (int j = 0; j < secondParaWidth; j++) { - ss << " if(tmp"; ss << 2+(secondParaWidth-1); ss << " == "; ss << j+1; ss << ")\n"; - if( !(vSubArguments[1+j]->IsMixedArgument())) + if (!(vSubArguments[1+j]->IsMixedArgument())) { ss << " {\n"; ss << " tmp = "; @@ -183,21 +188,27 @@ void OpVLookup::GenSlidingWindowFunction(std::stringstream &ss, ss << " return tmp;\n"; ss << " }\n"; ss << " for (int i = "; - if (!pCurDVR->IsStartFixed() && pCurDVR->IsEndFixed()) { - ss << "gid0 + loop *"<<unrollSize<<"; i < "; - ss << nCurWindowSize <<"; i++)\n"; - } else if (pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()) { - ss << "0 + loop *"<<unrollSize<<"; i < gid0+"; - ss << nCurWindowSize <<"; i++)\n"; - } else { - ss << "0 + loop *"<<unrollSize<<"; i < "; - ss << nCurWindowSize <<"; i++)\n"; + if (!pCurDVR->IsStartFixed() && pCurDVR->IsEndFixed()) + { + ss << "gid0 + loop *"<<unrollSize<<"; i < "; + ss << nCurWindowSize <<"; i++)\n"; + } + else if (pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()) + { + ss << "0 + loop *"<<unrollSize<<"; i < gid0+"; + ss << nCurWindowSize <<"; i++)\n"; + } + else + { + ss << "0 + loop *"<<unrollSize<<"; i < "; + ss << nCurWindowSize <<"; i++)\n"; } ss << " {\n"; - if(!pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()) + if (!pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()) { ss << " int doubleIndex = i+gid0;\n"; - }else + } + else { ss << " int doubleIndex = i;\n"; } @@ -232,16 +243,15 @@ void OpVLookup::GenSlidingWindowFunction(std::stringstream &ss, ss << " if(rowNum!=-1)\n"; ss << " {\n"; - for(int j=0;j< secondParaWidth; j++) + for (int j = 0; j < secondParaWidth; j++) { - ss << " if(tmp"; ss << 2+(secondParaWidth-1); ss << " == "; ss << j+1; ss << ")\n"; ///Add MixedArguments for string support in Vlookup. - if( !(vSubArguments[1+j]->IsMixedArgument())) + if (!(vSubArguments[1+j]->IsMixedArgument())) { ss << " tmp = "; vSubArguments[1+j]->GenDeclRef(ss); @@ -257,13 +267,11 @@ void OpVLookup::GenSlidingWindowFunction(std::stringstream &ss, vSubArguments[1+j]->GenStringDeclRef(ss); ss << "[rowNum];\n"; } - } ss << " return tmp;\n"; ss << " }\n"; } - } else { |