【问题标题】:Confused Using scikits.cuda.cula使用 scikits.cuda.cula 感到困惑
【发布时间】:2012-08-26 06:16:25
【问题描述】:

我想使用一些 cula 功能,如 LU 分解或矩阵逆,但我对指针输入有一些问题。例如,使用 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)

状态 = _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) :

Traceback(最近一次调用最后一次):文件“”,第 1 行,在文件中 “/usr/local/lib/python2.7/dist-packages/scikits.cuda-0.042-py2.7.egg/scikits/cuda/cula.py”, 第 329 行,在 culaDeviceSgetrf 状态 = _libcula.culaDeviceSgetrf(m, n, int(a), lda, int(ipiv)) TypeError: int() argument must be a string or 一个数字,而不是“GPUArray”

有什么办法吗?

【问题讨论】:

    标签: python cuda scikits


    【解决方案1】:

    错误消息很容易解释。您不能将 gpuarray 直接传递给这些例程,数组参数应该是一个设备指针,该指针在内部转换为 Python ctypes.c_void_p 以传递给 CULA 库。 PyCUDA 的 gpuarray 包含一个成员 ptr,它将返回指向 GPU 内存的底层指针。

    如果你这样做:

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

    它应该可以正常工作[免责声明:从未编译或测试,使用风险自负]。

    【讨论】:

    • 感谢您的回复我通过使用 a_gpu.gpudata 解决了这个问题。这是与此问题相关的链接https://github.com/lebedov/scikits.cuda/issues/20#issuecomment-8202795
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 2023-02-05
    • 2019-09-13
    相关资源
    最近更新 更多