Kaydet (Commit) 3005ed48 authored tarafından hongyu zhong's avatar hongyu zhong Kaydeden (comit) I-Jui (Ray) Sung

GPU Calc: Optimized RSQ

AMLOEXT-280

Change-Id: I92bc0daeb74e7322479e4f8e57b816b7de45b1b0
Signed-off-by: 's avatarhaochen <haochen@multicorewareinc.com>
Signed-off-by: 's avatarWei Wei <weiwei@multicorewareinc.com>
Signed-off-by: 's avatarI-Jui (Ray) Sung <ray@multicorewareinc.com>
üst c616d728
...@@ -4266,16 +4266,73 @@ void OpRsq::GenSlidingWindowFunction( ...@@ -4266,16 +4266,73 @@ void OpRsq::GenSlidingWindowFunction(
vSubArguments[i]->GenSlidingWindowDecl(ss); vSubArguments[i]->GenSlidingWindowDecl(ss);
} }
ss << ")\n"; ss << ")\n";
ss << "{\n\t"; ss << "{\n";
ss << "int gid0=get_global_id(0);\n\t"; ss << " int gid0=get_global_id(0);\n";
ss << "double fCount = 0.0;\n\t"; ss << " double fCount = 0.0;\n";
ss << "double fSumX = 0.0;\n\t"; ss << " double fSumX = 0.0;\n";
ss << "double fSumY = 0.0;\n\t"; ss << " double fSumY = 0.0;\n";
ss << "double fSumDeltaXDeltaY = 0.0;\n\t"; ss << " double fSumDeltaXDeltaY = 0.0;\n";
ss << "double fSumSqrDeltaX = 0.0;\n\t"; ss << " double fInx;\n";
ss << "double fSumSqrDeltaY = 0.0;\n\t"; ss << " double fIny;\n";
ss << "double fInx;\n\t"; ss << " double tmp0,tmp1;\n";
ss << "double fIny;\n\t"; size_t i = vSubArguments.size();
ss <<"\n";
for (i = 0; i < vSubArguments.size(); i++)
{
FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
assert(pCur);
if (pCur->GetType() == formula::svDoubleVectorRef)
{
const formula::DoubleVectorRefToken* pDVR =
dynamic_cast<const formula::DoubleVectorRefToken *>(pCur);
size_t nCurWindowSize = pDVR->GetRefRowSize();
ss << "for (int i = ";
if (!pDVR->IsStartFixed() && pDVR->IsEndFixed()) {
#ifdef ISNAN
ss << "gid0; i < " << pDVR->GetArrayLength();
ss << " && i < " << nCurWindowSize << "; i++){\n";
#else
ss << "gid0; i < "<< nCurWindowSize << "; i++)\n";
#endif
} else if (pDVR->IsStartFixed() && !pDVR->IsEndFixed()) {
#ifdef ISNAN
ss << "0; i < " << pDVR->GetArrayLength();
ss << " && i < gid0+"<< nCurWindowSize << "; i++){\n";
#else
ss << "0; i < gid0+"<< nCurWindowSize << "; i++)\n";
#endif
} else if (!pDVR->IsStartFixed() && !pDVR->IsEndFixed()){
#ifdef ISNAN
ss << "0; i + gid0 < " << pDVR->GetArrayLength();
ss << " && i < "<< nCurWindowSize << "; i++){\n";
#else
ss << "0; i < "<< nCurWindowSize << "; i++)\n";
#endif
}
else {
#ifdef ISNAN
ss << "0; i < "<< nCurWindowSize << "; i++){\n";
#else
ss << "0; i < "<< nCurWindowSize << "; i++)\n";
#endif
}
}
else if (pCur->GetType() == formula::svSingleVectorRef)
{
#ifdef ISNAN
const formula::SingleVectorRefToken* pSVR =
dynamic_cast< const formula::SingleVectorRefToken* >(pCur);
ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n";
#endif
}
else if (pCur->GetType() == formula::svDouble)
{
#ifdef ISNAN
ss << "{\n";
#endif
}
ss << "\n}\n";
}
#ifdef ISNAN #ifdef ISNAN
FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken();
const formula::DoubleVectorRefToken*tmpCurDVR0= dynamic_cast<const const formula::DoubleVectorRefToken*tmpCurDVR0= dynamic_cast<const
...@@ -4283,54 +4340,53 @@ void OpRsq::GenSlidingWindowFunction( ...@@ -4283,54 +4340,53 @@ void OpRsq::GenSlidingWindowFunction(
FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken(); FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken();
const formula::DoubleVectorRefToken*tmpCurDVR1= dynamic_cast<const const formula::DoubleVectorRefToken*tmpCurDVR1= dynamic_cast<const
formula::DoubleVectorRefToken *>(tmpCur1); formula::DoubleVectorRefToken *>(tmpCur1);
ss<< "int buffer_fInx_len = "; ss << " int buffer_fInx_len = ";
ss<< tmpCurDVR0->GetArrayLength(); ss << tmpCurDVR0->GetArrayLength();
ss << ";\n\t"; ss << ";\n";
ss << " int buffer_fIny_len = ";
ss<< "int buffer_fIny_len = "; ss << tmpCurDVR1->GetArrayLength();
ss<< tmpCurDVR1->GetArrayLength(); ss << ";\n";
ss << ";\n\t";
#endif #endif
ss << "for(int i=0; i<"<<nCurWindowSize<<"; i++)\n\t"; ss << " for(int i=0; i<"<<nCurWindowSize<<"; i++)\n";
ss << "{\n\t"; ss << " {\n";
#ifdef ISNAN #ifdef ISNAN
ss<<"if((gid0+i)>=buffer_fInx_len || isNan("; ss << " if((gid0+i)>=buffer_fInx_len || isNan(";
ss << vSubArguments[0]->GenSlidingWindowDeclRef(); ss << vSubArguments[0]->GenSlidingWindowDeclRef();
ss<<"))\n\t\t"; ss << "))\n";
ss<<"fInx = 0;\n\telse \n\t"; ss << " fInx = 0;\n";
ss << " else\n";
#endif #endif
ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef(); ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
ss << " ;\n\t"; ss << ";\n";
#ifdef ISNAN #ifdef ISNAN
ss<<"if((gid0+i)>=buffer_fIny_len || isNan("; ss << " if((gid0+i)>=buffer_fIny_len || isNan(";
ss << vSubArguments[1]->GenSlidingWindowDeclRef(); ss << vSubArguments[1]->GenSlidingWindowDeclRef();
ss<<"))\n\t\t"; ss << "))\n";
ss<<"fIny = 0;\n\telse \n\t"; ss << " fIny = 0;\n";
#endif ss << " else\n";
ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef(); #endif
ss << " ;\n\t"; ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef();
ss << " double fValX = fInx;\n\t"; ss << " ;\n";
ss << " double fValY = fIny;\n\t"; ss << " fSumX += fInx;\n";
ss << " fSumX += fValX;\n\t"; ss << " fSumY += fIny;\n";
ss << " fSumY += fValY;\n\t"; ss << " fCount = fCount + 1;\n";
ss << " fCount = fCount + 1;\n\t"; ss << " }\n";
ss << "}\n\t"; ss << " double fMeanX = fSumX / fCount;\n";
ss << "const double fMeanX = fSumX / fCount;\n\t"; ss << " double fMeanY = fSumY / fCount;\n";
ss << "const double fMeanY = fSumY / fCount;\n\t"; ss << " fSumX = 0.0;\n";
ss << "for(int i=0; i<"<<nCurWindowSize<<"; i++)\n\t"; ss << " fSumY = 0.0;\n";
ss << "{\n\t"; ss << " for(int i=0; i<"<<nCurWindowSize<<"; i++)\n";
ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef(); ss << " {\n";
ss << " ;\n\t"; ss << " fInx = "<<vSubArguments[0]->GenSlidingWindowDeclRef();
ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef(); ss << " ;\n";
ss << " ;\n\t"; ss << " fIny = "<<vSubArguments[1]->GenSlidingWindowDeclRef();
ss << " const double fValX = fInx;\n\t"; ss << " ;\n";
ss << " const double fValY = fIny;\n\t"; ss << " fSumDeltaXDeltaY += (fInx - fMeanX) * (fIny - fMeanY);\n";
ss << " fSumDeltaXDeltaY += (fValX - fMeanX) * (fValY - fMeanY);\n\t"; ss << " fSumX += pow(fInx - fMeanX,2);\n";
ss << " fSumSqrDeltaX += (fValX - fMeanX) * (fValX - fMeanX);\n\t"; ss << " fSumY += pow(fIny - fMeanY,2);\n";
ss << " fSumSqrDeltaY += (fValY - fMeanY) * (fValY - fMeanY);\n\t"; ss << " }\n";
ss << "}\n\t"; ss << " double tmp = pow( fSumDeltaXDeltaY,2) / (fSumX * fSumY);\n";
ss << "double tmp = ( fSumDeltaXDeltaY / sqrt( fSumSqrDeltaX * fSumSqrDeltaY));\n\t"; ss << " return tmp ;\n";
ss << "return (tmp * tmp);\n";
ss << "}\n"; ss << "}\n";
} }
......
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