2016-03-06 19 views
0

我已经使用numba.SmartArrays编写了用于添加向量的代码。我第一次使用这款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 
+1

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

回答

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驻留对象。

+0

谢谢@talonmies您的建议。我尝试了同样的事情,但仍然无法解决错误。我不确定我正在使用的签名装饰器@jit。 'code' @ cuda.jit(uint32 [:],uint32 [:],uint32 [:],type =“gpu”) def additionG(c,a,b): –

+0

@SankalpVairat:问题非常清楚地由'dA = cuda.to_device(a)'这一行产生 - JIT调用应该与错误无关 – talonmies

1

自从我发布这个问题以来,它已经有一段时间了。仍然发布答案,以便有人在未来可能会发现它有帮助。

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__()