Fix fully-connected layer in case of number of rows less than 4
authorDmitry Kurtaev <dmitry.kurtaev+github@gmail.com>
Fri, 13 Jul 2018 10:23:45 +0000 (13:23 +0300)
committerDmitry Kurtaev <dmitry.kurtaev+github@gmail.com>
Fri, 13 Jul 2018 13:35:37 +0000 (16:35 +0300)
modules/dnn/src/ocl4dnn/src/math_functions.cpp
modules/dnn/test/test_halide_layers.cpp

index 8329c14..ea5c2c8 100644 (file)
@@ -612,7 +612,7 @@ bool ocl4dnnGEMV<float>(const CBLAS_TRANSPOSE TransA,
             ret = k.run(1, globalsize, localsize, false);
         }
 
-        if ((row_size % 4) != 0 && ret)
+        if (row_size < 4 || ((row_size % 4) != 0 && ret))
         {
             String kname = format("matvec_mul1_%s", use_half ? "half" : "float");
             ocl::Kernel k_1(kname.c_str(), cv::ocl::dnn::matvec_mul_oclsrc, opts);
index c61f7e3..563ae99 100644 (file)
@@ -104,8 +104,14 @@ TEST_P(Convolution, Accuracy)
     int backendId = get<0>(get<7>(GetParam()));
     int targetId = get<1>(get<7>(GetParam()));
 
-    if ((backendId == DNN_BACKEND_INFERENCE_ENGINE && targetId == DNN_TARGET_MYRIAD) ||
-        (backendId == DNN_BACKEND_OPENCV && targetId == DNN_TARGET_OPENCL_FP16))
+    if (backendId == DNN_BACKEND_INFERENCE_ENGINE && targetId == DNN_TARGET_MYRIAD)
+        throw SkipTestException("");
+
+    // TODO: unstable test cases
+    if (backendId == DNN_BACKEND_OPENCV && (targetId == DNN_TARGET_OPENCL || targetId == DNN_TARGET_OPENCL_FP16) &&
+        inChannels == 6 && outChannels == 9 && group == 1 && inSize == Size(5, 6) &&
+        kernel == Size(3, 1) && stride == Size(1, 1) && pad == Size(0, 1) && dilation == Size(1, 1) &&
+        hasBias)
         throw SkipTestException("");
 
     int sz[] = {outChannels, inChannels / group, kernel.height, kernel.width};
@@ -353,8 +359,7 @@ TEST_P(FullyConnected, Accuracy)
     bool hasBias = get<3>(GetParam());
     int backendId = get<0>(get<4>(GetParam()));
     int targetId = get<1>(get<4>(GetParam()));
-    if (backendId == DNN_BACKEND_INFERENCE_ENGINE ||
-        (backendId == DNN_BACKEND_OPENCV && targetId == DNN_TARGET_OPENCL_FP16))
+    if (backendId == DNN_BACKEND_INFERENCE_ENGINE)
         throw SkipTestException("");
 
     Mat weights(outChannels, inChannels * inSize.height * inSize.width, CV_32F);
@@ -692,10 +697,6 @@ TEST_P(Eltwise, Accuracy)
     int backendId = get<0>(get<4>(GetParam()));
     int targetId = get<1>(get<4>(GetParam()));
 
-    if (backendId == DNN_BACKEND_OPENCV &&
-        (targetId == DNN_TARGET_OPENCL || targetId == DNN_TARGET_OPENCL_FP16))
-        throw SkipTestException("");
-
     Net net;
 
     std::vector<int> convLayerIds(numConv);