fix potential race condition in canny.cl.
authorZhigang Gong <zhigang.gong@linux.intel.com>
Tue, 15 Mar 2016 11:11:15 +0000 (19:11 +0800)
committerZhigang Gong <zhigang.gong@linux.intel.com>
Tue, 15 Mar 2016 11:11:15 +0000 (19:11 +0800)
commit0b08d2559eaf2a6d3d7370a9aea26df0536c3b2a
tree0017a08b4bf84dbc30338ad14c7e971c1e8624e5
parent947307baaeb38ce071540869f3c11ab12e99dea1
fix potential race condition in canny.cl.

See the below code snippet:

while(l_counter != 0)
{
    int mod = l_counter % LOCAL_TOTAL;
    int pix_per_thr = l_counter / LOCAL_TOTAL + ((lid < mod) ? 1 : 0);

    for (int i = 0; i < pix_per_thr; ++i)
    {
        int index = atomic_dec(&l_counter) - 1;
        ....
    }
    ....
    barrier(CLK_LOCAL_MEM_FENCE);
}

If we don't put a barrier before the for loop, then there is a possiblity
that some work item enter this loop but the others are not, the the l_counter
will be reduced in the for loop and may be changed to zero, and the other
work items may can't enter the while loop. If this happens, it breaks the
barrier's rule which requires all the work items reach the same barrier.
And it may hang the GPU depends on the implementation of opencl platform.

This issue is raised at:
https://github.com/Itseez/opencv/issues/5175

Signed-off-by: Zhigang Gong <zhigang.gong@linux.intel.com>
modules/imgproc/src/opencl/canny.cl