The Intel® FPGA SDK for OpenCL™ compiler provides a guarantee that statements in an NDRange kernel are executed by threads in order of their thread-identifiers. To ensure the guarantee is met in programs that contain thread-dependent control-flow, a re-ordering barrier is inserted by the compiler at the join point of thread-dependent control-flow paths. A fault in the configuration of such barriers causes computation to stall at the barrier without possibility of forward progress.
Channel operations can also cause this stall.
Shown below is an example of a “thread-dependent control-flow construct”:
//Get global thread ID
int id = get_global_id(0);
//Make sure we do not go out of bounds
if (id < n)
c[id] = a[id] b[id];
Here, the if statement is a control-flow construct that is thread-dependent, i.e. what it does depends on which thread executes it.
Re-write the NDRange kernel to not contain any channel operations or thread-dependent control-flow constructs.
This problem is scheduled to be fixed in a future version of the Intel® FPGA SDK for OpenCL software.