0

Nvidia の新しい cuSolver ライブラリで提供されるいくつかの操作のために、scikits-cuda ライブラリに 触発れた pycuda ラッパーを作成しようとしています。しかし、その前に「Workspace」引数が必要です。これを取得するために 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)
4

1 に答える 1

2

の最後のパラメーターはcusolverDnSgetrf_bufferSize、GPU メモリ ポインターではなく、通常のポインターである必要があります。cusolverLUFactorization()次のように関数を変更してみてください。

def cusolverLUFactorization(handle, matrix):
    m,n=matrix.shape
    mtx_gpu = gpuarray.to_gpu(matrix.astype('float32'))

    work = ctypes.c_int()
    status = libcusolver.cusolverDnSgetrf_bufferSize(
                         handle, m, n,
                         int(mtx_gpu.gpudata),
                         n, ctypes.pointer(work))
    print status
    print work.value

于 2015-04-21T21:07:34.100 に答える