diff options
author | hongyu zhong <hongyu@multicorewareinc.com> | 2013-12-10 10:53:41 +0800 |
---|---|---|
committer | I-Jui (Ray) Sung <ray@multicorewareinc.com> | 2013-12-19 01:12:42 -0600 |
commit | d5dac04897ca6953c72f7d4563c7f7ffd9c962c4 (patch) | |
tree | 10b078d035b1941fe084170cbb07fb40fcfc3a64 /sc | |
parent | 19013b913249c035e8519a46b9634b675e2026f1 (diff) |
GPU Calc: Optimized NORMINV
AMLOEXT-285
Change-Id: I362d51a2e1dd750dfbafc7a8830c4a8b7611daed
Signed-off-by: haochen <haochen@multicorewareinc.com>
Signed-off-by: Wei Wei <weiwei@multicorewareinc.com>
Signed-off-by: I-Jui (Ray) Sung <ray@multicorewareinc.com>
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/core/opencl/op_statistical.cxx | 91 |
1 files changed, 46 insertions, 45 deletions
diff --git a/sc/source/core/opencl/op_statistical.cxx b/sc/source/core/opencl/op_statistical.cxx index 4af1fd367616..d818062acdd0 100644 --- a/sc/source/core/opencl/op_statistical.cxx +++ b/sc/source/core/opencl/op_statistical.cxx @@ -4868,58 +4868,59 @@ void OpNorminv::GenSlidingWindowFunction( ss << "{\n"; ss <<" double q,t,z;\n"; ss <<" double x,mue,sigma;\n"; + ss <<" double tmp0,tmp1,tmp2;\n"; ss <<" int gid0=get_global_id(0);\n"; -#ifdef ISNAN - FormulaToken *tmpCur0 = vSubArguments[0]->GetFormulaToken(); - const formula::SingleVectorRefToken*tmpCurDVR0= dynamic_cast<const - formula::SingleVectorRefToken *>(tmpCur0); - FormulaToken *tmpCur1 = vSubArguments[1]->GetFormulaToken(); - const formula::SingleVectorRefToken*tmpCurDVR1= dynamic_cast<const - formula::SingleVectorRefToken *>(tmpCur1); - FormulaToken *tmpCur2 = vSubArguments[2]->GetFormulaToken(); - const formula::SingleVectorRefToken*tmpCurDVR2= dynamic_cast<const - formula::SingleVectorRefToken *>(tmpCur2); - ss << " int buffer_x_len = "; - ss << tmpCurDVR0->GetArrayLength(); - ss << ";\n"; - ss << " int buffer_mue_len = "; - ss << tmpCurDVR1->GetArrayLength(); - ss << ";\n"; - ss << " int buffer_sigma_len = "; - ss << tmpCurDVR2->GetArrayLength(); - ss << ";\n"; + 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::svSingleVectorRef) + { +#ifdef ISNAN + const formula::SingleVectorRefToken* pSVR = + dynamic_cast< const formula::SingleVectorRefToken* >(pCur); + ss << "if (gid0 < " << pSVR->GetArrayLength() << "){\n"; #endif -#ifdef ISNAN - ss <<" if((gid0)>=buffer_x_len || isNan("; - ss << vSubArguments[0]->GenSlidingWindowDeclRef(); - ss <<"))\n"; - ss <<" x = 0;\n"; - ss <<" else \n"; + } + else if (pCur->GetType() == formula::svDouble) + { +#ifdef ISNAN + ss << "{\n"; #endif - ss <<" x ="<<vSubArguments[0]->GenSlidingWindowDeclRef(); - ss << ";\n"; -#ifdef ISNAN - ss <<" if((gid0)>=buffer_mue_len || isNan("; - ss << vSubArguments[1]->GenSlidingWindowDeclRef(); - ss <<"))\n"; - ss <<" mue = 0;\n"; - ss <<" else \n"; + } + else + { +#ifdef ISNAN #endif - ss <<" mue ="<<vSubArguments[1]->GenSlidingWindowDeclRef(); - ss << ";\n"; -#ifdef ISNAN - ss <<" if((gid0)>=buffer_sigma_len || isNan("; - ss << vSubArguments[2]->GenSlidingWindowDeclRef(); - ss <<"))\n"; - ss <<" sigma = 0;\n"; - ss <<"else \n"; + } +#ifdef ISNAN + if(ocPush==vSubArguments[i]->GetFormulaToken()->GetOpCode()) + { + ss << " if (isNan("; + ss << vSubArguments[i]->GenSlidingWindowDeclRef(); + ss << "))\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 - ss <<" sigma ="<<vSubArguments[2]->GenSlidingWindowDeclRef(); - ss << ";\n"; + } + ss <<" x = tmp0;\n"; + ss <<" mue = tmp1;\n"; + ss <<" sigma = tmp2;\n"; ss <<" q = x -0.5;\n"; ss <<" if(fabs(q)<=.425)\n"; ss <<" {\n"; - ss <<" t=0.180625-q*q;\n"; + ss <<" t=0.180625-pow(q,2);\n"; ss <<" z=\n" "q*\n" "(\n" @@ -5068,7 +5069,7 @@ void OpNorminv::GenSlidingWindowFunction( "*t+1.0\n" ");\n"; ss<<"}\n"; - ss<<"if(q<0.0) z=-z;\n"; + ss << "z = q < 0.0 ? (-1)*z : z;\n"; ss<<"}\n"; ss<<"double tmp = z*sigma + mue;\n"; ss<<"return tmp;\n"; |