Sto usando PyOpenCL per elaborare le immagini in Python e inviare un array 3D di numpy (height
x width
x 4
) al kernel. Sto riscontrando problemi nell'indicizzazione dell'array 3D all'interno del codice del kernel. Per ora sono solo in grado di copiare l'intero array di input per l'output. Il codice attuale assomiglia a questo, in cui img
è l'immagine con img.shape = (320, 512, 4)
:PyOpenCL indicizzazione di array 3D all'interno del codice del kernel
__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];
}
Tuttavia, io non capisco come questo lavoro. Ad esempio, come faccio a indicizzare l'equivalente Python di img[1, 2, 3]
all'interno di questo kernel? E inoltre, quale indice dovrebbe essere utilizzato in results
per la memorizzazione di qualche elemento se voglio che sia nella posizione results[1, 2, 3]
nell'array numpy quando ottengo i risultati di nuovo in Python?
Per eseguire questa Sto usando questo codice Python:
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())
ho visto, che PyOpenCL dovrebbe essere in grado di interfacciarsi direttamente Array CL come è. Ciononostante, non sono riuscito a farlo includendo l'indicizzazione. – Dschoni
Questa domanda è ancora pertinente? Potrei avere alcune informazioni interessanti da aggiungere se sei disposto a provare. – jurij
@jurij non per me più. Ma se hai alcune intuizioni preziose, sentiti libero di condividerle con altri, che potrebbero incontrare lo stesso problema. – nikicc