- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 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
) 进行调试会产生以下堆栈跟踪,
#0 0x00007fffd9e3b71a in cusolverSpXcsrissymHost () from /usr/local/cuda/lib64/libcusolver.so #1 0x00007fffd9df5237 in hsolverXcsrqr_zeroPivot () from /usr/local/cuda/lib64/libcusolver.so
#2 0x00007fffd9e0c764 in hsolverXcsrqr_analysis_coletree () from /usr/local/cuda/lib64/libcusolver.so
#3 0x00007fffd9f160a0 in cusolverXcsrqr_analysis () from /usr/local/cuda/lib64/libcusolver.so
#4 0x00007fffd9f28d78 in cusolverSpScsrlsvqr () from /usr/local/cuda/lib64/libcusolver.so
这很奇怪,因为我不调用 cusolverSpScsrlsvqr() 也不认为它应该调用主机函数 (cusolverSpXcsrissymHost)。
这是我正在谈论的代码 - 感谢您的帮助:
# ### 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))
最佳答案
将 descrA
设置为 ctypes.c_void_p()
并将 cusolverSpDcsrlsvqr
包装器中的 cusparseMatDescr_t
替换为 ctypes.c_void_p
应该可以解决问题。
关于python - 使用 PyCUDA 连接 cuSOLVER-sparse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30460074/
我正在尝试在 cuSOLVER 中使用 QR 线性系统求解器,这个 #include #include #include #include #include "device_launch_pa
我需要用 cuda 计算矩阵( double 组)的行列式,我想使用 LU 分解来执行此操作。我在 cusolverSp.h 中找不到设备函数,但只有主机函数 cusolverSpDcsrlsvluH
我正在尝试使用 PyCUDA 连接稀疏 cuSOLVER 例程cusolverSpDcsrlsvqr()(>= CUDA 7.0),但我遇到了一些困难:我尝试用与密集 cuSolver 例程包装在 s
我基本上尝试了所有方法,但无法让 vs2013 编译和链接 cusolver 库。 cuda安装包自带的样例项目我都试过了,基本都能正常使用。虽然没有使用 cusolver 的示例。包含文件工作得很好
我正在尝试使用 CUDA 7.0 RC 中发布的 cuSolver 计算最大的特征值/特征向量对。问题是我遇到了 CUSOLVER_INTERNAL_ERROR,我不知道该怎么办。 这是我手头的东西,
我正在尝试使用 cuSOLVER 中的 gesvd 函数,我发现它比 MATLAB 中的 svd 函数慢得多,因为这两种情况都使用 double 数组或 gpuArray。 C++ 代码 [使用 cu
我正在浏览 cuSolver example在文档中出现以下错误: fatal error: cudense.h: No such file or directory 编译和链接,“make -n”:
我是一名优秀的程序员,十分优秀!