2016-04-08 3 views
3

CUDAカーネルをPythonで書く方法を教えてください。 AFAIK、numba.vectorizeは、ターゲットに基づいて、cuda、cpu、parallel(multi-cpus)で実行できます。しかしtarget = 'cuda'にはCUDAカーネルを設定する必要があります。あなたが初心者している場合は特に、CUDA-Python:PythonでCUDAカーネルを起動するにはどうすればいいですか(Numba 0.25)?

主な問題は、多くの例、インターネットで回答がに関連しているということですが NumbaProライブラリを非推奨なので、、更新されていないWIKIsなどに従うのは難しいです。

私が持っている:ここでは

  • 最新のアナコンダ(V2)
  • 最新Numba(v0.25)
  • 最新のCUDAツールキット(V7)

は、私はエラーです取得:

numba.cuda.cudadrv.driver.CudaAPIError: 1 Call to cuLaunchKernel results in CU DA_ERROR_INVALID_VALUE

import numpy as np 
import time 

from numba import vectorize, cuda 

@vectorize(['float32(float32, float32)'], target='cuda') 
def VectorAdd(a, b): 
    return a + b 

def main(): 
    N = 32000000 

    A = np.ones(N, dtype=np.float32) 
    B = np.ones(N, dtype=np.float32) 

    start = time.time() 
    C = VectorAdd(A, B) 
    vector_add_time = time.time() - start 

    print "C[:5] = " + str(C[:5]) 
    print "C[-5:] = " + str(C[-5:]) 

    print "VectorAdd took for % seconds" % vector_add_time 

if __name__ == '__main__': 
    main() 
+1

あなたが投稿したコードと間違って何もありません。私は間違いなくそれを実行することができます。私は2つの可能性を考えることができます - (a)あなたのnumbaのインストールは完全に壊れているか、(b)あなたのGPUにはほとんどメモリがありません。 GPUにメモリが不足している場合は、3つの128Mbベクトルをデバイスに割り当てます。 Nをもっと小さくして何が起こるかを見てみてください。 – talonmies

+0

@talonmies、うわー、N = 1000万で働き、20万人で失敗します。 3 x 128 Mbの計算方法を教えてください。私はGeForce 820Mを持っています、そのメモリは2Gbです、私は – Novitoll

+1

32000000 * 4 = 128Mbと信じています。また、GPUがディスプレイを実行していて、計算容量が多くない場合は、 – talonmies

答えて

1

投稿されたコードは正しいもので、Python 2 Numbapro/Accelerateシステムでエラーなく実行されます。

コードを実行するために使用されている特定のシステムの容量がそれほど大きくなく、3200万要素ベクトルのディスプレイドライバウォッチドッグまたは空きメモリエラーに遭遇した可能性があります。入力データのサイズを小さくすると、コードが正しく実行されました。

[この答えは、コメントから組み立てられ、未回答のリストから外れ、この質問を取得するためにコミュニティのwikiのエントリとして追加]

関連する問題