2016-04-08 9 views
3

Könntest du mir bitte helfen, zu verstehen, wie man CUDA-Kernel in Python schreibt? AFAIK, numba.vectorize kann durchgeführt werden auf cuda, CPU, parallel (multi-cpus), basierend auf Ziel. Aber target = 'cuda' erfordert CUDA-Kernel einrichten.CUDA-Python: Wie startet man den CUDA Kernel in Python (Numba 0.25)?

Das Hauptproblem ist, dass viele Beispiele, sind Antworten in Internet zu NumbaPro Bibliothek veraltete verwendet, so ist es schwer zu wie nicht aktualisierteWIKIs, besonders wenn Sie Neuling zu folgen.

ich habe:

  • neuesten Anaconda (v2)
  • neuesten Numba (V0.25)
  • neuester CUDA Toolkit (v7)

Hier ist der Fehler, den ich bin bekommen:

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

Es ist nichts falsch mit dem Code, den Sie geschrieben. Ich kann es ohne Fehler ausführen. Ich kann mir zwei Möglichkeiten vorstellen: (a) Ihre numba-Installation ist völlig kaputt, oder (b) Ihre GPU hat sehr wenig Speicher. Sie weisen dem Gerät drei 128-MB-Vektoren zu, wenn die GPU nicht viel Speicher hat, könnten Sie nicht mehr genügend Speicherplatz haben. Versuchen Sie, N auf etwas viel kleineres zu reduzieren und zu sehen, was passiert – talonmies

+0

@talonmies, wow, es funktionierte mit N = 10 Millionen und scheitert mit 20 Millionen. Könnten Sie mir bitte sagen, wie Sie 3 x 128 Mb berechnet haben? Ich habe GeForce 820M, es ist Speicher ist 2 GB, glaube ich – Novitoll

+1

32000000 * 4 = 128 MB. Sie könnten auch die Watchdog-Timer-Grenzwerte für Ihre GPU treffen, wenn es ein Display ausführt und nicht viel Rechenkapazität hat. – talonmies

Antwort

1

Der Code, wie geschrieben, ist richtig und wird auf einen Python 2 Numbapro/Beschleunigen System ohne Fehler ausgeführt.

Es war wahrscheinlich, daß das bestimmte System des Code nicht sehr groß in der Kapazität laufen verwendet und war einen Anzeigetreiber Watchdog oder freie Speicherfehler mit 32 Millionen Elementvektoren zu schlagen. Durch die Verringerung der Größe der Eingabedaten konnte der Code ordnungsgemäß ausgeführt werden.

[Diese Antwort von Kommentaren zusammengestellt und als Community Wiki-Eintrag hinzugefügt, um diese Frage aus der unbeantwortet Liste zu bekommen]