def METHOD_NAME(n: int, m: int, specialize: bool):
    print("==== Program start ====")
    N.set(n)
    if specialize:
        print("Specializing M...")
        M.set(m)
    gemv = make_sdfg(specialize)
    gemv.specialize(dict(N=N))
    if not specialize:
        M.set(m)
    else:
        gemv.specialize(dict(M=M))
    print("Running GEMV {}x{} ({}specialized)".format(N.get(), M.get(), ("" if specialize else "not ")))
    A = dace.ndarray([M, N], dtype=dtype)
    x = dace.ndarray([M], dtype=dtype)
    y = dace.ndarray([N], dtype=dtype)
    # Intialize: randomize A, x and y
    # A[:, :] = np.random.rand(M.get(), N.get()).astype(dtype.type)
    # x[:] = np.random.rand(M.get()).astype(dtype.type)
    # y[:] = np.random.rand(N.get()).astype(dtype.type)
    A[:, :] = 1
    x[:] = 1
    y[:] = 0
    # Regression
    regression = np.matmul(np.transpose(A), x) + y
    #############################################
    # Run DaCe program
    if specialize:
        gemv(A=A, x=x, y=x)
    else:
        gemv(A=A, M=M, x=x, y=y)
    residual = np.linalg.norm(y - regression) / (N.get() * M.get())
    print("Residual:", residual)
    diff = np.abs(y - regression)
    wrong_elements = np.transpose(np.nonzero(diff >= 0.01))
    highest_diff = np.max(diff)
    print("==== Program end ====")
    if residual >= 0.01 or highest_diff >= 0.01:
        print("Verification failed!")
        print("Residual: {}".format(residual))
        print("Incorrect elements: {} / {}".format(wrong_elements.shape[0], (N.get() * M.get())))
        print("Highest difference: {}".format(highest_diff))
        print("** Result:\n", y)
        print("** Reference:\n", regression)
        raise RuntimeError("Validation failed/")
    return gemv