summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorhaochen <haochen@multicorewareinc.com>2014-05-13 10:29:11 +0800
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2014-05-19 09:13:24 +0200
commit2b0a05c7b0eeec7fc75fa80e57c51d5142446e67 (patch)
treee837884bd60546884a21d5d70fe3962fa38c00bb /sc
parentd72763ce095f0b879e5baa1713a934225ccb39f7 (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.cxx214
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";