cancel
Showing results for 
Search instead for 
Did you mean: 

Archives Discussions

perhaad
Adept I

OpenCL Event Callback Usage

Syntax for OpenCL Event Call-back

 

Hello Everyone,  I have a question regarding the usage of the clSetEventCallback. 

The call as shown below presently segfaults on my system at the 

clSetEventCallback stage before any real execution happens and the event "device_signal" gets launched

I am using a 5870 with Stream SDK 2.3 and Catalyst 11.1

I am not sure of how the syntax should be to set up a callback for when an 

event is completed.

 

//Setting up a callback

void CL_CALLBACK myCallback( cl_event event,  

            cl_int cmd_exec_status, void *user_data) {

 

// Generates data and moves it to the GPU

}

struct ipargs{

cl_mem ip;  int n;

};

 

//Inside my main()

cl_event device_signal;

ipargs x

//event, status and user data

cl_int errcode = clSetEventCallback( device_signal, CL_COMPLETE, (void *)&x);

I would appreciate it if anyone with experience in setting event callbacks can show the right syntax

 

0 Likes
5 Replies
nou
Exemplar

you don't pass a function pointer into a clSetEventCallback(). it should be like this clSetEventCallback( device_signal, CL_COMPLETE, myCallback, (void *)&x);

0 Likes
perhaad
Adept I

Sorry about that Nou, While copy pasting the text I dropped some text but I am doing the syntax you said. The previous text wouldnt even compile.

 

//! Set the callback

cl_int errcode = clSetEventCallback( device_done_signal, CL_COMPLETE,            myCallback,  (void *)&x);

I have added the gdb stack frame too

 

 

Program received signal SIGSEGV, Segmentation fault.

0x00007ffff7bd9d45 in clSetEventCallback () from /usr/local/amd/lib/x86_64/libOpenCL.so

(gdb) bt

#0  0x00007ffff7bd9d45 in clSetEventCallback () from /usr/local/amd/lib/x86_64/libOpenCL.so

#1  0x0000000000407550 in runTest (argc=1, argv=0x7fffffffe0c8)

I saw on an Nvidia forum that it could happen if you link against a 1.0 version of OpenCL, However the AMD libOpenCL  is 1.1 isnt it ? I have kept any empty function as the callback but it still segfaults

 

0 Likes

it segfault in clSetEventCallback? not when it actualy call that callback function? just try pass NULL as user data.

0 Likes

Hello Nou, Thanks for the response

The segfault was within the clSetEventCallBack, but its my mistake that I was using GCC and it went away when I switched to G++.  I dont know why and it never complained while linking or anything of that sort.

However in proceeding with events I have noticed a new problem. If I want to add a callback to a event that is populated by the runtime eg: a enqueuNDRange

The code would "intuitively" need to be something like

 


 

cl_event e;

clSetEventCallback(e, CL_COMPLETE, mycallback, (void *)&x) ;

enqueuNDRange(____, &e);

 


 

In the above code, the setEventCallback dies  with CL_INVALID_EVENT which could make sense since cl_event after all is just a pointer till the runtime populates it.

So if the kernel was called within a loop, would it be correct to think that the setEventCallBack in this case would  need to be added within the loop so that everytime after  a enqueuNDRange, the callback is set as below 

cl_event e;

 

for (){

   enqueuNDRange(____, &e);

   clSetEventCallback(e, CL_COMPLETE, mycallback, (void *)&x) ;

 

}

Is there a better way ?

 

 

 

0 Likes

no you can set callback on event after it is created with enqueue command.

0 Likes