diff options
author | haochen <haochen@multicorewareinc.com> | 2014-05-13 10:29:11 +0800 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2014-05-19 09:13:24 +0200 |
commit | 2b0a05c7b0eeec7fc75fa80e57c51d5142446e67 (patch) | |
tree | e837884bd60546884a21d5d70fe3962fa38c00bb /sc | |
parent | d72763ce095f0b879e5baa1713a934225ccb39f7 (diff) |
GPU Calc: Fix bug
For arraybound of slidingwindows parameters in COVAR formula
Change-Id: I17a601edfbc720d4e3e40fc31bf6efd73b4ac65b
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/core/opencl/op_statistical.cxx | 214 |
1 files changed, 147 insertions, 67 deletions
diff --git a/sc/source/core/opencl/op_statistical.cxx b/sc/source/core/opencl/op_statistical.cxx index c64588a4fa99..88541e263913 100644 --- a/sc/source/core/opencl/op_statistical.cxx +++ b/sc/source/core/opencl/op_statistical.cxx @@ -8067,21 +8067,31 @@ void OpCovar::GenSlidingWindowFunction(std::stringstream& ss, size_t nCurWindowSizeY = pCurDVRY->GetRefRowSize(); if(nCurWindowSizeX == nCurWindowSizeY) { - ss << " for(int i = "; + ss << " for( "; if (!pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) { - ss << "gid0; i < " << nCurWindowSizeX << "; i++) {\n"; - ss << " arg0 = "; - ss << vSubArguments[0]->GenSlidingWindowDeclRef()<< ";\n"; - ss << " arg1 = "; - ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n"; -#ifdef ISNAN - ss << " if(isNan(arg0) || isNan(arg1) || (i >= "; - ss << pCurDVRX->GetArrayLength() << ") || (i >="; - ss << pCurDVRY->GetArrayLength() << ")) {\n"; + ss << "int i = gid0; i < " << nCurWindowSizeX; + ss << " && i < " << pCurDVRX->GetArrayLength() << " && i < "; + ss << pCurDVRY->GetArrayLength() << "; i++){\n"; +#ifdef ISNAN + ss << " if(isNan("; + ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ") ||"; + ss << " isNan("<< vSubArguments[1]->GenSlidingWindowDeclRef(); + ss << ")) {\n"; ss << " arg0 = 0.0;\n"; ss << " arg1 = 0.0;\n"; ss << " --cnt;\n"; ss << " }\n"; + ss << "else{\n"; + ss << " arg0 = "; + ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; + ss << " arg1 = "; + ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n"; + ss << "}\n"; +#else + ss << " arg0 = "; + ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; + ss << " arg1 = "; + ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n"; #endif ss << " ++cnt;\n"; ss << " vSum0 += arg0;\n"; @@ -8089,19 +8099,28 @@ void OpCovar::GenSlidingWindowFunction(std::stringstream& ss, ss << " }\n"; } else if (pCurDVRX->IsStartFixed() && !pCurDVRX->IsEndFixed()) { - ss << "0; i < gid0 + " << nCurWindowSizeX << "; i++) {\n"; - ss << " arg0 = "; - ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; - ss << " arg1 = "; - ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n"; + ss << "int i = 0; i < gid0 + " << nCurWindowSizeX << " && "; + ss << " i < " << pCurDVRX->GetArrayLength() << " && "; + ss << " i < " << pCurDVRY->GetArrayLength() << "; i++) {\n"; #ifdef ISNAN - ss << " if(isNan(arg0) || isNan(arg1) || (i >= "; - ss << pCurDVRX->GetArrayLength() << ") || (i >="; - ss << pCurDVRY->GetArrayLength() << ")) {\n"; + ss << " if(isNan("; + ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ") ||"; + ss << " isNan(" << vSubArguments[1]->GenSlidingWindowDeclRef(); + ss << ")) {\n"; ss << " arg0 = 0.0;\n"; ss << " arg1 = 0.0;\n"; ss << " --cnt;\n"; ss << " }\n"; + ss << "else{\n"; + ss << " arg0 = "; + ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; + ss << " arg1 = "; + ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";}\n"; +#else + ss << " arg0 = "; + ss << vSubArguments[0]->GenSlidingWindowDeclRef()<< ";\n"; + ss << " arg1 = "; + ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n"; #endif ss << " ++cnt;\n"; ss << " vSum0 += arg0;\n"; @@ -8109,19 +8128,28 @@ void OpCovar::GenSlidingWindowFunction(std::stringstream& ss, ss << " }\n"; } else if (pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) { - ss << "0; i < " << nCurWindowSizeX << "; i++) {\n"; - ss << " arg0 = "; - ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; - ss << " arg1 = "; - ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n"; + ss << "int i = 0; i < " << nCurWindowSizeX << " && i < "; + ss << pCurDVRX->GetArrayLength() << " && i < "; + ss << pCurDVRY->GetArrayLength() << "; i++) {\n"; #ifdef ISNAN - ss << " if(isNan(arg0) || isNan(arg1) || (i >= "; - ss << pCurDVRX->GetArrayLength() << ") || (i >="; - ss << pCurDVRY->GetArrayLength() << ")) {\n"; + ss << " if(isNan("; + ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ") ||"; + ss << " isNan(" << vSubArguments[1]->GenSlidingWindowDeclRef(); + ss << ")) {\n"; ss << " arg0 = 0.0;\n"; ss << " arg1 = 0.0;\n"; ss << " --cnt;\n"; ss << " }\n"; + ss << "else{\n"; + ss << " arg0 = "; + ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; + ss << " arg1 = "; + ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";}\n"; +#else + ss << " arg0 = "; + ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; + ss << " arg1 = "; + ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n"; #endif ss << " ++cnt;\n"; ss << " vSum0 += arg0;\n"; @@ -8129,19 +8157,30 @@ void OpCovar::GenSlidingWindowFunction(std::stringstream& ss, ss << " }\n"; } else { - ss << "0; i < " << nCurWindowSizeX << "; i++) {\n"; - ss << " arg0 = "; - ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; - ss << " arg1 = "; - ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n"; + ss << "int i = 0; i < " << nCurWindowSizeX << " && "; + ss << " i + gid0 < " << pCurDVRX->GetArrayLength(); + ss << " && i + gid0 < " << pCurDVRX->GetArrayLength(); + ss << "; i++) {\n"; #ifdef ISNAN - ss << " if(isNan(arg0) || isNan(arg1) || (i + gid0 >= "; - ss << pCurDVRX->GetArrayLength() << ") || (i + gid0 >="; - ss << pCurDVRY->GetArrayLength() << ")) {\n"; + ss << "if ((isNan("; + ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ")) || "; + ss << "(isNan("<< vSubArguments[1]->GenSlidingWindowDeclRef(); + ss << "))) {\n"; ss << " arg0 = 0.0;\n"; ss << " arg1 = 0.0;\n"; ss << " --cnt;\n"; ss << " }\n"; + ss << " else {\n"; + ss << " arg0 = "; + ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; + ss << " arg1 = "; + ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n"; + ss << " }\n"; +#else + ss << " arg0 = "; + ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; + ss << " arg1 = "; + ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n"; #endif ss << " ++cnt;\n"; ss << " vSum0 += arg0;\n"; @@ -8154,68 +8193,109 @@ void OpCovar::GenSlidingWindowFunction(std::stringstream& ss, ss << " else {\n"; ss << " vMean0 = vSum0 / cnt;\n"; ss << " vMean1 = vSum1 / cnt;\n"; - ss << " for(int i = "; + ss << " for("; if (!pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) { - ss << "gid0; i < " << nCurWindowSizeX << "; i++) {\n"; - ss << "arg0 = " << vSubArguments[0]->GenSlidingWindowDeclRef() - << ";\n"; - ss << "arg1 = " << vSubArguments[1]->GenSlidingWindowDeclRef() - << ";\n"; + ss << "int i = gid0; i < " << nCurWindowSizeX; + ss << " && i < " << pCurDVRX->GetArrayLength() << " && i < "; + ss << pCurDVRY->GetArrayLength() << "; i++){\n"; #ifdef ISNAN - ss << " if(isNan(arg0) || isNan(arg1) || (i >= "; - ss << pCurDVRX->GetArrayLength() << ") || (i >="; - ss << pCurDVRY->GetArrayLength() << ")) {\n"; + ss << " if(isNan("; + ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ") ||"; + ss << " isNan(" << vSubArguments[1]->GenSlidingWindowDeclRef(); + ss << ")){\n"; ss << " arg0 = vMean0;\n"; ss << " arg1 = vMean1;\n"; ss << " }\n"; -#endif - ss << " vSum += (arg0 - vMean0) * (arg1 - vMean1);\n"; - ss << " }\n"; - } else if (pCurDVRX->IsStartFixed() && !pCurDVRX->IsEndFixed()) { - ss << "0; i < gid0 + " << nCurWindowSizeX << "; i++) {\n"; + ss << " else{\n"; + ss << " arg0 = "; + ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; + ss << " arg1 = "; + ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";}\n"; +#else ss << " arg0 = "; ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; ss << " arg1 = "; ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n"; +#endif + ss << " vSum += (arg0 - vMean0) * (arg1 - vMean1);\n"; + ss << " }\n"; + } + else if (pCurDVRX->IsStartFixed() && !pCurDVRX->IsEndFixed()) { + ss << "int i = 0; i < gid0 + " << nCurWindowSizeX << " && "; + ss << " i < " << pCurDVRX->GetArrayLength() << " && "; + ss << " i < " << pCurDVRY->GetArrayLength() << "; i++) {\n"; #ifdef ISNAN - ss << " if(isNan(arg0) || isNan(arg1) || (i >= "; - ss << pCurDVRX->GetArrayLength() << ") || (i >="; - ss << pCurDVRY->GetArrayLength() << ")) {\n"; + ss << " if(isNan("; + ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ") || "; + ss << "isNan(" << vSubArguments[1]->GenSlidingWindowDeclRef(); + ss << ")) {\n"; ss << " arg0 = vMean0;\n"; ss << " arg1 = vMean1;\n"; ss << " }\n"; -#endif - ss << " vSum += (arg0 - vMean0) * (arg1 - vMean1);\n"; - ss << " }\n"; - } else if (pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) { - ss << "0; i < " << nCurWindowSizeX << "; i++) {\n"; + ss << "else{\n"; + ss << " arg0 = "; + ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; + ss << " arg1 = "; + ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";}\n"; +#else ss << " arg0 = "; ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; ss << " arg1 = "; ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n"; +#endif + ss << " vSum += (arg0 - vMean0) * (arg1 - vMean1);\n"; + ss << " }\n"; + } + else if (pCurDVRX->IsStartFixed() && pCurDVRX->IsEndFixed()) { + ss << "int i = 0; i < " << nCurWindowSizeX << " && i < "; + ss << pCurDVRX->GetArrayLength() << " && i < "; + ss << pCurDVRY->GetArrayLength() << "; i++) {\n"; #ifdef ISNAN - ss << " if(isNan(arg0) || isNan(arg1) || (i >= "; - ss << pCurDVRX->GetArrayLength() << ") || (i >="; - ss << pCurDVRY->GetArrayLength() << ")) {\n"; + ss << " if(isNan("; + ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ") || "; + ss << "isNan(" << vSubArguments[1]->GenSlidingWindowDeclRef(); + ss << ")) {\n"; ss << " arg0 = vMean0;\n"; ss << " arg1 = vMean1;\n"; ss << " }\n"; -#endif - ss << " vSum += (arg0 - vMean0) * (arg1 - vMean1);\n"; - ss << " }\n"; - } else { - ss << "0; i < " << nCurWindowSizeX << "; i++) {\n"; + ss << "else{\n"; + ss << " arg0 = "; + ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; + ss << " arg1 = "; + ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";}\n"; +#else ss << " arg0 = "; ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; ss << " arg1 = "; ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n"; +#endif + ss << " vSum += (arg0 - vMean0) * (arg1 - vMean1);\n"; + ss << " }\n"; + } + else { + ss << "int i = 0; i < " << nCurWindowSizeX << " && "; + ss << " i + gid0 < " << pCurDVRX->GetArrayLength(); + ss << " && i + gid0 < " << pCurDVRX->GetArrayLength(); + ss << "; i++) {\n"; #ifdef ISNAN - ss << " if(isNan(arg0) || isNan(arg1) || (i + gid0 >= "; - ss << pCurDVRX->GetArrayLength() << ") || (i + gid0 >= "; - ss << pCurDVRY->GetArrayLength() << ")) {\n"; + ss << "if((isNan("; + ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ")) || "; + ss << "(isNan(" << vSubArguments[1]->GenSlidingWindowDeclRef(); + ss << "))) {\n"; ss << " arg0 = vMean0;\n"; ss << " arg1 = vMean1;\n"; ss << " }\n"; + ss << " else{\n"; + ss << " arg0 = "; + ss << vSubArguments[0]->GenSlidingWindowDeclRef() << ";\n"; + ss << " arg1 = "; + ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n"; + ss << " }\n"; +#else + ss << " arg0 = "; + ss << vSubArguments[0]->GenSlidingWindowDeclRef()<< ";\n"; + ss << " arg1 = "; + ss << vSubArguments[1]->GenSlidingWindowDeclRef() << ";\n"; #endif ss << " vSum += (arg0 - vMean0) * (arg1 - vMean1);\n"; ss << " }\n"; |