Exemplo n.º 1
0
def main():
    import argparse
    parser = argparse.ArgumentParser("Demo for Magma symmetric eigen-solver")
    parser.add_argument('-N', default=256, type=int, help='size of matrix')
    parser.add_argument('-t',
                        default='s',
                        type=str,
                        help='data type: s or d, default s')
    parser.add_argument(
        '-ongpu',
        action='store_true',
        help='whether initial data on gpu (using _gpu functions), default False'
    )
    parser.add_argument(
        '-ngpu',
        default=1,
        type=int,
        help=
        'number of GPU (default 1), use -1 for running multi-gpu functions with single gpu'
    )
    parser.add_argument('-expert',
                        action='store_true',
                        help='use the expert function (ssyevdx, dsyevdx)')
    parser.add_argument('-fulltest',
                        action='store_true',
                        help='full test except data-on-gpu functions')
    args = parser.parse_args()

    magma_init()
    if not args.fulltest:
        _test_syev(N=args.N,
                   type_key=args.t,
                   data_gpu=args.ongpu,
                   ngpu=args.ngpu,
                   expert=args.expert,
                   keigs=None)
    else:
        for N in [200, 2000]:
            for t in ['s', 'd']:
                print("Data_on_host")
                for expert in [False, True]:
                    for ngpu in [-1, 1]:
                        print(f"N={N}; t={t}; ngpu={ngpu}; expert={expert}")
                        _test_syev(N=N,
                                   type_key=t,
                                   data_gpu=False,
                                   ngpu=ngpu,
                                   expert=expert)
                print("Data_on_device")
                print("\n\n")
                for expert in [False, True]:
                    print(f"N={N}; t={t}; expert={expert}")
                    _test_syev(N=N,
                               type_key=t,
                               data_gpu=True,
                               ngpu=1,
                               expert=expert)
    magma_finalize()
Exemplo n.º 2
0
def gpu_magma_magma_gesvd_A(input):
    coloring_print("\nGPU: skcuda.magma_gesvd 'A' option")
    input_original = input.copy()  # magma is descructive
    magma.magma_init()

    # #縦横を逆(≒転地)してcolumn-majorにし、GPUのcusolverDnDgesvd()に対応させる。結果配列のU,Vが逆になる
    n, m = input.shape

    # change function by data type
    if input.dtype == np.dtype('float64'):
        get_buffer = magma.magma_dgesvd_buffersize
        magma_svd = magma.magma_dgesvd
    elif input.dtype == np.dtype('float32'):
        get_buffer = magma.magma_sgesvd_buffersize
        magma_svd = magma.magma_sgesvd
    else:
        print "Error: data type must be float64 or float32"

# Set up work buffers:
    Lwork = get_buffer('A', 'A', m, n)
    workspace = np.zeros(Lwork, input.dtype)

    # Set up output buffers:
    s = np.zeros(min(m, n), input.dtype)
    # u         = np.zeros((n, n), input.dtype)
    # vh        = np.zeros((m, m), input.dtype)
    u = np.zeros((m, m), input.dtype)
    vh = np.zeros((n, n), input.dtype)

    # Compute:
    magma_svd_A_start = time.time()
    status = magma_svd(
        'A',  # jobu
        'A',  # jobvt
        m,  # m
        n,  # n
        input.ctypes.data,  # A
        m,  # lda
        s.ctypes.data,  # s
        u.ctypes.data,  # U
        m,  # ldu
        vh.ctypes.data,  # VT
        n,  # ldvt
        workspace.ctypes.data,  # work
        Lwork)  # lwork
    magma_svd_A_end = time.time()
    print "magma_sgesvd A option (= Total): ", magma_svd_A_end - magma_svd_A_start, "[sec]"
    print "Total: ", magma_svd_A_end - magma_svd_A_start, "[sec]"

    # magma is descructive, u and s is swapped (数学的に正しいかはわからない)
    check_result(input_original, vh, s, u)

    magma.magma_finalize()
Exemplo n.º 3
0
def gpu_magma_magma_gesvd_S(input):
    coloring_print("\nGPU: skcuda.magma_gesvd 'S' option")
    input_original = input.copy()
    magma.magma_init()

    # #縦横を逆(≒転地)してcolumn-majorにし、GPUのcusolverDnDgesvd()に対応させる。結果配列のU,Vが逆になる
    n, m = input.shape

    # change function by data type
    if input.dtype == np.dtype('float64'):
        get_buffer = magma.magma_dgesvd_buffersize
        magma_svd = magma.magma_dgesvd
    elif input.dtype == np.dtype('float32'):
        get_buffer = magma.magma_sgesvd_buffersize
        magma_svd = magma.magma_sgesvd
    else:
        print "Error: data type must be float64 or float32"

    Lwork = get_buffer('A', 'A', m, n)
    workspace = np.zeros(Lwork, input.dtype)
    # The size of u and vh in 'S' are different from those of 'A'
    s = np.zeros(min(m, n), input.dtype)
    u = np.zeros((n, m), input.dtype)
    vh = np.zeros((n, n), input.dtype)

    # Compute:
    magma_svd_start = time.time()
    status = magma_svd(
        'S',  # jobu
        'S',  # jobvt
        m,  # m
        n,  # n
        input.ctypes.data,  # A
        m,  # lda
        s.ctypes.data,  # s
        u.ctypes.data,  # U
        m,  # ldu
        vh.ctypes.data,  # VT
        n,  # ldvt
        workspace.ctypes.data,  # work
        Lwork)  # lwork
    magma_svd_end = time.time()
    print "magma_sgesvd S option (= Total): ", magma_svd_end - magma_svd_start, "[sec]", (
        pycuda.driver.mem_get_info()[1] -
        pycuda.driver.mem_get_info()[0]) / 1024 / 1024
    print "Total: ", magma_svd_end - magma_svd_start, "[sec]"

    # magma is descructive, u and s is swapped (数学的に正しいかはわからない)
    check_result(input_original, vh, s, u)

    magma.magma_finalize()
