【问题标题】:How to use numba.SmartArrays for vector addition?如何使用 numba.SmartArrays 进行向量加法?
【发布时间】:2016-06-20 10:24:37
【问题描述】:

我已经使用 numba.SmartArrays 编写了这个向量加法代码。我第一次使用这个 numba.SmartArrays。我不确定如何使用它。 此代码不起作用,它正在引发错误。

    import numpy as np
    from numba import SmartArray,cuda, jit, uint32


    li1=np.uint32([1,2,3,4])
    li=np.uint32([1,2,3,4])
    b=SmartArray(li,where="host",copy=True)
    a=SmartArray(li1,where="host",copy=True)
    c=np.uint32([1,1,1,1])
    print type(li)
    print type(a)

    @cuda.jit('void(uint32[:],uint32[:],uint32[:])',type="gpu")
    def additionG(c,a,b):
        idx=cuda.threadIdx.x+cuda.blockDim.x*cuda.blockIdx.x

        if idx< len(a):
            a[idx]=c[idx]+b[idx]

    dA=cuda.to_device(a)
    dB=cuda.to_device(b)
    dC=cuda.to_device(c)
    additionG[1, 128](c,a,b)

    print a.__array__()

错误:

    <type 'numpy.ndarray'>
    <class 'numba.smartarray.SmartArray'>
    Traceback (most recent call last):
      File "C:\Users\hp-pc\My Documents\LiClipse Workspace\cuda\blowfishgpu_smart_arrays.py", line 20, in <module>
        dA=cuda.to_device(a)
      File "C:\Anaconda\lib\site-packages\numba\cuda\cudadrv\devices.py", line 257, in _require_cuda_context
        return fn(*args, **kws)
      File "C:\Anaconda\lib\site-packages\numba\cuda\api.py", line 55, in to_device
        to, new = devicearray.auto_device(obj, stream=stream, copy=copy)
      File "C:\Anaconda\lib\site-packages\numba\cuda\cudadrv\devicearray.py", line 403, in auto_device
        devobj.copy_to_device(obj, stream=stream)
      File "C:\Anaconda\lib\site-packages\numba\cuda\cudadrv\devicearray.py", line 148, in copy_to_device
        sz = min(_driver.host_memory_size(ary), self.alloc_size)
      File "C:\Anaconda\lib\site-packages\numba\cuda\cudadrv\driver.py", line 1348, in host_memory_size
        s, e = host_memory_extents(obj)
      File "C:\Anaconda\lib\site-packages\numba\cuda\cudadrv\driver.py", line 1333, in host_memory_extents
        return mviewbuf.memoryview_get_extents(obj)
    TypeError: expected a readable buffer object

【问题讨论】:

  • @Olivier De Meulder:您的编辑以非常重要的方式更改了问题中的代码。永远不要那样做。

标签: python cuda gpu numba


【解决方案1】:

在我看来 cuda.to_device 不处理智能数组,这有点道理,因为智能数组应该取消显式复制管理。

如果我对文档的阅读是正确的(我之前从未尝试过SmartArray),那么您应该可以更改它

dA=cuda.to_device(a)
dB=cuda.to_device(b)
dC=cuda.to_device(c)
additionG[1, 128](c,a,b)

只是

dC=cuda.to_device(c)
additionG[1, 128](dC,a.gpu(),b.gpu())

.gpu() 方法应返回内核可以理解和访问的 GPU 常驻对象。

【讨论】:

  • 感谢@talonmies 的建议。我尝试了同样的事情,但仍然无法解决错误。我不确定我正在使用的签名装饰器@jit。 code@cuda.jit(uint32[:],uint32[:],uint32[:],type="gpu") def 加法G(c,a,b):
  • @SankalpVairat:您在问题中发布的错误很明显是由dA=cuda.to_device(a) 行产生的- JIT 调用应该与错误无关
【解决方案2】:

我已经有一段时间没有发布这个问题了。仍然发布答案,以便将来有人会发现它有帮助。

import numpy as np
from numba import SmartArray,cuda, jit, uint32,autojit

li1=np.uint32([6,7,8,9])
li=np.uint32([1,2,3,4])

a=SmartArray(li1,where='host',copy=True)
b=SmartArray(li,where="host",copy=True)

c=np.uint32([1,1,1,1])

def additionG(a,c):
    idx=cuda.threadIdx.x+cuda.blockDim.x*cuda.blockIdx.x

    if idx < len(c):
        a[idx]=a[idx]+c[idx]

    cuda.syncthreads()

bpg=1
tpb=128
dC=cuda.to_device(c)
cfunc = cuda.jit()(additionG)
cfunc[bpg, tpb](a,dC)

print a.__array__()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    相关资源
    最近更新 更多