使用PyCUDA连接cuSOLVER稀疏

你是

我正在尝试使用PyCUDA来连接稀疏cuSOLVER例程cusolverSpDcsrlsvqr()(> = CUDA 7.0),并且遇到了一些困难:我试图以将密集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)进行调试会产生以下堆栈跟踪,

来自/usr/local/cuda/lib64/libcusolver.so中的cusolverSpXcsrissymHost()中的#0 0x00007fffd9e3b71a(1
)来自/ usr / local / cudar_xr_x_rx_x0_x(0 * 0764)的0x00007fffd9e3b71a来自/ usr / local / cuda / lib64 / libcus_analys0(764) / usr
/ local /
lib / lib中的/local/cuda/lib64/libcusolver.so#3 0x00007fffd9f160a0在cusolverXcsrqr_analysis()中/usr/local/cuda/lib64/libcusolver.so#4 0x00007fffd9f28d78在cusolverSpScsrlsvqr()中。

这很奇怪,因为我既不调用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))
天鹅

设置descrActypes.c_void_p()和更换cusparseMatDescr_tcusolverSpDcsrlsvqr包装与ctypes.c_void_p应解决的问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用PyCUDA连接cuSOLVER-sparse

来自分类Dev

使用SciPy / Numpy在Python中连接稀疏矩阵

来自分类Dev

PyCUDA正确使用结构

来自分类Dev

无法使用pip安装pycuda

来自分类Dev

使用稀疏的稀疏矩阵上的groupby

来自分类Dev

稀疏连接中的PostgreSQL慢WHERE子句

来自分类Dev

稀疏连接中的PostgreSQL慢WHERE子句

来自分类Dev

如何使用PyCUDA处理python列表?

来自分类Dev

如何告诉PyCUDA使用哪个GPU?

来自分类Dev

使用指针从GPU复制pyCuda数组

来自分类Dev

如何在多处理中使用 PyCuda?

来自分类Dev

使用稀疏矩阵与numpy数组

来自分类Dev

在稀疏矩阵上使用groupby

来自分类Dev

使用R创建稀疏矩阵

来自分类Dev

Matlab:如何使用稀疏键访问稀疏数据?

来自分类Dev

使用cuSPARSE的密集到稀疏和稀疏到密集转换

来自分类Dev

使用CUDA 7.0 RC的cusolver计算特征值和特征向量

来自分类Dev

将Spark中的稀疏向量连接起来?

来自分类Dev

使用范围的稀疏值列表

来自分类Dev

在矩阵中使用稀疏索引的错误太大

来自分类Dev

使用SQL生成包含稀疏数据的列?

来自分类Dev

使用置换矩阵的稀疏矩阵的Cholesky分解

来自分类Dev

何时建议在R中使用稀疏矩阵?

来自分类Dev

Scipy Sparse是否使用(稀疏)BLAS库?

来自分类Dev

在MemSQL上使用列存储的稀疏矩阵

来自分类Dev

如何使用ELKI处理稀疏数据?

来自分类Dev

使用Java创建稀疏文件的NTFS

来自分类Dev

何时建议在R中使用稀疏矩阵?

来自分类Dev

使用Jenkins DSL插件进行稀疏签出?