0

LU 因数分解や逆行列などの cula 機能を使用したいのですが、ポインター入力に関して問題があります。たとえば、 scikits.cuda.cula.culaDeviceSgetrf(m, n, a, lda, ipiv) で LU 因数分解を行うには、ポインター f "a" 引数を使用する必要がありますが、Python には明示的にポインターがありません (すべての変数を知っています)。 pythonはrefによるものです)。では、この場合はどうすればよいのでしょうか。ctype ライブラリを使用して Python を作成する必要がありますか?

これは私がやろうとしていることです:

   import numpy as np

   import scikits.cuda.cula as cula
   import pycuda.gpuarray as gpuarray

   cula.culaInitialize()

   //I create a square matrix for simplicity 
   a=np.array([[1,2,3,4],[6,7,8,9],[7,2,3,5],[2,4,5,6]])

   n=b.shape[0]
   ida=ipv=m

   scikits.cuda.cula.culaDeviceSgetrf(m,n,a,n,n)

status = _libcula.culaDeviceSgetrf(m, n, int(a), lda, int(ipiv)) TypeError: 長さ 1 の配列のみを Python スカラーに変換できます

そして試してみると

a_gpu = gpuarray.to_gpu(a)
scikits.cuda.cula.culaDeviceSgetrf(m,n,a_gpu,n,n) :

トレースバック (最新の呼び出しが最後): ファイル ""、1 行目、ファイル "/usr/local/lib/python2.7/dist-packages/scikits.cuda-0.042-py2.7.egg/scikits/cuda/cula 内.py"、329 行目、culaDeviceSgetrf status = _libcula.culaDeviceSgetrf(m, n, int(a), lda, int(ipiv)) TypeError: int() 引数は、'GPUArray' ではなく、文字列または数値でなければなりません

解決策はありますか?

4

1 に答える 1

0

エラーメッセージは一目瞭然です。gpuarrayこれらのルーチンに a を直接渡すことはできません。配列引数はctypes.c_void_p、CULA ライブラリに渡すために Python に内部的にキャストされるデバイス ポインターであることが期待されます。PyCUDAには、基になるポインターを GPU メモリに返すgpuarrayメンバーが含まれています。ptr

次のようなことをすると:

a_gpu = gpuarray.to_gpu(a)
scikits.cuda.cula.culaDeviceSgetrf(m,n,a_gpu.ptr,n,n)

正しく動作するはずです [免責事項: コンパイルもテストもされていません。自己責任で使用してください]。

于 2012-09-02T07:38:23.157 に答える