fix bug #3678 (cuda::integral failures)
authorVladislav Vinogradov <vlad.vinogradov@itseez.com>
Wed, 14 May 2014 08:48:12 +0000 (12:48 +0400)
committerVladislav Vinogradov <vlad.vinogradov@itseez.com>
Wed, 14 May 2014 08:48:12 +0000 (12:48 +0400)
modules/cudaarithm/test/test_reductions.cpp
modules/cudev/include/opencv2/cudev/grid/detail/integral.hpp

index 5fd7e2d..e3c5405 100644 (file)
@@ -850,7 +850,7 @@ CUDA_TEST_P(Integral, Accuracy)
 
 INSTANTIATE_TEST_CASE_P(CUDA_Arithm, Integral, testing::Combine(
     ALL_DEVICES,
-    DIFFERENT_SIZES,
+    testing::Values(cv::Size(128, 128), cv::Size(113, 113), cv::Size(768, 1066)),
     WHOLE_SUBMAT));
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////////
index 5c90e99..7af5265 100644 (file)
@@ -439,8 +439,6 @@ namespace integral_detail
 
             T sum = (tidx < cols) && (y < rows) ? *p : 0;
 
-            y += blockDim.y;
-
             sums[threadIdx.x][threadIdx.y] = sum;
             __syncthreads();
 
@@ -467,14 +465,17 @@ namespace integral_detail
             if (threadIdx.y > 0)
                 sum += sums[threadIdx.x][threadIdx.y - 1];
 
-            if (tidx < cols)
+            sum += stepSum;
+            stepSum += sums[threadIdx.x][blockDim.y - 1];
+
+            __syncthreads();
+
+            if ((tidx < cols) && (y < rows))
             {
-                sum += stepSum;
-                stepSum += sums[threadIdx.x][blockDim.y - 1];
                 *p = sum;
             }
 
-            __syncthreads();
+            y += blockDim.y;
         }
     #else
         __shared__ T smem[32][32];