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

GPU Calc: optimize POISSON

Change-Id: I39d7801da3cce2aaaeafa48fbec615e254691661
Signed-off-by: 's avatarI-Jui (Ray) Sung <ray@multicorewareinc.com>
üst fe5218aa
...@@ -6903,56 +6903,56 @@ void OpPoisson::GenSlidingWindowFunction( ...@@ -6903,56 +6903,56 @@ void OpPoisson::GenSlidingWindowFunction(
} }
ss << ")\n"; ss << ")\n";
ss << "{\n"; ss << "{\n";
ss << " double x,lambda,tmp;\n"; ss << " double x,lambda,tmp,tmp0,tmp1,tmp2;\n";
ss << " int bCumulative;\n"; ss << " int bCumulative;\n";
ss << " int gid0=get_global_id(0);\n"; ss << " int gid0=get_global_id(0);\n";
#ifdef ISNAN size_t i = vSubArguments.size();
FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); ss <<"\n ";
const formula::SingleVectorRefToken*tmpCurDVR0= dynamic_cast<const for (i = 0; i < vSubArguments.size(); i++)
formula::SingleVectorRefToken *>(tmpCur0); {
FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken(); FormulaToken *pCur = vSubArguments[i]->GetFormulaToken();
const formula::SingleVectorRefToken*tmpCurDVR1= dynamic_cast<const assert(pCur);
formula::SingleVectorRefToken *>(tmpCur1); if (pCur->GetType() == formula::svSingleVectorRef)
FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken(); {
const formula::SingleVectorRefToken*tmpCurDVR2= dynamic_cast<const #ifdef ISNAN
formula::SingleVectorRefToken *>(tmpCur2); const formula::SingleVectorRefToken* pSVR =
ss << " int buffer_x_len = "; dynamic_cast< const formula::SingleVectorRefToken* >(pCur);
ss << tmpCurDVR0->GetArrayLength(); ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n";
ss << ";\n";
ss << " int buffer_lambda_len = ";
ss << tmpCurDVR1->GetArrayLength();
ss << ";\n";
ss << " int buffer_bCumulative_len = ";
ss << tmpCurDVR2->GetArrayLength();
ss << ";\n";
#endif #endif
#ifdef ISNAN }
ss <<" if((gid0)>=buffer_x_len || isNan("; else if (pCur->GetType() == formula::svDouble)
ss << vSubArguments[0]->GenSlidingWindowDeclRef(); {
ss <<"))\n"; #ifdef ISNAN
ss <<" x = 0;\n"; ss << "{\n";
ss <<" else \n";
#endif #endif
ss <<" x ="<<vSubArguments[0]->GenSlidingWindowDeclRef(); }
ss << ";\n"; else
#ifdef ISNAN {
ss <<" if((gid0)>=buffer_lambda_len || isNan("; #ifdef ISNAN
ss << vSubArguments[1]->GenSlidingWindowDeclRef();
ss <<"))\n";
ss <<" lambda = 0;\n";
ss <<" else \n";
#endif #endif
ss <<" lambda ="<<vSubArguments[1]->GenSlidingWindowDeclRef(); }
ss << ";\n"; #ifdef ISNAN
#ifdef ISNAN if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode())
ss <<" if((gid0)>=buffer_bCumulative_len || isNan("; {
ss << vSubArguments[2]->GenSlidingWindowDeclRef(); ss << " if (isNan(";
ss <<"))\n"; ss << vSubArguments[i]->GenSlidingWindowDeclRef();
ss <<" bCumulative = 0;\n"; ss << "))\n";
ss <<"else \n"; ss << " tmp"<<i<<"= 0;\n";
ss << " else\n";
ss << " tmp"<<i<<"=\n";
ss << vSubArguments[i]->GenSlidingWindowDeclRef();
ss << ";\n}\n";
}
else
{
ss << "tmp"<<i<<"="<<vSubArguments[i]->GenSlidingWindowDeclRef();
ss <<";\n";
}
#endif #endif
ss <<" bCumulative ="<<vSubArguments[2]->GenSlidingWindowDeclRef(); }
ss << ";\n"; ss << " x = floor(tmp0);\n";
ss << " lambda = tmp1;\n";
ss << " bCumulative = tmp2;\n ";
ss << " if (!bCumulative)\n"; ss << " if (!bCumulative)\n";
ss << " {\n"; ss << " {\n";
ss << " if(lambda == 0.0)\n"; ss << " if(lambda == 0.0)\n";
...@@ -6970,7 +6970,7 @@ void OpPoisson::GenSlidingWindowFunction( ...@@ -6970,7 +6970,7 @@ void OpPoisson::GenSlidingWindowFunction(
ss << " {\n"; ss << " {\n";
ss << " double fPoissonVar = 1.0;\n"; ss << " double fPoissonVar = 1.0;\n";
ss << " for ( int f = 0; f < x; ++f )\n"; ss << " for ( int f = 0; f < x; ++f )\n";
ss << " fPoissonVar *= lambda / ( (double)f + 1.0 );\n"; ss << " fPoissonVar *= lambda * pow(( (double)f + 1.0 ),-1);\n";
ss << " tmp = ( fPoissonVar * exp( -lambda ) );\n"; ss << " tmp = ( fPoissonVar * exp( -lambda ) );\n";
ss << " return tmp;\n"; ss << " return tmp;\n";
ss << " }\n"; ss << " }\n";
...@@ -7002,7 +7002,7 @@ void OpPoisson::GenSlidingWindowFunction( ...@@ -7002,7 +7002,7 @@ void OpPoisson::GenSlidingWindowFunction(
ss << " int nEnd = (int) (x + 0.5);\n"; ss << " int nEnd = (int) (x + 0.5);\n";
ss << " for (int i = 1; i <= nEnd; i++)\n"; ss << " for (int i = 1; i <= nEnd; i++)\n";
ss << " {\n"; ss << " {\n";
ss << " fSummand = (fSummand*lambda)/(double)i;\n"; ss << " fSummand = (fSummand*lambda)*pow((double)i,-1);\n";
ss << " fSum += fSummand;\n"; ss << " fSum += fSummand;\n";
ss << " }\n"; ss << " }\n";
ss << " tmp = fSum;\n"; ss << " tmp = fSum;\n";
......
...@@ -900,9 +900,9 @@ std::string lcl_GetGammaHelper = ...@@ -900,9 +900,9 @@ std::string lcl_GetGammaHelper =
" double fGamma = lcl_getLanczosSum(fZ);\n" " double fGamma = lcl_getLanczosSum(fZ);\n"
" double fg = 6.024680040776729583740234375;\n" " double fg = 6.024680040776729583740234375;\n"
" double fZgHelp = fZ + fg - 0.5;\n" " double fZgHelp = fZ + fg - 0.5;\n"
" double fHalfpower = pow( fZgHelp, fZ / 2 - 0.25);\n" " double fHalfpower = pow( fZgHelp, fZ*pow(2,-1.0) - 0.25);\n"
" fGamma *= fHalfpower;\n" " fGamma *= fHalfpower;\n"
" fGamma /= exp(fZgHelp);\n" " fGamma = fGamma*pow(exp(fZgHelp),-1.0);\n"
" fGamma *= fHalfpower;\n" " fGamma *= fHalfpower;\n"
" fGamma = 120.4;\n" " fGamma = 120.4;\n"
" if (fZ <= 20.0 && fZ == (int)fZ)\n" " if (fZ <= 20.0 && fZ == (int)fZ)\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