Ich verwende PyOpenCL, um Bilder in Python zu verarbeiten und ein 3D-Numpy-Array (x width
x 4
) an den Kernel zu senden. Ich habe Probleme beim Indexieren des 3D-Arrays innerhalb des Kernel-Codes. Zum jetzigen Zeitpunkt kann ich nur das gesamte Eingangsarray an den Ausgang kopieren. Der aktuelle Code sieht wie folgt aus, wo img
ist das Bild mit img.shape = (320, 512, 4)
:PyOpenCL Indizierung von 3D-Arrays im Kernel-Code
__kernel void part1(__global float* img, __global float* results)
{
unsigned int x = get_global_id(0);
unsigned int y = get_global_id(1);
unsigned int z = get_global_id(2);
int index = x + 320*y + 320*512*z;
results[index] = img[index];
}
Aber ich verstehe nicht ganz, wie diese Arbeit. Zum Beispiel, wie indexiere ich das Python-Äquivalent von img[1, 2, 3]
in diesem Kernel? Und weiter, welcher Index sollte in results
für das Speichern einiger Artikel verwendet werden, wenn ich möchte, dass es auf der Position results[1, 2, 3]
im numpy Array ist, wenn ich die Ergebnisse zurück zu Python bekomme?
So führen diese ich diesen Python-Code verwenden:
import pyopencl as cl
import numpy as np
class OpenCL:
def __init__(self):
self.ctx = cl.create_some_context()
self.queue = cl.CommandQueue(self.ctx)
def loadProgram(self, filename):
f = open(filename, 'r')
fstr = "".join(f.readlines())
self.program = cl.Program(self.ctx, fstr).build()
def opencl_energy(self, img):
mf = cl.mem_flags
self.img = img.astype(np.float32)
self.img_buf = cl.Buffer(self.ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=self.img)
self.dest_buf = cl.Buffer(self.ctx, mf.WRITE_ONLY, self.img.nbytes)
self.program.part1(self.queue, self.img.shape, None, self.img_buf, self.dest_buf)
c = np.empty_like(self.img)
cl.enqueue_read_buffer(self.queue, self.dest_buf, c).wait()
return c
example = OpenCL()
example.loadProgram("get_energy.cl")
image = np.random.rand(320, 512, 4)
image = image.astype(np.float32)
results = example.opencl_energy(image)
print("All items are equal:", (results==image).all())
Ich sah, dass pyopenCL direkt in der Lage sein sollte, CL Arrays wie es ist. Ich habe es jedoch nicht geschafft, dies einschließlich Indexierung zu tun. – Dschoni
Ist diese Frage noch relevant? Ich könnte einige interessante Informationen hinzufügen, wenn Sie bereit sind, es zu versuchen. – jurij
@jurij nicht mehr für mich. Aber wenn Sie wertvolle Einsichten haben, können Sie diese für andere freigeben, die das gleiche Problem haben könnten. – nikicc