Exemplo n.º 4
0
 def tearDownClass(cls):
     magma.magma_finalize()
     cls.ctx.pop()
     clear_context_caches()
Exemplo n.º 5
0
magma.magma_init()
x = np.asarray([[1.80, 2.88, 2.05, -0.89], [5.25, -2.95, -0.95, -3.80],
                [1.58, -2.69, -2.90, -1.04], [-1.11, -0.66, -0.59,
                                              0.80]]).astype(np.float32)
x_orig = x.copy()

# Need to reverse dimensions because MAGMA expects column-major matrices:
n, m = x.shape

# Set up output buffers:
s = np.zeros(min(m, n), np.float32)
u = np.zeros((m, m), np.float32)
vh = np.zeros((n, n), np.float32)

# Set up workspace:
Lwork = magma.magma_sgesvd_buffersize('A', 'A', m, n, x.ctypes.data, m,
                                      s.ctypes.data, u.ctypes.data, m,
                                      vh.ctypes.data, n)
workspace = np.zeros(Lwork, np.float32)

# Compute:
status = magma.magma_sgesvd('A', 'A', m, n, x.ctypes.data, m, s.ctypes.data,
                            u.ctypes.data, m, vh.ctypes.data, n,
                            workspace.ctypes.data, Lwork)

# Confirm that solution is correct by ensuring that the original matrix can be
# obtained from the decomposition:
print('correct solution: %r' %
      np.allclose(x_orig, np.dot(vh, np.dot(np.diag(s), u)), 1e-4))
magma.magma_finalize()
Exemplo n.º 6
0
magma.magma_init()
x = np.asarray([[1.80, 2.88, 2.05, -0.89],
                [5.25, -2.95, -0.95, -3.80],
                [1.58, -2.69, -2.90, -1.04],
                [-1.11, -0.66, -0.59, 0.80]]).astype(np.float32)
x_orig = x.copy()

# Need to reverse dimensions because MAGMA expects column-major matrices:
n, m = x.shape

# Set up output buffers:
s = np.zeros(min(m, n), np.float32)
u = np.zeros((m, m), np.float32)
vh = np.zeros((n, n), np.float32)

# Set up workspace:
Lwork = magma.magma_sgesvd_buffersize('A', 'A', m, n, x.ctypes.data, m, s.ctypes.data,
                                      u.ctypes.data, m, vh.ctypes.data, n)
workspace = np.zeros(Lwork, np.float32)

# Compute:
status = magma.magma_sgesvd('A', 'A', m, n, x.ctypes.data, m, s.ctypes.data,
                            u.ctypes.data, m, vh.ctypes.data, n,
                            workspace.ctypes.data, Lwork)

# Confirm that solution is correct by ensuring that the original matrix can be
# obtained from the decomposition:
print('correct solution: %r' %
      np.allclose(x_orig, np.dot(vh, np.dot(np.diag(s), u)), 1e-4))
magma.magma_finalize()
Exemplo n.º 7
0
def eigs(a_gpu, k=None, which='LM', imag=False, return_eigenvectors=True):
    """
    Driver for eigenvalue solver for symmetric matrix
    """

    if len(a_gpu.shape) != 2:
        raise ValueError("M needs to be a rank 2 square array for eig.")

    magma.magma_init()
    ngpu=1

    dtype = a_gpu.dtype.type
    t = typedict_[dtype]
    N = a_gpu.shape[1]

    if k is None: k=int(np.ceil(N/2))

    if 'L' in which:
        a_gpu = -a_gpu

    if return_eigenvectors:
        jobz = 'V'
    else:
        jobz = 'N'

    rnge = 'I'; uplo = 'U'
    vl = 0; vu = 1e10
    il = 1; iu = k; m = 0
    print(f"k = {k}, iu = {iu}")

    w_gpu = np.empty((N,), dtype, order='F') # eigenvalues

    if t == 's':
        nb = magma.magma_get_ssytrd_nb(N)
    elif t == 'd':
        nb = magma.magma_get_dsytrd_nb(N)
    else:
        raise ValueError('unsupported type')

    lwork = N*(1 + 2*nb)
    if jobz:
        lwork = max(lwork, 1+6*N+2*N**2)
    work = np.empty(lwork, dtype)
    liwork = 3+5*N if jobz else 1
    iwork = np.empty(liwork, dtype)

    if t == 's':
        status = magma.magma_ssyevdx_m(ngpu, jobz, rnge, uplo, N, a_gpu.ctypes.data, N,
                                    vl, vu, il, iu, m, 
                                    w_gpu.ctypes.data, work.ctypes.data, lwork, iwork.ctypes.data, liwork)
    elif t == 'd':
        status = magma.magma_dsyevdx_m(ngpu, jobz, rnge, uplo, N, a_gpu.ctypes.data, N,
                                    vl, vu, il, iu, m, 
                                    w_gpu.ctypes.data, work.ctypes.data, lwork, iwork.ctypes.data, liwork)
    else:
        raise ValueError('unsupported type')

    if 'L' in which:
        w_gpu = -w_gpu

    magma.magma_finalize()

    if jobz:
        return w_gpu, a_gpu
    else:
        return w_gpu