2016-03-06 32 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__()