You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tvm.apache.org by wu...@apache.org on 2019/12/08 00:30:06 UTC

[incubator-tvm] branch master updated: Workaround to make conv2d_transpose compilation for CUDA work (#4472)

This is an automated email from the ASF dual-hosted git repository.

wuwei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-tvm.git


The following commit(s) were added to refs/heads/master by this push:
     new 3fa8097  Workaround to make conv2d_transpose compilation for CUDA work (#4472)
3fa8097 is described below

commit 3fa80975164a9e9330acfedb32206d7b47856648
Author: Alexander Pivovarov <pi...@amazon.com>
AuthorDate: Sat Dec 7 16:29:55 2019 -0800

    Workaround to make conv2d_transpose compilation for CUDA work (#4472)
---
 tests/python/frontend/tensorflow/test_forward.py | 16 ++++++++++++++++
 topi/python/topi/cuda/conv2d_transpose_nchw.py   | 20 ++++++++++++++++++--
 2 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/tests/python/frontend/tensorflow/test_forward.py b/tests/python/frontend/tensorflow/test_forward.py
index 4ec8abd..cb4a926 100644
--- a/tests/python/frontend/tensorflow/test_forward.py
+++ b/tests/python/frontend/tensorflow/test_forward.py
@@ -368,6 +368,14 @@ def test_forward_convolution():
                           'NCHW', [4, 124, 17, 17])
         _test_convolution('conv_transpose', [4, 32, 8, 8], [3, 3, 12, 32], [1, 1], [2, 2], 'VALID',
                           'NCHW', [4, 12, 17, 17])
+        # kernel 2x2, strides (2,2)
+        _test_convolution('conv_transpose', [4, 19, 8, 8], [2, 2, 19, 19], [1, 1], [2, 2], 'VALID',
+                          'NCHW', [4, 19, 16, 16])
+        _test_convolution('conv_transpose', [4, 32, 8, 8], [2, 2, 12, 32], [1, 1], [2, 2], 'VALID',
+                          'NCHW', [4, 12, 16, 16])
+        # output channel is 1
+        _test_convolution('conv_transpose', [1, 19, 8, 8], [1, 1, 1, 19], [1, 1], [1, 1], 'VALID',
+                          'NCHW', [1, 1, 8, 8])
 
     _test_convolution('conv', [4, 8, 8, 176], [1, 1, 176, 32], [1, 1], [1, 1], 'SAME', 'NHWC')
     _test_convolution('conv', [4, 17, 17, 19], [3, 3, 19, 19], [1, 1], [2, 2], 'VALID', 'NHWC')
@@ -386,6 +394,14 @@ def test_forward_convolution():
                       'NHWC', [4, 17, 17, 124])
     _test_convolution('conv_transpose', [4, 8, 8, 32], [3, 3, 12, 32], [1, 1], [2, 2], 'VALID',
                       'NHWC', [4, 17, 17, 12])
+    # kernel 2x2, strides (2,2)
+    _test_convolution('conv_transpose', [4, 8, 8, 19], [2, 2, 19, 19], [1, 1], [2, 2], 'VALID',
+                      'NHWC', [4, 16, 16, 19])
+    _test_convolution('conv_transpose', [4, 8, 8, 32], [2, 2, 12, 32], [1, 1], [2, 2], 'VALID',
+                      'NHWC', [4, 16, 16, 12])
+    # output channel is 1
+    _test_convolution('conv_transpose', [1, 8, 8, 19], [1, 1, 1, 19], [1, 1], [1, 1], 'VALID',
+                      'NHWC', [1, 8, 8, 1])
 
 
 #######################################################################
diff --git a/topi/python/topi/cuda/conv2d_transpose_nchw.py b/topi/python/topi/cuda/conv2d_transpose_nchw.py
index 3201878..a3a4cfe 100644
--- a/topi/python/topi/cuda/conv2d_transpose_nchw.py
+++ b/topi/python/topi/cuda/conv2d_transpose_nchw.py
@@ -185,8 +185,24 @@ def schedule_conv2d_transpose_nchw_cuda(cfg, outs):
                 cfg.define_knob("unroll_explicit", [0, 1])
 
             if cfg.is_fallback:
-                N, F, Y, X = get_const_tuple(conv.shape)
-                _fallback_schedule(N, F, Y, X)
+                ko = int(kernel.shape[1])
+                kh = int(kernel.shape[2])
+                kw = int(kernel.shape[3])
+                stride_h, stride_w = cfg.stride
+                # Workaround to make CUDA compilation work. Issue #4470
+                # TODO make _fallback_schedule work for all kernel/strides combinations
+                #  after issue #4470 is resolved
+                do_fallback = True
+                if ko == 1:
+                    do_fallback = False
+                elif (kh, kw) == (1, 1):
+                    do_fallback = True
+                elif (kh, kw) == (stride_h, stride_w):
+                    do_fallback = False
+
+                if do_fallback:
+                    N, F, Y, X = get_const_tuple(conv.shape)
+                    _fallback_schedule(N, F, Y, X)
 
             ##### space definition end #####