Thanks for the incredibly quick response, Bryan! I'll look into that and get back to you.
Anand On Fri, Feb 5, 2010 at 2:58 PM, Bryan Catanzaro <[email protected]>wrote: > Are you using CUDA 3.0 beta? MAGMA probably uses the runtime API, while > PyCUDA uses the driver API. Up until CUDA 3.0, pointers are incompatible > between the two APIs and so, for example, dereferencing a PyCUDA allocated > pointer (driver) in a runtime API program (which I'm guessing MAGMA is), > will cause a segfault. > > Upgrading to CUDA 3.0 beta will solve that problem. > > - bryan > > On Feb 5, 2010, at 6:54 AM, Anand Patil wrote: > > > Hi all, > > > > I'm attempting to use PyCUDA to write a GPU backend for a Gaussian > process package, http://pymc.googlecode.com/files/GPUserGuide.pdf. I'm > pretty excited about it; if all goes well it should be possible to hide the > GPU completely from the user. PyCUDA has made development much easier so > far. > > > > Now I've got to wrap some functions in the MAGMA library, > http://icl.cs.utk.edu/magma/. I'm getting segfaults in function > magma_spotrf_gpu, which does Cholesky factorizations. This is my first time > using both ctypes and MAGMA, and I'm pretty new to GPU programming in > general, so I'm having a hard time diagnosing the problem. > > > > However, I've wrapped the 'CPU-only' version of magma_spotrf_gpu without > segfaults, which leads me to believe that the problem is the argument A, > which is the on-gpu matrix to be factorized. magma_spotrf_gpu expects A to > be a float*, and I'm giving it > > > > ctypes.POINTER(ctypes.c_float).from_address(int(A)) > > > > where A is the output of pycuda's to_device. > > > > The documentation of magma_spotrf_gpu follows, and a short program > demonstrating the problem follows that. Unfortunately it's not possible to > run the program; you would have to build magma v0.2 as a shared library, and > so far the package is only available in binary form, and the 64-bit version > was not compiled with -fPIC. If anyone is keen to run it, please email me > off-list and I'll tell you how to go about it. > > > > Any help would be much appreciated. > > > > Thanks in advance, > > Anand > > > > > > ---------------- magma_sportf_gpu documentation > > > > int magma_spotrf_gpu(char *uplo, int *n, float *a, int *lda, > > float *work, int *info) > > > > SPOTRF computes the Cholesky factorization of a real symmetric > positive definite matrix A. > > > > The factorization has the form > > > > > > A =U**T*U, if UPLO=’U’, > > > > or > > > > A=L *L**T, if UPLO=’L’, > > where U is an upper triangular matrix and L is lower triangular. > > > > This is the block version of the algorithm, calling Level 3 BLAS. > > > > UPLO (input) CHARACTER*1 > > = ’U’: Upper triangle of A is stored; > > = ’L’: Lower triangle of A is stored. > > > > N (input) INTEGER The order of the matrix A. N >= 0. > > > > A (input/output) REAL array on the GPU, dimension (LDA,N) > > On entry, the symmetric matrix A. If UPLO = ’U’, the > leading > > N-by-N upper triangular part of A contains the upper > > triangular part of the matrix A, and the strictly lower > > triangular part of A is not referenced. If UPLO = ’L’, > the > > leading N-by-N lower triangular part of A contains the > lower > > triangular part of the matrix A, and the strictly upper > > triangular part of A is not referenced. > > > > On exit, if INFO = 0, the factor U or L from the > Cholesky > > factorization A = U**T*U or A = L*L**T. > > > > LDA (input) INTEGER The leading dimension of the array A. > LDA >= max(1,N). > > > > WORK (workspace) REAL array, dimension at least (nb, nb) > where nb can be > > obtained through magma_get_spotrf_nb(*n) > > Work array allocated with cudaMallocHost. > > > > INFO (output) INTEGER > > = 0: successful exit > > < 0: if INFO = -i, the i-th argument had an illegal > value > > > 0: if INFO = i, the leading minor of order i is not > positive definite, and the factorization could not be completed. > > > > > > ---------------- pymagma.py > > > > import pycuda.driver as cuda > > import pycuda.autoinit > > import numpy as np > > import ctypes > > > > magma_path = > '/home/malaria-atlas-project/sources/magma_0.2s/lib/objectfiles/libmagma.so' > > libmagma = ctypes.cdll.LoadLibrary(magma_path) > > > > int_pointer = lambda x: ctypes.pointer(ctypes.c_int(x)) > > char_pointer = lambda x: ctypes.pointer(ctypes.c_char(x)) > > > > _magma_spotrf_gpu = libmagma.magma_spotrf_gpu > > _magma_spotrf_gpu.restype = ctypes.c_uint > > _magma_spotrf_gpu.argtypes = [ctypes.c_char_p, > > ctypes.POINTER(ctypes.c_int), > > ctypes.POINTER(ctypes.c_float), > > ctypes.POINTER(ctypes.c_int), > > np.ctypeslib.ndpointer(dtype='float32'), > > ctypes.POINTER(ctypes.c_int)] > > > > magma_get_spotrf_nb = libmagma.magma_get_spotrf_nb > > magma_get_spotrf_nb.restype = ctypes.c_uint > > magma_get_spotrf_nb.argtypes = [ctypes.POINTER(ctypes.c_int)] > > > > def magma_spotrf_gpu(uplo, n, A, lda, work): > > info = 1 > > from IPython.Debugger import Pdb > > Pdb(color_scheme='LightBG').set_trace() > > _magma_spotrf_gpu(char_pointer(uplo), > > int_pointer(n), > > # > ==================================================================== > > # = I think this argument is responsible for the > segmentation fault. = > > # > ==================================================================== > > > ctypes.POINTER(ctypes.c_float).from_address(int(A)), > > int_pointer(lda), > > > work.ctypes.data_as(ctypes.POINTER(ctypes.c_float)), > > int_pointer(info)) > > return info > > > > if __name__ == '__main__': > > n = 10 > > > > # Create matrix to be factored > > A_orig = (np.eye(n) + np.ones((n,n))*.3).astype('float32') > > A_gpu = cuda.to_device(A_orig) > > > > # Allocate pagelocked work array > > nwork = magma_get_spotrf_nb(int_pointer(n)) > > print nwork > > work_gpu = cuda.pagelocked_empty((nwork,nwork), dtype='float32') > > > > # # Do Cholesky factorization > > info = magma_spotrf_gpu('L', n, A_gpu, n, work_gpu) > > _______________________________________________ > > PyCUDA mailing list > > [email protected] > > http://host304.hostmonster.com/mailman/listinfo/pycuda_tiker.net > >
_______________________________________________ PyCUDA mailing list [email protected] http://host304.hostmonster.com/mailman/listinfo/pycuda_tiker.net
