Я пытаюсь создать оболочку pycuda, вдохновленную библиотекой scikits-cuda. , для некоторых операций, предусмотренных в новой библиотеке cuSolver от Nvidia, сначала мне нужно выполнить факторизацию LU через cusolverDnSgetrf() op. но перед этим мне нужен аргумент «Рабочее пространство», инструмент, который cuSolver предоставляет для получения, который называется cusolverDnSgetrf_bufferSize(); но когда я его использую, просто происходит сбой и возвращается ошибка сегментации. Что я делаю неправильно?
Примечание. Я уже работал над этой операцией с помощью scikits-cuda, но библиотека cuSolver часто использует такие аргументы, и я хочу сравнить использование между scikits-cuda и моей реализацией с новой библиотекой.
import numpy as np
import pycuda.gpuarray
import ctypes
import ctypes.util
libcusolver = ctypes.cdll.LoadLibrary('libcusolver.so')
class _types:
handle = ctypes.c_void_p
libcusolver.cusolverDnCreate.restype = int
libcusolver.cusolverDnCreate.argtypes = [_types.handle]
def cusolverCreate():
handle = _types.handle()
libcusolver.cusolverDnCreate(ctypes.byref(handle))
return handle.value
libcusolver.cusolverDnDestroy.restype = int
libcusolver.cusolverDnDestroy.argtypes = [_types.handle]
def cusolverDestroy(handle):
libcusolver.cusolverDnDestroy(handle)
libcusolver.cusolverDnSgetrf_bufferSize.restype = int
libcusolver.cusolverDnSgetrf_bufferSize.argtypes =[_types.handle,
ctypes.c_int,
ctypes.c_int,
ctypes.c_void_p,
ctypes.c_int,
ctypes.c_void_p]
def cusolverLUFactorization(handle, matrix):
m,n=matrix.shape
mtx_gpu = gpuarray.to_gpu(matrix.astype('float32'))
work=gpuarray.zeros(1, np.float32)
status=libcusolver.cusolverDnSgetrf_bufferSize(
handle, m, n,
int(mtx_gpu.gpudata),
n, int(work.gpudata))
print status
x = np.asarray(np.random.rand(3, 3), np.float32)
handle_solver=cusolverCreate()
cusolverLUFactorization(handle_solver,x)
cusolverDestroy(handle_solver)