Kaydet (Commit) 4873228b authored tarafından mingli's avatar mingli Kaydeden (comit) I-Jui (Ray) Sung

GPU Calc: Optimized HARMEAN

AMLOEXT-258

Change-Id: I0673fe55aedbce3d7f6618b51ede155859f2f295
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 65a73c40
......@@ -3926,9 +3926,9 @@ void OpGeoMean::GenSlidingWindowFunction(
ss << "return tmp;\n";
ss << "}";
}
void OpHarMean::GenSlidingWindowFunction(
std::stringstream &ss, const std::string sSymName, SubArguments &vSubArguments)
std::stringstream &ss, const std::string sSymName, SubArguments &
vSubArguments)
{
FormulaToken *pCur = vSubArguments[0]->GetFormulaToken();
assert(pCur);
......@@ -3943,25 +3943,54 @@ void OpHarMean::GenSlidingWindowFunction(
ss << ",";
vSubArguments[i]->GenSlidingWindowDecl(ss);
}
ss << ") {\n\t";
ss << "int gid0 = get_global_id(0);\n\t";
ss << "double nVal=0.0;\n\t";
ss << "int length="<<nCurWindowSize;
ss << ";\n\tdouble tmp = 0;\n\t";
ss << "for (int i = 0; i <" << nCurWindowSize << "; i++)\n\t";
ss << "{\n\t";
ss << "double arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef();
ss << ";\n\t";
ss << ") {\n";
ss << " int gid0 = get_global_id(0);\n";
ss << " double nVal=0.0;\n";
ss << " int length="<<nCurWindowSize<<";\n";
ss << " double tmp = 0;\n";
for (unsigned 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 = ";
#ifdef ISNAN
ss << "0; i < "<< nCurWindowSize << "; i++){\n";
ss << " double arg"<<i<<" = ";
ss << vSubArguments[i]->GenSlidingWindowDeclRef();
ss << ";\n";
#ifdef ISNAN
ss<< "if(isNan(arg0)||((gid0+i)>=";
ss<<pCurDVR->GetArrayLength();
ss<<"))\n\t{";
ss<<"length--;\n\t";
ss<<"continue;\n\t}\n\t";
ss << " if(isNan(arg"<<i<<")||((gid0+i)>=";
ss << pDVR->GetArrayLength();
ss << "))\n";
ss << " {\n";
ss << " length--;\n";
ss << " continue;\n";
ss << " }\n";
#endif
ss << "nVal += (1.0/arg0);\n\t}\n\t";
ss<<"tmp = length/nVal;\n\t";
ss << "return tmp;\n";
ss << " nVal += pow(arg"<<i<<",-1);\n";
ss << " }\n";
#endif
}
else if (pCur->GetType() == formula::svSingleVectorRef)
{
#ifdef ISNAN
ss << "return HUGE_VAL";
#endif
}
else if (pCur->GetType() == formula::svDouble)
{
#ifdef ISNAN
ss << "return HUGE_VAL";
#endif
}
}
ss << " tmp = length/nVal;\n\t";
ss << " return tmp;\n";
ss << "}";
}
......
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