Meine Kernel-Argumente sind die folgenden:Wie übergeben Sie private Array als Argumente an OpenCL-Kernel?
__kernel void
codesGPU(struct stateGPU* s,
short* lencnt,
short* lensym,
short* distcnt,
short* distsym,
__global const struct in_unit* input,
__global struct out_unit* output,
struct contextGPU* ctx,
__global const short* lens,
__global const short* lext,
__global const short* dists,
__global const short* dext,
int* outsize
)
input
und output
„global“ sind, weil sie Ein-/Ausgangsdaten für alle Arbeits-Elemente enthalten, die durch get_global_id(0)
getrennt sind. lens, next, dists, dext
sind 4 konstante globale Arrays, die von allen Arbeitselementen gemeinsam genutzt werden. Daher deklariere ich sie als global constant
. Die Restargumente sind jedoch für jedes Arbeitselement privat. Dazu gehören Skalare wie outsize
und Arrays wie lencnt
. Ich verwende hier Zeiger, weil ich diese Argumente nach der GPU-Berechnung immer noch an die CPU weitergeben muss.
Meine Frage ist:
Ist es möglich, kerne privaten Arrays zu übergeben?
Was ist der beste Weg, um diese Variablen (unterschiedlich für jedes Work-Element, und wollen immer noch den Wert zurückgeben) Kernel übergeben?
Wie soll ich den Kernel-Code und C-Code schreiben?
Der Kernel ruft auch zwei Hilfsfunktionen in .cl Code:
int fun1(struct stateGPU *s, short *countarr, short *symarr, __global const struct in_unit *input, int *idx, struct contextGPU* ctx, int did)
int fun2(struct stateGPU *s, int need, __global const struct in_unit* input, int *idx, struct contextGPU* ctx, int gid)
Im main.c schaffe ich Puffer Objekte für globale Variablen und geben sie als
cl_mem cl_lens;
cl_lens = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(lens), lens, &err);
err |= clSetKernelArg(kernel, 8, sizeof(cl_mem), (void *)&cl_lens);
Kann jemand auf der Grundlage meines Problems Vorschläge machen, wie man andere Argumente an den Kernel weitergibt? Vielen Dank!
Denkst du nicht, dass diese Fragen nur ein bisschen allgemein sind? Für wen ist das Array "privat"? Wenn das Modul, an das die Arrays übergeben werden, keinen Zugriff auf diese Speicherbereiche hat, werden Sie Probleme bekommen. Seien Sie sich stets der Einstellungen des Segmentregisters bewusst. –