2015-10-30 12 views
0

Я пытаюсь использовать обертки scikit-cuda для функций cuSOLVER, в частности, я хочу выполнить cusolverDnSgesvd для вычисления полноразмерной одиночной точности SVD на матрице действительных чисел.Использовать scikit-cuda для вычисления декомпозиции сингулярных значений с помощью cuSOLVER

Использование кода here и here в качестве эталона, мне удалось получить это далеко:

import pycuda.autoinit 
import pycuda.driver as drv 
import pycuda.gpuarray as gpuarray 
import numpy as np 

from skcuda import cusolver 


handle = cusolver.cusolverDnCreate() 

m = 50 
n = 25 

a = np.asarray(np.random.random((m, n))) 
a_gpu = gpuarray.to_gpu(a) 

ldu = m 
ldvt = n 

s_gpu = gpuarray.empty(min(m, n), np.float32) 
u_gpu = gpuarray.empty((ldu, m), np.float32) 
vh_gpu = gpuarray.empty((n, n), np.float32) 

work_size = cusolver.cusolverDnSgesvd_bufferSize(handle, m, n) 

work = gpuarray.empty((m,n), np.float32) 

u_gpu, s_gpu, vh_gpu = cusolver.cusolverDnSgesvd(
    handle=handle, 
    jobu='A', 
    jobvt='A', 
    m=m, 
    n=n, 
    A=a, 
    lda=m, 
    S=s_gpu, 
    U=u_gpu, 
    ldu=ldu, 
    VT=vh_gpu, 
    ldvt=ldvt, 
    Work=work, 
    Lwork=work_size, 
    rwork=None, 
    devInfo=0 
) 

Но код не работает, вероятно, потому, что я Мессинг с типами.

Traceback (most recent call last): 
    File "/home/vektor/PycharmProjects/yancut/test_svd.py", line 44, in <module> 
    devInfo=0 
    File "/home/vektor/anaconda3/lib/python3.4/site-packages/skcuda/cusolver.py", line 577, in cusolverDnSgesvd 
    int(A), lda, int(S), int(U), 
TypeError: only length-1 arrays can be converted to Python scalars 

Как я могу предоставить все аргументы, чтобы SVD был выполнен надлежащим образом?

Update1: После использования this вопроса в качестве ссылки, я редактировал свой код, и я получаю новую ошибку.

import pycuda.autoinit 
import pycuda.driver as drv 
import pycuda.gpuarray as gpuarray 
import numpy as np 

import ctypes 

from skcuda import cusolver 

rows = 20 
cols = 10 

a = np.asarray(np.random.random((rows, cols))) 
a_gpu = gpuarray.to_gpu(a.copy()) 
lda = rows 

u_gpu = gpuarray.empty((rows, rows), np.float32) 
v_gpu = gpuarray.empty((cols, cols), np.float32) 
s_gpu = gpuarray.empty(cols, np.float32) 
devInfo = gpuarray.zeros(1, np.int32) 

handle = cusolver.cusolverDnCreate() 

worksize = cusolver.cusolverDnSgesvd_bufferSize(handle, rows, cols) 
print("SIZE", worksize) 

Workspace = gpuarray.empty(worksize, np.float32) 

svd_status = cusolver.cusolverDnSgesvd(
    handle=handle, 
    jobu='A', 
    jobvt='A', 
    m=rows, 
    n=cols, 
    A=a_gpu.ptr, 
    lda=rows, 
    S=s_gpu.ptr, 
    U=u_gpu.ptr, 
    ldu=rows, 
    VT=v_gpu.ptr, 
    ldvt=cols, 
    Work=Workspace.ptr, 
    Lwork=worksize, 
    rwork=Workspace.ptr, 
    devInfo=devInfo.ptr 
) 
status = cusolver.cusolverDnDestroy(handle) 

И я получаю новую ошибку

Traceback (most recent call last): 
    File "/home/vektor/PycharmProjects/yancut/test_svd.py", line 53, in <module> 
    devInfo=devInfo.ptr 
    File "/home/vektor/anaconda3/lib/python3.4/site-packages/skcuda/cusolver.py", line 579, in cusolverDnSgesvd 
    Lwork, int(rwork), int(devInfo)) 
ctypes.ArgumentError: argument 2: <class 'TypeError'>: wrong type 

Теперь кажется, что я делаю что-то неправильно с Devinfo

+0

* «Но код не работает» *: каков ваш желаемый результат, который вы получаете вместо этого? отредактируйте ваш вопрос –

+0

@ m.s. извините, я был отвлечен и забыл добавить дополнительные подробности. В основном я предоставляю правильные аргументы, но в неправильном формате, нужный вывод - это полные матрицы U, S, VT SVD. – Vektor88

+0

Вы не скопировали весь текст сообщения об ошибке, он частично отключен. Не могли бы вы отредактировать полный текст ошибки в вопросе? – talonmies

ответ

2

Из documentation он выглядит как каждая из матриц (так A, S, U, VT) должны быть переданы как указатели устройств. Итак, для PyCUDA gpuarrays, пройдите A.ptr, а не A. и т. д., и он должен работать.

+0

Спасибо за указания, я уже пытался что-то подобное, и мой код близок к компиляции, я отредактировал свой вопрос с новым кодом. – Vektor88