Kaydet (Commit) 25c06219 authored tarafından Wei Wei's avatar Wei Wei Kaydeden (comit) I-Jui (Ray) Sung

GPU Calc: optimize countifs

Change-Id: Id378cf89b0742b23c8282148223cb4a7d4317aac
Signed-off-by: 's avatarI-Jui (Ray) Sung <ray@multicorewareinc.com>
üst c0d1c49b
...@@ -394,48 +394,38 @@ void OpCountIfs::GenSlidingWindowFunction(std::stringstream &ss, ...@@ -394,48 +394,38 @@ void OpCountIfs::GenSlidingWindowFunction(std::stringstream &ss,
} }
ss << ")\n {\n"; ss << ")\n {\n";
ss <<" int gid0=get_global_id(0);\n"; ss <<" int gid0=get_global_id(0);\n";
ss << " double tmp =0;\n"; ss << " int tmp =0;\n";
ss << " int i ;\n"; ss << " int loop;\n";
GenTmpVariables(ss,vSubArguments); 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";
}
ss << " {\n";
if(!pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed())
{
ss<< " int doubleIndex =i+gid0;\n";
}else
{
ss<< " int doubleIndex =i;\n";
}
ss<< " int singleIndex =gid0;\n"; ss<< " int singleIndex =gid0;\n";
int m=0; int m=0;
std::stringstream tmpss;
for(unsigned j=0;j<vSubArguments.size();j+=2,m++) for(unsigned j=0;j<vSubArguments.size();j+=2,m++)
{ {
CheckSubArgumentIsNan(ss,vSubArguments,j); CheckSubArgumentIsNan(tmpss,vSubArguments,j);
CheckSubArgumentIsNan(ss,vSubArguments,j+1); CheckSubArgumentIsNan(ss,vSubArguments,j+1);
ss <<" if(isequal("; tmpss <<" if(isequal(";
ss <<"tmp"; tmpss <<"tmp";
ss <<j; tmpss <<j;
ss <<" , "; tmpss <<" , ";
ss << "tmp"; tmpss << "tmp";
ss << j+1; tmpss << j+1;
ss << ")){\n"; tmpss << ")){\n";
} }
ss << " tmp =tmp +1;\n"; tmpss << " tmp ++;\n";
for(unsigned j=0;j<=vSubArguments.size();j+=2,m--) for(unsigned j=0;j<vSubArguments.size();j+=2,m--)
{ {
for(int n = 0;n<m+1;n++) for(int n = 0;n<m+1;n++)
{ {
ss << " "; tmpss << " ";
} }
ss<< "}\n"; tmpss<< "}\n";
} }
UnrollDoubleVector(ss,tmpss,pCurDVR,nCurWindowSize);
ss << "return tmp;\n"; ss << "return tmp;\n";
ss << "}"; ss << "}";
} }
......
...@@ -9,8 +9,6 @@ ...@@ -9,8 +9,6 @@
#include "opbase.hxx" #include "opbase.hxx"
#include "formula/vectortoken.hxx"
using namespace formula; using namespace formula;
namespace sc { namespace opencl { namespace sc { namespace opencl {
...@@ -224,6 +222,69 @@ void CheckVariables::CheckAllSubArgumentIsNan( ...@@ -224,6 +222,69 @@ void CheckVariables::CheckAllSubArgumentIsNan(
} }
} }
void CheckVariables::UnrollDoubleVector( std::stringstream & ss,
std::stringstream & unrollstr,const formula::DoubleVectorRefToken* pCurDVR,
int nCurWindowSize)
{
int unrollSize = 16;
if (!pCurDVR->IsStartFixed() && pCurDVR->IsEndFixed()) {
ss << " loop = ("<<nCurWindowSize<<" - gid0)/";
ss << unrollSize<<";\n";
} else if (pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed()) {
ss << " loop = ("<<nCurWindowSize<<" + gid0)/";
ss << unrollSize<<";\n";
} else {
ss << " loop = "<<nCurWindowSize<<"/"<< unrollSize<<";\n";
}
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 << " int doubleIndex = i+gid0;\n";
}else
{
ss << " int doubleIndex = i;\n";
}
for(int j =0;j < unrollSize;j++)
{
ss << unrollstr.str();
ss << "i++;\n";
ss << "doubleIndex++;\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";
}
ss << " {\n";
if(!pCurDVR->IsStartFixed() && !pCurDVR->IsEndFixed())
{
ss << " int doubleIndex = i+gid0;\n";
}else
{
ss << " int doubleIndex = i;\n";
}
ss << unrollstr.str();
ss << " }\n";
}
}} }}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
#include "clcc/clew.h" #include "clcc/clew.h"
#include "formula/token.hxx" #include "formula/token.hxx"
#include "formula/vectortoken.hxx"
#include <boost/shared_ptr.hpp> #include <boost/shared_ptr.hpp>
#include <boost/noncopyable.hpp> #include <boost/noncopyable.hpp>
#include <set> #include <set>
...@@ -266,6 +266,9 @@ public: ...@@ -266,6 +266,9 @@ public:
// only check isNan // only check isNan
void CheckSubArgumentIsNan2(std::stringstream &ss, void CheckSubArgumentIsNan2(std::stringstream &ss,
SubArguments &vSubArguments, int argumentNum, std::string p); SubArguments &vSubArguments, int argumentNum, std::string p);
void UnrollDoubleVector(std::stringstream &ss,
std::stringstream &unrollstr, const formula::DoubleVectorRefToken* pCurDVR,
int nCurWindowSize);
}; };
}} }}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment