def test_nchw_backwardweights_filter3x5_nopack(tensile_state,
                                               run_convolution_level):
    z = {}  # problemType definition
    conv = Convolution(z,
                       'ConvolutionBackwardWeights',
                       config={
                           'TensorAFormat': 'NCHW',
                           'Filter': '3x5',
                           'PackedSpatialDims': 0,
                       })
    log.debug(conv.printUsage(z))
    if not tensile_state.args["no_conv_assertions"]:
        # TODO - need to expand filter dims
        (cdim, filterDims) = (6, [5, 4]) if conv.unrollOnChannel else (4,
                                                                       [6, 5])
        assert (z['NumIndicesC'] == 4)
        assert (z['IndexAssignmentsA'] == filterDims + [0, 1, 2, cdim])
        assert (z['IndexAssignmentsB'] == filterDims + [3, cdim, 2])
        assert (z['SetConstStrideA'] == [[0, 1], [filterDims[0], 1]])
        assert (z['SetConstStrideB'] == [[2, 0], [filterDims[0], 1]])

        #assert(conv.solutionParms["AssertStrideAEqual"] == "1:1,3:1,0:1")
        #assert(conv.solutionParms["AssertStrideBEqual"] == "1:1")
        assert (conv.solutionParms["AssertSizeEqual"] == {0: 5, 1: 3})
    run_convolution_level.func(conv, z, run_convolution_level.solution)
Пример #2
0
def test_nchw_stride_filter(tensile_state, run_convolution_level):
    z = {}  # problemType definition
    conv = Convolution(z,
                       'ConvolutionForward',
                       config={
                           'TensorAFormat': 'NCHW',
                           'Stride': 'NxN',
                           'Filter': '2x2',
                           'PadStart': 'NxN',
                           'PadEnd': 'NxN',
                       })
    log.debug(conv.printUsage(z))
    if not tensile_state.args["no_conv_assertions"]:
        filterDims = [5, 4] if conv.unrollOnChannel else [6, 5]
        cdim = 6 if conv.unrollOnChannel else 3
        assert (z['NumIndicesC'] == 4)
        assert (z['IndexAssignmentsA'] == filterDims + [0, 1, cdim, 3])
        assert (z['IndexAssignmentsB'] == filterDims + [cdim, 2, 3])
        assert (not z['UseInitialStridesAB'])
        assert (conv.solutionParms["AssertStrideAEqual"] == {0: 1})
        assert (conv.solutionParms["AssertStrideBEqual"] == {0: 1, 4: 0})
        assert (conv.solutionParms["AssertSizeEqual"] == {
            filterDims[0]: 2,
            filterDims[1]: 2
        })

    run_convolution_level.func(conv, z, run_convolution_level.solution)
Пример #3
0
def test_nhwc_filter2x2_stride(tensile_state, run_convolution_level):
    z = {}  # problemType definition
    conv = Convolution(z,
                       'ConvolutionForward',
                       config={
                           'TensorAFormat': 'NHWC',
                           'TensorBFormat': 'KYXC',
                           'Filter': '2x2',
                           'Stride': '2x2',
                       })
    log.debug(conv.printUsage(z))
    if not tensile_state.args["no_conv_assertions"]:
        filterDims = [4, 3] if conv.unrollOnChannel else [5, 4]
        cdim = 5 if conv.unrollOnChannel else 3
        assert (z['NumIndicesC'] == 3)
        assert (z['IndexAssignmentsA'] == [cdim] + filterDims + [1, 2])
        assert (z['IndexAssignmentsB'] == [cdim] + filterDims + [0, 2])
        assert (not z['UseInitialStridesAB'])
        assert (conv.solutionParms["AssertStrideAEqual"] == {0: 1})
        assert (conv.solutionParms["AssertStrideBEqual"] == {0: 1, 4: 0})
        assert (conv.solutionParms["AssertSizeEqual"] == {
            filterDims[0]: 2,
            filterDims[1]: 2
        })
    run_convolution_level.func(conv, z, run_convolution_level.solution)
Пример #4
0
def test_nchw_filter2x2(tensile_state, run_convolution_level, problemSizes):
    z = {}  # problemType definition
    conv = Convolution(z,
                       'ConvolutionForward',
                       config={
                           'TensorAFormat': 'NCHW',
                           'TensorBFormat': 'KCYX',
                           'Filter': '2x2',
                           'PadStart': 'NxN',
                           'PadEnd': 'NxN',
                       })
    log.debug(conv.printUsage(z))
    if not tensile_state.args["no_conv_assertions"]:
        filterDims = [3] if conv.unrollOnChannel else [4]
        cdim = 4 if conv.unrollOnChannel else 3
        assert (z['NumIndicesC'] == 3)
        assert (z['IndexAssignmentsA'] == filterDims + [0, cdim, 2])
        assert (z['IndexAssignmentsB'] == filterDims + [cdim, 1, 2])
        assert (z['UseInitialStridesAB'])
        assert (conv.solutionParms["AssertStrideAEqual"] == {1: 1})
        assert (conv.solutionParms["AssertStrideBEqual"] == {3: 0})
        assert (conv.solutionParms["AssertSizeEqual"] == {filterDims[0]: 2})

    run_convolution_level.func(conv, z, run_convolution_level.solution,
                               problemSizes[0], problemSizes[1])
Пример #5
0
def test_pad_4x3():
    z = {}  # problemType definition
    conv = Convolution(z,
                       'ConvolutionForward',
                       config={
                           'TensorAFormat': 'NCHW',
                           'Filter': '4x3',
                           'PadStart': 'NxN',
                           'PadEnd': 'NxN',
                       })
    log.debug(conv.printUsage(z))
    e = {
        'n': 1,
        'c': 4,
        'h': 12,
        'w': 8,
        'k': 1,
        'p': 1,
        'p_': 2,
        'q': 3,
        'q_': 4
    }
    ec = ConvProblem(e, conv)
    assert (ec.zeroPadA[0] == [0, 5, 3, 4])
    assert (ec.zeroPadA[1] == [1, 4, 8, 16])
    assert (len(ec.zeroPadA) == 2)
Пример #6
0
def test_nchw_filter2x1_dilation(tensile_state, run_convolution_level):
    z={} # problemType definition
    conv = Convolution(z, 'ConvolutionForward',
              config={'TensorAFormat': 'NCHW',
                      'TensorBFormat': 'KCYX',
                      'Filter': '2x1',
                      'Dilation': '1x2',
                      'PadStart': 'Nx0',
                      'PadEnd':   'Nx0',
                      })
    log.debug(conv.printUsage(z))
    if not tensile_state.args["no_conv_assertions"]:
        filterDims = [3] if conv.unrollOnChannel else [4]
        cdim = 4 if conv.unrollOnChannel else 3
        assert(z['NumIndicesC']==3)
        assert(z['IndexAssignmentsA']==filterDims + [0, cdim, 2])
        assert(z['IndexAssignmentsB']==filterDims + [cdim, 1, 2])
        assert(z['UseInitialStridesAB'])
        assert(conv.solutionParms["AssertStrideAEqual"] == {1:1})
        assert(conv.solutionParms["AssertStrideBEqual"] == {3:0})
        assert(conv.solutionParms["AssertSizeEqual"] == {filterDims[0]:2})
    solutionName = run_convolution_level.solution.__name__
    if solutionName.startswith("asm") or solutionName == 'src1':
        pytest.skip("skip configs w/o PBD")
    run_convolution_level.func(conv, z, run_convolution_level.solution)
Пример #7
0
def test_nhwc_filter2x2(tensile_state, run_convolution_level):
    z = {}  # problemType definition
    conv = Convolution(z,
                       'ConvolutionForward',
                       config={
                           'TensorAFormat': 'NHWC',
                           'Filter': '3x2',
                       })
    log.debug(conv.printUsage(z))
    if not tensile_state.args["no_conv_assertions"]:
        filterDims = [4, 3] if conv.unrollOnChannel else [5, 4]
        cdim = 5 if conv.unrollOnChannel else 3
        assert (z['NumIndicesC'] == 3)
        assert (z['IndexAssignmentsA'] == [cdim] + filterDims + [1, 2])
        assert (z['IndexAssignmentsB'] == filterDims + [cdim, 0, 2])
        assert (not z['UseInitialStridesAB'])
        assert (conv.solutionParms["AssertStrideAEqual"] == {0: 1})
        assert (conv.solutionParms["AssertStrideBEqual"] == {0: 1, 4: 0})
        assert (conv.solutionParms["AssertSizeEqual"] == {
            filterDims[0]: 2,
            filterDims[1]: 3
        })
    #skip since bug in asm output swap required by NHWC, impacts both source and asm
    solutionName = run_convolution_level.solution.__name__
    if solutionName.startswith("asm"):
        pytest.skip("bug with asm NHWC")
Пример #8
0
def test_nchw_dilation_filter4x4_pad(tensile_state, run_convolution_level):
    z = {}  # problemType definition
    conv = Convolution(z,
                       'ConvolutionForward',
                       config={
                           'TensorAFormat': 'NCHW',
                           'Filter': '4x4',
                           'PadStart': '2x2',
                           'PadEnd': '2x2',
                       })
    log.debug(conv.printUsage(z))
    if not tensile_state.args["no_conv_assertions"]:
        (cdim, filterDims) = (5, [4, 3]) if conv.unrollOnChannel else (5,
                                                                       [4, 3])
        assert (z['NumIndicesC'] == 3)
        assert (z['IndexAssignmentsA'] == filterDims + [0, cdim, 2])
        assert (z['IndexAssignmentsB'] == filterDims + [cdim, 1, 2])
        assert (z['UseInitialStridesAB'])
        assert (conv.solutionParms["AssertStrideAEqual"] == {0: 2, 2: 1})
        assert (conv.solutionParms["AssertStrideBEqual"] == {
            0: 1,
            filterDims[0]: 0
        })
        assert (conv.solutionParms["AssertSizeEqual"] == {
            filterDims[0]: 1,
            filterDims[1]: 1
        })
    run_convolution_level.func(conv, z, run_convolution_level.solution)
Пример #9
0
def test_simple(run_convolution_vs_contraction):
    z = {}  # problemType definition
    conv = Convolution(z,
                       'ConvolutionForward',
                       config={
                           'TensorAFormat': 'NCHW',
                       })
    log.debug(conv.printUsage(z))
    run_convolution_vs_contraction(conv)
Пример #10
0
def test_spatial_unspecified():
    z={} # problemType definition
    conv = Convolution(z, 'ConvolutionForward',
              config={'TensorAFormat': 'NCHW',
                     })

    log.debug(conv.printUsage(z))
    with pytest.raises(RuntimeError, match="ConvolutionConfig field 'spatial' == None"):
        conv.makeProblem(n=64, c=1024, k=256, pcc=conv.cc)
Пример #11
0
def test_dilation2x3(run_convolution_vs_contraction):
    z = {}  # problemType definition
    conv = Convolution(z,
                       'ConvolutionForward',
                       config={
                           'TensorAFormat': 'NCHW',
                           'Filter': '2x2',
                           'Dilation': '2x3',
                       })
    log.debug(conv.printUsage(z))
    run_convolution_vs_contraction(conv)
Пример #12
0
def test_mismatch():
    z={} # problemType definition
    conv = Convolution(z, 'ConvolutionForward',
              config={'TensorAFormat': 'NCHW',
                      'Spatial' : '34x99',
                     })

    log.debug(conv.printUsage(z))
    pcc = ConvolutionConfig(spatial=[14,15])
    with pytest.raises(RuntimeError, match="Mismatch between ConvolutionConfig value"):
        conv.makeProblem(n=64, c=1024, k=256, pcc=pcc)
Пример #13
0
def test_pad0x1(run_convolution_vs_contraction):
    z = {}  # problemType definition
    conv = Convolution(z,
                       'ConvolutionForward',
                       config={
                           'TensorAFormat': 'NCHW',
                           'Filter': '2x2',
                           'PadStart': '0x1',
                           'PadEnd': '0x1',
                       })
    log.debug(conv.printUsage(z))
    run_convolution_vs_contraction(conv)
Пример #14
0
def test_bad_invalid_list():
    z = {}  # problemType definition
    conv = Convolution(z,
                       'ConvolutionForward',
                       config={
                           'TensorAFormat': 'NCHW',
                           'Stride': '2x3',
                       })
    log.debug(conv.printUsage(z))
    e = [1, 2, 3, 4]
    with pytest.raises(Exception, match="ConvProblem must be a dictionary"):
        ConvProblem(e, conv)
Пример #15
0
def test_filter2x1(request, tensile_client_dir, tmp_path):
    z = {}  # problemType definition
    conv = Convolution(z,
                       'ConvolutionForward',
                       config={
                           'TensorAFormat': 'NCHW',
                           'Filter': '2x1',
                           'Stride': '1x1',
                           'Dilation': '1x1',
                           'Spatial': '17x31',
                       })
    log.debug(conv.printUsage(z))
Пример #16
0
def test_spatial_in():
    z={} # problemType definition
    conv = Convolution(z, 'ConvolutionForward',
              config={'TensorAFormat': 'NCHW',
                     })

    log.debug(conv.printUsage(z))
    pcc = ConvolutionConfig(spatial=[14,15])
    p = conv.makeProblem(n=64, c=1024, k=256, pcc=pcc)
    assert(p[0] == [210, 256, 64, 1024])
    assert(p[1] == [1, -1, -1])
    assert(p[2] == [-1, -1, 0])
