2016-04-30 5 views
0

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?

+0

wie 'inputBuffer' definiert ist? – simpel01

+0

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

+0

Entschuldigung, ich meinte 'myInputVector'. – simpel01

Antwort

0

Das Problem ist, dass Sie nur sizeof(cl_mem) für Ihre lokalen Puffer zuweisen. Und ein cl_mem ist einfach ein typedef von einer Art von Zeigertyp (daher 4 bis 8 Bytes abhängig von Ihrem System).

Was dann in Ihrem Kernel passiert ist, dass Sie über die Größe des lokalen Puffers zugreifen, den Sie zugewiesen haben, und die GPU startet einen Speicherfehler.

clSetKernelArg(kernel, 3, myInputVector.size(), NULL); 
clSetKernelArg(kernel, 4, myInputVector.size(), NULL); 

Sollte Ihr Problem beheben. Beachten Sie auch, dass die Größe, die Sie angeben, die Größe in Byte ist. Sie müssten also mit dem Vektorelementtyp sizeof multiplizieren (was nicht klar aus dem Code hervorgeht).

Verwandte Themen