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.
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 )