Пример #17
0
def test_simple(run_convolution_vs_contraction):
    z = {}  # problemType definition
    conv = Convolution(z,
                       'ConvolutionForward',
                       config={
                           'TensorAFormat': 'NCHW',
                           'Filter': '1x1',
                           'Stride': '1x1',
                           'Dilation': '1x1',
                           'Spatial': '17x31',
                       })
    log.debug(conv.printUsage(z))
    run_convolution_vs_contraction(conv)
Пример #18
0
def test_nchw_defaults(tensile_state, run_convolution_level):
    z = {}  # problemType definition
    conv = Convolution(z, 'ConvolutionForward', config={})
    log.debug(conv.printUsage(z))
    if not tensile_state.args["no_conv_assertions"]:
        assert (z['NumIndicesC'] == 3)
        assert (z['IndexAssignmentsA'] == [0, 3, 2])
        assert (z['IndexAssignmentsB'] == [3, 1, 2])
        assert (not z['UseInitialStridesAB'])
        assert (conv.solutionParms["AssertStrideAEqual"] == {0: 1})
        assert (conv.solutionParms["AssertStrideBEqual"] == {0: 1, 2: 0})
        assert (conv.solutionParms["AssertSizeEqual"] == {})
    run_convolution_level.func(conv, z, run_convolution_level.solution)
Пример #19
0
def test_stride():
    z={} # problemType definition
    conv = Convolution(z, 'ConvolutionForward',
              config={'TensorAFormat': 'NCHW',
                      'Spatial' : '13x14',
                      'Stride' : '2x3',
                     })

    log.debug(conv.printUsage(z))
    p = conv.makeProblem(n=64, c=1024, k=256, pcc=conv.cc)
    assert(p[0] == [4, 6, 256, 64, 1024])
    assert(p[1] == [3, 28, -1, -1])
    assert(p[2] == [-1, -1, 0])
Пример #20
0
def test_stride2x3_defaults():
    z = {}  # problemType definition
    conv = Convolution(z,
                       'ConvolutionForward',
                       config={
                           'TensorAFormat': 'NCHW',
                           'Stride': '2x3',
                       })
    log.debug(conv.printUsage(z))
    e = {'n': 64, 'c': 256, 'h': 20, 'w': 14, 'k': 1024}
    ec = ConvProblem(e, conv)
    assert (ec.sizes == (4, 10, e['k'], e['n'], e['c']))
    assert (ec.stridesA == (3, 28, -1, -1))
Пример #21
0
def test_filter_stride_dilation_1(run_convolution_vs_contraction):
    z = {}  # problemType definition
    conv = Convolution(z,
                       'ConvolutionForward',
                       config={
                           'TensorAFormat': 'NCHW',
                           'Filter': '6x7',
                           'Stride': '2x3',
                           'Dilation': '4x5',
                           'Spatial': '27x51',
                       })
    log.debug(conv.printUsage(z))
    run_convolution_vs_contraction(conv)
Пример #22
0
def test_stride2x3(request, tensile_client_dir, tmp_path):
    z = {}  # problemType definition
    conv = Convolution(z,
                       'ConvolutionForward',
                       config={
                           'TensorAFormat': 'NCHW',
                           'Filter': '1x1',
                           'Stride': '2x3',
                           'Dilation': '1x1',
                           'Spatial': '17x31',
                       })
    log.debug(conv.printUsage(z))
    YamlBuilder.run_convolution_vs_contraction(request, conv, z,
                                               tensile_client_dir, tmp_path)
Пример #23
0
def test_bad_missing_field():
    z = {}  # problemType definition
    conv = Convolution(z,
                       'ConvolutionForward',
                       config={
                           'TensorAFormat': 'NCHW',
                           'Stride': '2x3',
                       })
    log.debug(conv.printUsage(z))
    e = {'c': 256, 'h': 20, 'w': 14, 'k': 1024, 'x': 1, 'y': 1, 'u': 1, 'v': 1}
    with pytest.raises(
            Exception,
            match="required ConvProblem field 'n' not present in ConvProblem"):
        ConvProblem(e, conv)
Пример #24
0
def test_pad_4x1():
    z = {}  # problemType definition
    conv = Convolution(z,
                       'ConvolutionForward',
                       config={
                           'TensorAFormat': 'NCHW',
                           'Filter': '4x1',
                           'PadStart': 'Nx0',
                           'PadEnd': 'Nx0',
                       })
    log.debug(conv.printUsage(z))
    e = {'n': 1, 'c': 4, 'h': 12, 'w': 8, 'k': 1, 'p': 2, 'p_': 3}
    ec = ConvProblem(e, conv)
    assert (ec.zeroPadA == [[1, 4, 2, 3]])
