Ich versuche, 2 lokale Arrays für einen Kernel zu erstellen. Mein Ziel ist es, einen globalen Eingabepuffer in das erste Array (arr1) zu kopieren und das zweite Array (arr2) zu instanziieren, so dass auf seine Elemente später zugegriffen werden kann.OpenCL instanziierenden lokalen Speicherarray: ungültiger Zeiger Fehler im Kernel
Mein Kernel sieht wie folgt aus:
__kernel void do_things (__global uchar* in, __global uchar* out,
uint numIterations, __local uchar* arr1, __local uchar* arr2)
{
size_t work_size = get_global_size(0) * get_global_size(1);
event_t event;
async_work_group_copy(arr1, in, work_size, event);
wait_group_events(1, &event);
int cIndex = (get_global_id(0) * get_global_size(1)) + get_global_id(1);
arr2[cIndex] = 0;
//Do other stuff later
}
In der C++ Code, den ich dies aus bin Aufruf, ich die Kernel-Argumente wie folgt festgelegt:
//Create input and output buffers
cl_mem inputBuffer = clCreateBuffer(context, CL_MEM_READ_ONLY |
CL_MEM_COPY_HOST_PTR, myInputVector.size(), (void*)
myInputVector.data(), NULL);
cl_mem outputBuffer = clCreateBuffer(context, CL_MEM_WRITE_ONLY,
myInputVector.size(), NULL, NULL);
//Set kernel arguments.
clSetKernelArg(kernel, 0, sizeof(cl_mem), (void*)&inputBuffer));
clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&outputBuffer));
clSetKernelArg(kernel, 2, sizeof(cl_uint), &iterations));
clSetKernelArg(kernel, 3, sizeof(inputBuffer), NULL));
clSetKernelArg(kernel, 4, sizeof(inputBuffer), NULL));
Wo myInputVector einen Vektor voll ist Uchars.
Dann enqueue ich es mit einer 2D-Arbeitsgröße, Zeilen * Spalten groß. myInputVector hat eine Größe von Zeilen * Spalten.
Das Problem ist, ich bekomme Abstürze, wenn ich den Kernel ausführen. Insbesondere diese Zeile im Kernel:
arr2[cIndex] = 0;
ist verantwortlich für den Absturz (Weglassen macht es so dass es nicht mehr funktioniert Absturz). Der Fehler lautet:
*** glibc detected *** ./MyProgram: free(): invalid pointer: 0x0000000001a28fb0 ***
Alles, was ich will, ist in der Lage sein, auf arr2 neben Arr1 zuzugreifen. arr2 sollte die gleiche Größe wie arr1 haben. Wenn das der Fall ist, Warum bekomme ich diesen bizarren Fehler? Warum ist das ein ungültiger Zeiger?
wie 'inputBuffer' definiert ist? – simpel01
es ist genau da oben erstellt: cl_mem inputBuffer = clCreateBuffer (Kontext, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, meinInputVector.size(), (void *) myInputVector.data(), NULL); – user3760657
Entschuldigung, ich meinte 'myInputVector'. – simpel01