Взаимодействие cuSOLVER-разреженное использование PyCUDA

Я пытаюсь связать разреженную процедуру cuSOLVER cusolverSpDcsrlsvqr () (> = CUDA 7.0) с помощью PyCUDA и сталкиваюсь с некоторыми трудностями: я попытался обернуть методы так же, как плотные процедуры cuSolver были завернуты в scikits-cuda ( https: / /github.com/lebedov/scikits.cuda/blob/master/scikits/cuda/cusolver.py ).

Однако при вызове функции cusolverSpDcsrlsvqr () код выходит из строя с ошибкой сегментации. Отладка с cuda-gdb ( cuda-gdb --args python -m pycuda.debug test.py; run;bt ) дает следующую стек,

  • Можно ли явно закрыть CDLL ctypes?
  • Объекты Python как пользовательские данные в функциях обратного вызова ctypes
  • ctypes загружает dll без сообщения об ошибке, но ничего не произошло
  • Структура списков типов Python перезаписывается при распределении большего объема памяти
  • Синтаксис соединения внутри структуры в ctypes
  • Передача объектов python в качестве аргументов функции C / C ++ с использованием ctypes
  • # 0 0x00007fffd9e3b71a в cusolverSpXcsrissymHost () из /usr/local/cuda/lib64/libcusolver.so # 1 0x00007fffd9df5237 в hsolverXcsrqr_zeroPivot () из /usr/local/cuda/lib64/libcusolver.so
    # 2 0x00007fffd9e0c764 в hsolverXcsrqr_analysis_coletree () из /usr/local/cuda/lib64/libcusolver.so
    # 3 0x00007fffd9f160a0 в cusolverXcsrqr_analysis () из /usr/local/cuda/lib64/libcusolver.so
    # 4 0x00007fffd9f28d78 в cusolverSpScsrlsvqr () из /usr/local/cuda/lib64/libcusolver.so

    что является странным, поскольку я не называю cusolverSp S csrlsvqr (), и я не думаю, что он должен вызывать хост-функцию (cusolverSpXcsrissym Host ).

    Это код, о котором я говорю – спасибо за вашу помощь:

     # ### Interface cuSOLVER PyCUDA import pycuda.gpuarray as gpuarray import pycuda.driver as cuda import pycuda.autoinit import numpy as np import scipy.sparse as sp import ctypes # #### wrap the cuSOLVER cusolverSpDcsrlsvqr() using ctypes # cuSparse _libcusparse = ctypes.cdll.LoadLibrary('libcusparse.so') class cusparseMatDescr_t(ctypes.Structure): _fields_ = [ ('MatrixType', ctypes.c_int), ('FillMode', ctypes.c_int), ('DiagType', ctypes.c_int), ('IndexBase', ctypes.c_int) ] _libcusparse.cusparseCreate.restype = int _libcusparse.cusparseCreate.argtypes = [ctypes.c_void_p] _libcusparse.cusparseDestroy.restype = int _libcusparse.cusparseDestroy.argtypes = [ctypes.c_void_p] _libcusparse.cusparseCreateMatDescr.restype = int _libcusparse.cusparseCreateMatDescr.argtypes = [ctypes.c_void_p] # cuSOLVER _libcusolver = ctypes.cdll.LoadLibrary('libcusolver.so') _libcusolver.cusolverSpCreate.restype = int _libcusolver.cusolverSpCreate.argtypes = [ctypes.c_void_p] _libcusolver.cusolverSpDestroy.restype = int _libcusolver.cusolverSpDestroy.argtypes = [ctypes.c_void_p] _libcusolver.cusolverSpDcsrlsvqr.restype = int _libcusolver.cusolverSpDcsrlsvqr.argtypes= [ctypes.c_void_p, ctypes.c_int, ctypes.c_int, cusparseMatDescr_t, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_double, ctypes.c_int, ctypes.c_void_p, ctypes.c_void_p] #### Prepare the matrix and parameters, copy to Device via gpuarray # coo to csr val = np.arange(1,5,dtype=np.float64) col = np.arange(0,4,dtype=np.int32) row = np.arange(0,4,dtype=np.int32) A = sp.coo_matrix((val,(row,col))).todense() Acsr = sp.csr_matrix(A) b = np.ones(4) x = np.empty(4) print('A:' + str(A)) print('b: ' + str(b)) dcsrVal = gpuarray.to_gpu(Acsr.data) dcsrColInd = gpuarray.to_gpu(Acsr.indices) dcsrIndPtr = gpuarray.to_gpu(Acsr.indptr) dx = gpuarray.to_gpu(x) db = gpuarray.to_gpu(b) m = ctypes.c_int(4) nnz = ctypes.c_int(4) descrA = cusparseMatDescr_t() reorder = ctypes.c_int(0) tol = ctypes.c_double(1e-10) singularity = ctypes.c_int(99) #create cusparse handle _cusp_handle = ctypes.c_void_p() status = _libcusparse.cusparseCreate(ctypes.byref(_cusp_handle)) print('status: ' + str(status)) cusp_handle = _cusp_handle.value #create MatDescriptor status = _libcusparse.cusparseCreateMatDescr(ctypes.byref(descrA)) print('status: ' + str(status)) #create cusolver handle _cuso_handle = ctypes.c_void_p() status = _libcusolver.cusolverSpCreate(ctypes.byref(_cuso_handle)) print('status: ' + str(status)) cuso_handle = _cuso_handle.value print('cusp handle: ' + str(cusp_handle)) print('cuso handle: ' + str(cuso_handle)) ### Call solver _libcusolver.cusolverSpDcsrlsvqr(cuso_handle, m, nnz, descrA, int(dcsrVal.gpudata), int(dcsrIndPtr.gpudata), int(dcsrColInd.gpudata), int(db.gpudata), tol, reorder, int(dx.gpudata), ctypes.byref(singularity)) # destroy handles status = _libcusolver.cusolverSpDestroy(cuso_handle) print('status: ' + str(status)) status = _libcusparse.cusparseDestroy(cusp_handle) print('status: ' + str(status)) 

  • Как использовать классы C ++ с ctypes?
  • Изменение LD_LIBRARY_PATH во время выполнения для ctypes
  • Копировать изображение PIL / PILLOW в буфер обмена Windows
  • Получение WM_COPYDATA в Python
  • Рекурсивные структуры cythype python
  • Ошибки аргументов python ctypes
  • One Solution collect form web for “Взаимодействие cuSOLVER-разреженное использование PyCUDA”

    Установка descrA в ctypes.c_void_p() и замена cusparseMatDescr_t в обертке ctypes.c_void_p должна решить проблему.

    Python - лучший язык программирования в мире.