Пример #25
0
def test_nchw_backwardweights_filter3x5(run_convolution_level):
    z = {}  # problemType definition
    conv = Convolution(z,
                       'ConvolutionBackwardWeights',
                       config={
                           'TensorAFormat': 'NCHW',
                           'Filter': '3x5',
                       })
    log.debug(conv.printUsage(z))
    assert (z['NumIndicesC'] == 4)
    assert (z['IndexAssignmentsA'] == [5, 0, 1, 2, 4])
    assert (z['IndexAssignmentsB'] == [5, 3, 4])
    #assert(z['SetConstStrideA']==[[3,1]])
    assert (z['SetConstStrideB'] == [])
    run_convolution_level(conv, z)
Пример #26
0
def test_nchw_backwardweights_defaults(run_convolution_level):
    z = {}  # problemType definition
    conv = Convolution(z,
                       'ConvolutionBackwardWeights',
                       config={
                           'TensorAFormat': 'NCHW',
                           'Spatial': '14x14',
                       })
    log.debug(conv.printUsage(z))
    assert (z['NumIndicesC'] == 2)
    assert (z['IndexAssignmentsA'] == [3, 0, 2])
    assert (z['IndexAssignmentsB'] == [3, 1, 2])
    assert (z['SetConstStrideA'] == [[3, 1]])
    assert (z['SetConstStrideB'] == [])
    run_convolution_level(conv, z)
Пример #27
0
def test_nchw_backwarddata_defaults(tensile_state, run_convolution_level):
    z={} # problemType definition
    conv = Convolution(z, 'ConvolutionBackwardData',
              config={'TensorAFormat': 'NCHW',
                      'Spatial' : '14x14',
                      })
    log.debug(conv.printUsage(z))
    if not tensile_state.args["no_conv_assertions"]:
        assert(z['NumIndicesC']==2)
        assert(z['IndexAssignmentsA']==[3, 0, 2])
        assert(z['IndexAssignmentsB']==[3, 1, 2])
        #assert(conv.solutionParms["AssertStrideAEqual"] == "1:1,0:1")
        #assert(conv.solutionParms["AssertStrideBEqual"] == "1:1")
        assert(conv.solutionParms["AssertSizeEqual"] == {})
    run_convolution_level.func(conv, z, run_convolution_level.solution)
Пример #28
0
def test_nchw_backwarddata_filter3x5(tensile_state, run_convolution_level):
    z={} # problemType definition
    conv = Convolution(z, 'ConvolutionBackwardData',
              config={'TensorAFormat': 'NCHW',
                      'Filter': '3x5',
                      })
    log.debug(conv.printUsage(z))
    if not tensile_state.args["no_conv_assertions"]:
        assert(z['NumIndicesC']==4)
        assert(z['IndexAssignmentsA']==[5, 0, 1, 2, 4])
        assert(z['IndexAssignmentsB']==[5, 3, 4])
        #assert(conv.solutionParms["AssertStrideAEqual"] == "1:1,3:1,0:1")
        #assert(conv.solutionParms["AssertStrideBEqual"] == "1:1")
        assert(conv.solutionParms["AssertSizeEqual"] == {4:3,5:5})
    run_convolution_level.func(conv, z, run_convolution_level.solution)
Пример #29
0
def test_ncdhw_packed_strides3d_defaults(run_convolution_level):
    z = {}  # problemType definition
    conv = Convolution(z,
                       'ConvolutionForward',
                       config={
                           'TensorAFormat': 'NCDHW',
                           'Stride': 'NxNxN',
                       })
    log.debug(conv.printUsage(z))
    assert (z['NumIndicesC'] == 5)
    assert (z['IndexAssignmentsA'] == [0, 1, 2, 5, 4])
    assert (z['IndexAssignmentsB'] == [5, 3, 4])
    assert (z['SetConstStrideA'] == [])
    assert (z['SetConstStrideB'] == [[4, 0]])
    run_convolution_level(conv, z)
Пример #30
0
def test_nchw_defaults(run_convolution_level):
    z = {}  # problemType definition
    conv = Convolution(z,
                       'ConvolutionForward',
                       config={
                           'TensorAFormat': 'NCHW',
                       })
    log.debug(conv.printUsage(z))
    assert (z['NumIndicesC'] == 3)
    assert (z['IndexAssignmentsA'] == [0, 3, 2])
    assert (z['IndexAssignmentsB'] == [3, 1, 2])
    assert (z['SetConstStrideA'] == [[0, 1]])
    assert (z['SetConstStrideB'] == [[2, 0]])
    assert (z['UseInitialStridesAB'] == 0)
    run_convolution_level(conv, z)