Pyopencl: Unterschied zwischen to_device und Buffer

8

Lassen Sie

%Vor%

Was ist der Unterschied zwischen

? %Vor%

und

%Vor%

?

Und was ist der Unterschied zwischen

? %Vor%

und

%Vor%

?

    
petRUShka 15.11.2012, 11:18
quelle

2 Antworten

16

Puffer sind die CL-Version von malloc , während pyopencl.array.Array ein Workalike von numpigen Arrays auf dem Rechengerät ist.

Also können Sie für die zweite Version des ersten Teils Ihrer Frage a_gpu + 2 schreiben, um ein neues Array zu erhalten, das zu jeder Zahl in Ihrem Array 2 hinzugefügt hat, während im Falle von Buffer nur PyOpenCL gilt sieht einen Beutel mit Bytes und kann keinen solchen Vorgang ausführen.

Der zweite Teil Ihrer Frage ist in umgekehrter Reihenfolge der gleiche: Wenn Sie ein PyOpenCL-Array haben, kopiert .get() die Daten zurück und konvertiert sie in ein (hostbasiertes) numpy-Array. Da numpige Arrays eine der bequemeren Möglichkeiten sind, zusammenhängendes Gedächtnis in Python zu erhalten, endet die zweite Variante mit enqueue_copy ebenfalls in einem numply-Array - aber Sie könnten diese Daten in ein Array beliebiger Größe kopiert haben ( Solange es groß genug ist) und jeden Typ - die Kopie wird als eine Tasche von Bytes durchgeführt, während .get() sicherstellt, dass Sie die gleiche Größe und den gleichen Typ auf dem Host erhalten.

Bonus Tatsache: Es gibt natürlich einen Puffer, der jedem PyOpenCL Array zugrunde liegt. Sie können es vom Attribut .data erhalten.

    
Andreas Klöckner 24.11.2012, 16:50
quelle
3

Um die erste Frage zu beantworten, kann Buffer(hostbuf=...) mit allem aufgerufen werden, was die Pufferschnittstelle ( Referenz ). pyopencl.array.to_device(...) muss mit einem ndarray ( Verweis ) aufgerufen werden. ndarray implementiert die Pufferschnittstelle und funktioniert an beiden Stellen. Es wird jedoch erwartet, dass nur hostbuf=... mit beispielsweise bytearray arbeitet (was auch die Pufferschnittstelle implementiert). Ich habe das nicht bestätigt, aber es scheint so zu sein, was die Dokumente vorschlagen.

Bei der zweiten Frage bin ich nicht sicher, welcher Typ result_gpu sein soll, wenn Sie get() aufrufen (meinten Sie Buffer.get_host_array() ?) In jedem Fall funktioniert enqueue_copy() zwischen Kombination von Buffer , Image und host , können Offsets und Regionen haben und können asynchron sein (mit is_blocking=False ), und ich denke, dass diese Funktionen nur auf diese Weise verfügbar sind (wohingegen get() blockieren würde und das Ganze zurückgeben würde) Puffer). ( Referenz )

    
Alex I 21.11.2012 06:13
quelle

Tags und Links