Fix thread sync for csbp.
This commit is contained in:
parent
c701d54281
commit
9cfa24e515
@ -58,8 +58,8 @@
|
|||||||
////////////////////////////////////////get_first_k_initial_global//////////////////////////////
|
////////////////////////////////////////get_first_k_initial_global//////////////////////////////
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
__kernel void get_first_k_initial_global_0(__global short *data_cost_selected_, __global short *selected_disp_pyr,
|
__kernel void get_first_k_initial_global_0(__global short *data_cost_selected_, __global short *selected_disp_pyr,
|
||||||
__global short *ctemp, int h, int w, int nr_plane,
|
__global short *ctemp, int h, int w, int nr_plane,
|
||||||
int cmsg_step1, int cdisp_step1, int cndisp)
|
int cmsg_step1, int cdisp_step1, int cndisp)
|
||||||
{
|
{
|
||||||
int x = get_global_id(0);
|
int x = get_global_id(0);
|
||||||
int y = get_global_id(1);
|
int y = get_global_id(1);
|
||||||
@ -92,8 +92,8 @@ __kernel void get_first_k_initial_global_0(__global short *data_cost_selected_,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
__kernel void get_first_k_initial_global_1(__global float *data_cost_selected_, __global float *selected_disp_pyr,
|
__kernel void get_first_k_initial_global_1(__global float *data_cost_selected_, __global float *selected_disp_pyr,
|
||||||
__global float *ctemp, int h, int w, int nr_plane,
|
__global float *ctemp, int h, int w, int nr_plane,
|
||||||
int cmsg_step1, int cdisp_step1, int cndisp)
|
int cmsg_step1, int cdisp_step1, int cndisp)
|
||||||
{
|
{
|
||||||
int x = get_global_id(0);
|
int x = get_global_id(0);
|
||||||
int y = get_global_id(1);
|
int y = get_global_id(1);
|
||||||
@ -130,8 +130,8 @@ __kernel void get_first_k_initial_global_1(__global float *data_cost_selected_,
|
|||||||
///////////////////////////////////////////get_first_k_initial_local////////////////////////////////////
|
///////////////////////////////////////////get_first_k_initial_local////////////////////////////////////
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
__kernel void get_first_k_initial_local_0(__global short *data_cost_selected_, __global short *selected_disp_pyr,
|
__kernel void get_first_k_initial_local_0(__global short *data_cost_selected_, __global short *selected_disp_pyr,
|
||||||
__global short *ctemp,int h, int w, int nr_plane,
|
__global short *ctemp,int h, int w, int nr_plane,
|
||||||
int cmsg_step1, int cdisp_step1, int cndisp)
|
int cmsg_step1, int cdisp_step1, int cndisp)
|
||||||
{
|
{
|
||||||
int x = get_global_id(0);
|
int x = get_global_id(0);
|
||||||
int y = get_global_id(1);
|
int y = get_global_id(1);
|
||||||
@ -188,8 +188,8 @@ __kernel void get_first_k_initial_local_0(__global short *data_cost_selected_,
|
|||||||
}
|
}
|
||||||
|
|
||||||
__kernel void get_first_k_initial_local_1(__global float *data_cost_selected_, __global float *selected_disp_pyr,
|
__kernel void get_first_k_initial_local_1(__global float *data_cost_selected_, __global float *selected_disp_pyr,
|
||||||
__global float *ctemp,int h, int w, int nr_plane,
|
__global float *ctemp,int h, int w, int nr_plane,
|
||||||
int cmsg_step1, int cdisp_step1, int cndisp)
|
int cmsg_step1, int cdisp_step1, int cndisp)
|
||||||
{
|
{
|
||||||
int x = get_global_id(0);
|
int x = get_global_id(0);
|
||||||
int y = get_global_id(1);
|
int y = get_global_id(1);
|
||||||
@ -221,6 +221,8 @@ __kernel void get_first_k_initial_local_1(__global float *data_cost_selected_, _
|
|||||||
cur = next;
|
cur = next;
|
||||||
next = data_cost[(d + 1) * cdisp_step1];
|
next = data_cost[(d + 1) * cdisp_step1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
for (int i = nr_local_minimum; i < nr_plane; i++)
|
for (int i = nr_local_minimum; i < nr_plane; i++)
|
||||||
{
|
{
|
||||||
float minimum = FLT_MAX;
|
float minimum = FLT_MAX;
|
||||||
@ -247,7 +249,7 @@ __kernel void get_first_k_initial_local_1(__global float *data_cost_selected_, _
|
|||||||
/////////////////////// init data cost ////////////////////////
|
/////////////////////// init data cost ////////////////////////
|
||||||
///////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////
|
||||||
float compute_3(__global uchar* left, __global uchar* right,
|
float compute_3(__global uchar* left, __global uchar* right,
|
||||||
float cdata_weight, float cmax_data_term)
|
float cdata_weight, float cmax_data_term)
|
||||||
{
|
{
|
||||||
float tb = 0.114f * abs((int)left[0] - right[0]);
|
float tb = 0.114f * abs((int)left[0] - right[0]);
|
||||||
float tg = 0.587f * abs((int)left[1] - right[1]);
|
float tg = 0.587f * abs((int)left[1] - right[1]);
|
||||||
@ -256,7 +258,7 @@ float compute_3(__global uchar* left, __global uchar* right,
|
|||||||
return fmin(cdata_weight * (tr + tg + tb), cdata_weight * cmax_data_term);
|
return fmin(cdata_weight * (tr + tg + tb), cdata_weight * cmax_data_term);
|
||||||
}
|
}
|
||||||
float compute_1(__global uchar* left, __global uchar* right,
|
float compute_1(__global uchar* left, __global uchar* right,
|
||||||
float cdata_weight, float cmax_data_term)
|
float cdata_weight, float cmax_data_term)
|
||||||
{
|
{
|
||||||
return fmin(cdata_weight * abs((int)*left - (int)*right), cdata_weight * cmax_data_term);
|
return fmin(cdata_weight * abs((int)*left - (int)*right), cdata_weight * cmax_data_term);
|
||||||
}
|
}
|
||||||
@ -267,9 +269,9 @@ short round_short(float v){
|
|||||||
///////////////////////////////////init_data_cost///////////////////////////////////////////////
|
///////////////////////////////////init_data_cost///////////////////////////////////////////////
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
__kernel void init_data_cost_0(__global short *ctemp, __global uchar *cleft, __global uchar *cright,
|
__kernel void init_data_cost_0(__global short *ctemp, __global uchar *cleft, __global uchar *cright,
|
||||||
int h, int w, int level, int channels,
|
int h, int w, int level, int channels,
|
||||||
int cmsg_step1, float cdata_weight, float cmax_data_term, int cdisp_step1,
|
int cmsg_step1, float cdata_weight, float cmax_data_term, int cdisp_step1,
|
||||||
int cth, int cimg_step, int cndisp)
|
int cth, int cimg_step, int cndisp)
|
||||||
{
|
{
|
||||||
int x = get_global_id(0);
|
int x = get_global_id(0);
|
||||||
int y = get_global_id(1);
|
int y = get_global_id(1);
|
||||||
@ -311,9 +313,9 @@ __kernel void init_data_cost_0(__global short *ctemp, __global uchar *cleft, __g
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
__kernel void init_data_cost_1(__global float *ctemp, __global uchar *cleft, __global uchar *cright,
|
__kernel void init_data_cost_1(__global float *ctemp, __global uchar *cleft, __global uchar *cright,
|
||||||
int h, int w, int level, int channels,
|
int h, int w, int level, int channels,
|
||||||
int cmsg_step1, float cdata_weight, float cmax_data_term, int cdisp_step1,
|
int cmsg_step1, float cdata_weight, float cmax_data_term, int cdisp_step1,
|
||||||
int cth, int cimg_step, int cndisp)
|
int cth, int cimg_step, int cndisp)
|
||||||
{
|
{
|
||||||
int x = get_global_id(0);
|
int x = get_global_id(0);
|
||||||
int y = get_global_id(1);
|
int y = get_global_id(1);
|
||||||
@ -358,9 +360,9 @@ __kernel void init_data_cost_1(__global float *ctemp, __global uchar *cleft, __g
|
|||||||
//////////////////////////////////init_data_cost_reduce//////////////////////////////////////////////////
|
//////////////////////////////////init_data_cost_reduce//////////////////////////////////////////////////
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
__kernel void init_data_cost_reduce_0(__global short *ctemp, __global uchar *cleft, __global uchar *cright,
|
__kernel void init_data_cost_reduce_0(__global short *ctemp, __global uchar *cleft, __global uchar *cright,
|
||||||
__local float *smem, int level, int rows, int cols, int h, int winsz, int channels,
|
__local float *smem, int level, int rows, int cols, int h, int winsz, int channels,
|
||||||
int cndisp,int cimg_step, float cdata_weight, float cmax_data_term, int cth,
|
int cndisp,int cimg_step, float cdata_weight, float cmax_data_term, int cth,
|
||||||
int cdisp_step1, int cmsg_step1)
|
int cdisp_step1, int cmsg_step1)
|
||||||
{
|
{
|
||||||
int x_out = get_group_id(0);
|
int x_out = get_group_id(0);
|
||||||
int y_out = get_group_id(1) % h;
|
int y_out = get_group_id(1) % h;
|
||||||
@ -402,32 +404,99 @@ __kernel void init_data_cost_reduce_0(__global short *ctemp, __global uchar *cle
|
|||||||
__local float* dline = smem + winsz * get_local_id(2);
|
__local float* dline = smem + winsz * get_local_id(2);
|
||||||
|
|
||||||
dline[tid] = val;
|
dline[tid] = val;
|
||||||
|
}
|
||||||
|
|
||||||
barrier(CLK_LOCAL_MEM_FENCE);
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
if (winsz >= 256) { if (tid < 128) { dline[tid] += dline[tid + 128]; } barrier(CLK_LOCAL_MEM_FENCE); }
|
if(d < cndisp)
|
||||||
if (winsz >= 128) { if (tid < 64) { dline[tid] += dline[tid + 64]; } barrier(CLK_LOCAL_MEM_FENCE); }
|
{
|
||||||
|
__local float* dline = smem + winsz * get_local_id(2);
|
||||||
|
if (winsz >= 256)
|
||||||
|
{
|
||||||
|
if (tid < 128)
|
||||||
|
dline[tid] += dline[tid + 128];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
if(d < cndisp)
|
||||||
|
{
|
||||||
|
__local float* dline = smem + winsz * get_local_id(2);
|
||||||
|
if (winsz >= 128)
|
||||||
|
{
|
||||||
|
if (tid < 64)
|
||||||
|
dline[tid] += dline[tid + 64];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
if (winsz >= 64) if (tid < 32) vdline[tid] += vdline[tid + 32];
|
if(d < cndisp)
|
||||||
if (winsz >= 32) if (tid < 16) vdline[tid] += vdline[tid + 16];
|
{
|
||||||
if (winsz >= 16) if (tid < 8) vdline[tid] += vdline[tid + 8];
|
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
||||||
if (winsz >= 8) if (tid < 4) vdline[tid] += vdline[tid + 4];
|
if (winsz >= 64)
|
||||||
if (winsz >= 4) if (tid < 2) vdline[tid] += vdline[tid + 2];
|
if (tid < 32)
|
||||||
if (winsz >= 2) if (tid < 1) vdline[tid] += vdline[tid + 1];
|
vdline[tid] += vdline[tid + 32];
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
if(d < cndisp)
|
||||||
|
{
|
||||||
|
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
||||||
|
if (winsz >= 32)
|
||||||
|
if (tid < 16)
|
||||||
|
vdline[tid] += vdline[tid + 16];
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
if(d<cndisp)
|
||||||
|
{
|
||||||
|
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
||||||
|
if (winsz >= 16)
|
||||||
|
if (tid < 8)
|
||||||
|
vdline[tid] += vdline[tid + 8];
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
if(d<cndisp)
|
||||||
|
{
|
||||||
|
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
||||||
|
if (winsz >= 8)
|
||||||
|
if (tid < 4)
|
||||||
|
vdline[tid] += vdline[tid + 4];
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
if(d<cndisp)
|
||||||
|
{
|
||||||
|
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
||||||
|
if (winsz >= 4)
|
||||||
|
if (tid < 2)
|
||||||
|
vdline[tid] += vdline[tid + 2];
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
if(d<cndisp)
|
||||||
|
{
|
||||||
|
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
||||||
|
if (winsz >= 2)
|
||||||
|
if (tid < 1)
|
||||||
|
vdline[tid] += vdline[tid + 1];
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
if(d < cndisp)
|
||||||
|
{
|
||||||
|
__local float* dline = smem + winsz * get_local_id(2);
|
||||||
__global short* data_cost = ctemp + y_out * cmsg_step1 + x_out;
|
__global short* data_cost = ctemp + y_out * cmsg_step1 + x_out;
|
||||||
|
|
||||||
if (tid == 0)
|
if (tid == 0)
|
||||||
data_cost[cdisp_step1 * d] = convert_short_sat_rte(dline[0]);
|
data_cost[cdisp_step1 * d] = convert_short_sat_rte(dline[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
__kernel void init_data_cost_reduce_1(__global float *ctemp, __global uchar *cleft, __global uchar *cright,
|
__kernel void init_data_cost_reduce_1(__global float *ctemp, __global uchar *cleft, __global uchar *cright,
|
||||||
__local float *smem, int level, int rows, int cols, int h, int winsz, int channels,
|
__local float *smem, int level, int rows, int cols, int h, int winsz, int channels,
|
||||||
int cndisp,int cimg_step, float cdata_weight, float cmax_data_term, int cth,
|
int cndisp,int cimg_step, float cdata_weight, float cmax_data_term, int cth,
|
||||||
int cdisp_step1, int cmsg_step1)
|
int cdisp_step1, int cmsg_step1)
|
||||||
{
|
{
|
||||||
int x_out = get_group_id(0);
|
int x_out = get_group_id(0);
|
||||||
int y_out = get_group_id(1) % h;
|
int y_out = get_group_id(1) % h;
|
||||||
@ -470,23 +539,85 @@ __kernel void init_data_cost_reduce_1(__global float *ctemp, __global uchar *cle
|
|||||||
__local float* dline = smem + winsz * get_local_id(2);
|
__local float* dline = smem + winsz * get_local_id(2);
|
||||||
|
|
||||||
dline[tid] = val;
|
dline[tid] = val;
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
barrier(CLK_LOCAL_MEM_FENCE);
|
if(d < cndisp)
|
||||||
|
{
|
||||||
|
__local float* dline = smem + winsz * get_local_id(2);
|
||||||
|
if (winsz >= 256)
|
||||||
|
if (tid < 128)
|
||||||
|
dline[tid] += dline[tid + 128];
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
if (winsz >= 256) { if (tid < 128) { dline[tid] += dline[tid + 128]; } barrier(CLK_LOCAL_MEM_FENCE); }
|
if(d < cndisp)
|
||||||
if (winsz >= 128) { if (tid < 64) { dline[tid] += dline[tid + 64]; } barrier(CLK_LOCAL_MEM_FENCE); }
|
{
|
||||||
|
__local float* dline = smem + winsz * get_local_id(2);
|
||||||
|
if (winsz >= 128)
|
||||||
|
if (tid < 64)
|
||||||
|
dline[tid] += dline[tid + 64];
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
if(d < cndisp)
|
||||||
|
{
|
||||||
|
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
||||||
|
if (winsz >= 64)
|
||||||
|
if (tid < 32)
|
||||||
|
vdline[tid] += vdline[tid + 32];
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
if (winsz >= 64) if (tid < 32) vdline[tid] += vdline[tid + 32];
|
if(d < cndisp)
|
||||||
if (winsz >= 32) if (tid < 16) vdline[tid] += vdline[tid + 16];
|
{
|
||||||
if (winsz >= 16) if (tid < 8) vdline[tid] += vdline[tid + 8];
|
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
||||||
if (winsz >= 8) if (tid < 4) vdline[tid] += vdline[tid + 4];
|
if (winsz >= 32)
|
||||||
if (winsz >= 4) if (tid < 2) vdline[tid] += vdline[tid + 2];
|
if (tid < 16)
|
||||||
if (winsz >= 2) if (tid < 1) vdline[tid] += vdline[tid + 1];
|
vdline[tid] += vdline[tid + 16];
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
if(d < cndisp)
|
||||||
|
{
|
||||||
|
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
||||||
|
if (winsz >= 16)
|
||||||
|
if (tid < 8)
|
||||||
|
vdline[tid] += vdline[tid + 8];
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
if(d < cndisp)
|
||||||
|
{
|
||||||
|
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
||||||
|
if (winsz >= 8)
|
||||||
|
if (tid < 4)
|
||||||
|
vdline[tid] += vdline[tid + 4];
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
if(d < cndisp)
|
||||||
|
{
|
||||||
|
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
||||||
|
if (winsz >= 4)
|
||||||
|
if (tid < 2)
|
||||||
|
vdline[tid] += vdline[tid + 2];
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
if(d < cndisp)
|
||||||
|
{
|
||||||
|
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
||||||
|
if (winsz >= 2)
|
||||||
|
if (tid < 1)
|
||||||
|
vdline[tid] += vdline[tid + 1];
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
if(d < cndisp)
|
||||||
|
{
|
||||||
__global float *data_cost = ctemp + y_out * cmsg_step1 + x_out;
|
__global float *data_cost = ctemp + y_out * cmsg_step1 + x_out;
|
||||||
|
__local float* dline = smem + winsz * get_local_id(2);
|
||||||
if (tid == 0)
|
if (tid == 0)
|
||||||
data_cost[cdisp_step1 * d] = dline[0];
|
data_cost[cdisp_step1 * d] = dline[0];
|
||||||
}
|
}
|
||||||
@ -496,10 +627,10 @@ __kernel void init_data_cost_reduce_1(__global float *ctemp, __global uchar *cle
|
|||||||
////////////////////// compute data cost //////////////////////
|
////////////////////// compute data cost //////////////////////
|
||||||
///////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////
|
||||||
__kernel void compute_data_cost_0(__global const short *selected_disp_pyr, __global short *data_cost_,
|
__kernel void compute_data_cost_0(__global const short *selected_disp_pyr, __global short *data_cost_,
|
||||||
__global uchar *cleft, __global uchar *cright,
|
__global uchar *cleft, __global uchar *cright,
|
||||||
int h, int w, int level, int nr_plane, int channels,
|
int h, int w, int level, int nr_plane, int channels,
|
||||||
int cmsg_step1, int cmsg_step2, int cdisp_step1, int cdisp_step2, float cdata_weight,
|
int cmsg_step1, int cmsg_step2, int cdisp_step1, int cdisp_step2, float cdata_weight,
|
||||||
float cmax_data_term, int cimg_step, int cth)
|
float cmax_data_term, int cimg_step, int cth)
|
||||||
{
|
{
|
||||||
|
|
||||||
int x = get_global_id(0);
|
int x = get_global_id(0);
|
||||||
@ -546,10 +677,10 @@ __kernel void compute_data_cost_0(__global const short *selected_disp_pyr, __glo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
__kernel void compute_data_cost_1(__global const float *selected_disp_pyr, __global float *data_cost_,
|
__kernel void compute_data_cost_1(__global const float *selected_disp_pyr, __global float *data_cost_,
|
||||||
__global uchar *cleft, __global uchar *cright,
|
__global uchar *cleft, __global uchar *cright,
|
||||||
int h, int w, int level, int nr_plane, int channels,
|
int h, int w, int level, int nr_plane, int channels,
|
||||||
int cmsg_step1, int cmsg_step2, int cdisp_step1, int cdisp_step2, float cdata_weight,
|
int cmsg_step1, int cmsg_step2, int cdisp_step1, int cdisp_step2, float cdata_weight,
|
||||||
float cmax_data_term, int cimg_step, int cth)
|
float cmax_data_term, int cimg_step, int cth)
|
||||||
{
|
{
|
||||||
|
|
||||||
int x = get_global_id(0);
|
int x = get_global_id(0);
|
||||||
@ -598,11 +729,11 @@ __kernel void compute_data_cost_1(__global const float *selected_disp_pyr, __glo
|
|||||||
////////////////////////////////////////compute_data_cost_reduce//////////////////////////////////////////
|
////////////////////////////////////////compute_data_cost_reduce//////////////////////////////////////////
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
__kernel void compute_data_cost_reduce_0(__global const short* selected_disp_pyr, __global short* data_cost_,
|
__kernel void compute_data_cost_reduce_0(__global const short* selected_disp_pyr, __global short* data_cost_,
|
||||||
__global uchar *cleft, __global uchar *cright,__local float *smem,
|
__global uchar *cleft, __global uchar *cright,__local float *smem,
|
||||||
int level, int rows, int cols, int h, int nr_plane,
|
int level, int rows, int cols, int h, int nr_plane,
|
||||||
int channels, int winsz,
|
int channels, int winsz,
|
||||||
int cmsg_step1, int cmsg_step2, int cdisp_step1, int cdisp_step2,
|
int cmsg_step1, int cmsg_step2, int cdisp_step1, int cdisp_step2,
|
||||||
float cdata_weight, float cmax_data_term, int cimg_step,int cth)
|
float cdata_weight, float cmax_data_term, int cimg_step,int cth)
|
||||||
|
|
||||||
{
|
{
|
||||||
int x_out = get_group_id(0);
|
int x_out = get_group_id(0);
|
||||||
@ -644,40 +775,96 @@ __kernel void compute_data_cost_reduce_0(__global const short* selected_disp_pyr
|
|||||||
lri += cimg_step;
|
lri += cimg_step;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
__local float* dline = smem + winsz * get_local_id(2);
|
__local float* dline = smem + winsz * get_local_id(2);
|
||||||
|
|
||||||
dline[tid] = val;
|
dline[tid] = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
barrier(CLK_LOCAL_MEM_FENCE);
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
if(d < nr_plane)
|
// if (winsz >= 256) { if (tid < 128) { dline[tid] += dline[tid + 128]; } barrier(CLK_LOCAL_MEM_FENCE); }
|
||||||
{
|
//if (winsz >= 128) { if (tid < 64) { dline[tid] += dline[tid + 64]; } barrier(CLK_LOCAL_MEM_FENCE); }
|
||||||
|
if(d < nr_plane)
|
||||||
|
{
|
||||||
|
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
||||||
|
if (winsz >= 64)
|
||||||
|
{
|
||||||
|
if (tid < 32)
|
||||||
|
vdline[tid] += vdline[tid + 32];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
// if (winsz >= 256) { if (tid < 128) { dline[tid] += dline[tid + 128]; } barrier(CLK_LOCAL_MEM_FENCE); }
|
if(d < nr_plane)
|
||||||
//if (winsz >= 128) { if (tid < 64) { dline[tid] += dline[tid + 64]; } barrier(CLK_LOCAL_MEM_FENCE); }
|
{
|
||||||
|
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
||||||
|
if (winsz >= 32)
|
||||||
|
{
|
||||||
|
if (tid < 16)
|
||||||
|
vdline[tid] += vdline[tid + 16];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
if(d < nr_plane)
|
||||||
|
{
|
||||||
|
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
||||||
|
if (winsz >= 16)
|
||||||
|
{
|
||||||
|
if (tid < 8)
|
||||||
|
vdline[tid] += vdline[tid + 8];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
if (winsz >= 64) if (tid < 32) vdline[tid] += vdline[tid + 32];
|
if(d < nr_plane)
|
||||||
if (winsz >= 32) if (tid < 16) vdline[tid] += vdline[tid + 16];
|
{
|
||||||
if (winsz >= 16) if (tid < 8) vdline[tid] += vdline[tid + 8];
|
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
||||||
if (winsz >= 8) if (tid < 4) vdline[tid] += vdline[tid + 4];
|
if (winsz >= 8)
|
||||||
if (winsz >= 4) if (tid < 2) vdline[tid] += vdline[tid + 2];
|
{
|
||||||
if (winsz >= 2) if (tid < 1) vdline[tid] += vdline[tid + 1];
|
if (tid < 4)
|
||||||
|
vdline[tid] += vdline[tid + 4];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
if (tid == 0)
|
if(d < nr_plane)
|
||||||
data_cost[cdisp_step1 * d] = convert_short_sat_rte(vdline[0]);
|
{
|
||||||
|
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
||||||
|
if (winsz >= 4)
|
||||||
|
{
|
||||||
|
if (tid < 2)
|
||||||
|
vdline[tid] += vdline[tid + 2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
if(d < nr_plane)
|
||||||
|
{
|
||||||
|
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
||||||
|
if (winsz >= 2)
|
||||||
|
{
|
||||||
|
if (tid < 1)
|
||||||
|
vdline[tid] += vdline[tid + 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
if(d < nr_plane)
|
||||||
|
{
|
||||||
|
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
||||||
|
if (tid == 0)
|
||||||
|
data_cost[cdisp_step1 * d] = convert_short_sat_rte(vdline[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
__kernel void compute_data_cost_reduce_1(__global const float *selected_disp_pyr, __global float *data_cost_,
|
__kernel void compute_data_cost_reduce_1(__global const float *selected_disp_pyr, __global float *data_cost_,
|
||||||
__global uchar *cleft, __global uchar *cright, __local float *smem,
|
__global uchar *cleft, __global uchar *cright, __local float *smem,
|
||||||
int level, int rows, int cols, int h, int nr_plane,
|
int level, int rows, int cols, int h, int nr_plane,
|
||||||
int channels, int winsz,
|
int channels, int winsz,
|
||||||
int cmsg_step1, int cmsg_step2, int cdisp_step1,int cdisp_step2, float cdata_weight,
|
int cmsg_step1, int cmsg_step2, int cdisp_step1,int cdisp_step2, float cdata_weight,
|
||||||
float cmax_data_term, int cimg_step, int cth)
|
float cmax_data_term, int cimg_step, int cth)
|
||||||
|
|
||||||
{
|
{
|
||||||
int x_out = get_group_id(0);
|
int x_out = get_group_id(0);
|
||||||
@ -719,31 +906,87 @@ __kernel void compute_data_cost_reduce_1(__global const float *selected_disp_pyr
|
|||||||
lri += cimg_step;
|
lri += cimg_step;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
__local float* dline = smem + winsz * get_local_id(2);
|
__local float* dline = smem + winsz * get_local_id(2);
|
||||||
|
|
||||||
dline[tid] = val;
|
dline[tid] = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
barrier(CLK_LOCAL_MEM_FENCE);
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
if(d < nr_plane)
|
|
||||||
{
|
|
||||||
|
|
||||||
//if (winsz >= 256) { if (tid < 128) { dline[tid] += dline[tid + 128]; } barrier(CLK_LOCAL_MEM_FENCE); }
|
if(d < nr_plane)
|
||||||
//if (winsz >= 128) { if (tid < 64) { dline[tid] += dline[tid + 64]; } barrier(CLK_LOCAL_MEM_FENCE); }
|
{
|
||||||
|
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
||||||
|
if (winsz >= 64)
|
||||||
|
{
|
||||||
|
if (tid < 32)
|
||||||
|
vdline[tid] += vdline[tid + 32];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
|
||||||
|
|
||||||
if (winsz >= 64) if (tid < 32) vdline[tid] += vdline[tid + 32];
|
if(d < nr_plane)
|
||||||
if (winsz >= 32) if (tid < 16) vdline[tid] += vdline[tid + 16];
|
{
|
||||||
if (winsz >= 16) if (tid < 8) vdline[tid] += vdline[tid + 8];
|
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
||||||
if (winsz >= 8) if (tid < 4) vdline[tid] += vdline[tid + 4];
|
if (winsz >= 32)
|
||||||
if (winsz >= 4) if (tid < 2) vdline[tid] += vdline[tid + 2];
|
{
|
||||||
if (winsz >= 2) if (tid < 1) vdline[tid] += vdline[tid + 1];
|
if (tid < 16)
|
||||||
|
vdline[tid] += vdline[tid + 16];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
if (tid == 0)
|
if(d < nr_plane)
|
||||||
data_cost[cdisp_step1 * d] = vdline[0];
|
{
|
||||||
|
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
||||||
|
if (winsz >= 16)
|
||||||
|
{
|
||||||
|
if (tid < 8)
|
||||||
|
vdline[tid] += vdline[tid + 8];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
if(d < nr_plane)
|
||||||
|
{
|
||||||
|
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
||||||
|
if (winsz >= 8)
|
||||||
|
{
|
||||||
|
if (tid < 4)
|
||||||
|
vdline[tid] += vdline[tid + 4];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
if(d < nr_plane)
|
||||||
|
{
|
||||||
|
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
||||||
|
if (winsz >= 4)
|
||||||
|
{
|
||||||
|
if (tid < 2)
|
||||||
|
vdline[tid] += vdline[tid + 2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
if(d < nr_plane)
|
||||||
|
{
|
||||||
|
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
||||||
|
if (winsz >= 2)
|
||||||
|
{
|
||||||
|
if (tid < 1)
|
||||||
|
vdline[tid] += vdline[tid + 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
if(d < nr_plane)
|
||||||
|
{
|
||||||
|
__local volatile float* vdline = smem + winsz * get_local_id(2);
|
||||||
|
if (tid == 0)
|
||||||
|
data_cost[cdisp_step1 * d] = vdline[0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -751,13 +994,13 @@ __kernel void compute_data_cost_reduce_1(__global const float *selected_disp_pyr
|
|||||||
//////////////////////// init message /////////////////////////
|
//////////////////////// init message /////////////////////////
|
||||||
///////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////
|
||||||
void get_first_k_element_increase_0(__global short* u_new, __global short *d_new, __global short *l_new,
|
void get_first_k_element_increase_0(__global short* u_new, __global short *d_new, __global short *l_new,
|
||||||
__global short *r_new, __global const short *u_cur, __global const short *d_cur,
|
__global short *r_new, __global const short *u_cur, __global const short *d_cur,
|
||||||
__global const short *l_cur, __global const short *r_cur,
|
__global const short *l_cur, __global const short *r_cur,
|
||||||
__global short *data_cost_selected, __global short *disparity_selected_new,
|
__global short *data_cost_selected, __global short *disparity_selected_new,
|
||||||
__global short *data_cost_new, __global const short* data_cost_cur,
|
__global short *data_cost_new, __global const short* data_cost_cur,
|
||||||
__global const short *disparity_selected_cur,
|
__global const short *disparity_selected_cur,
|
||||||
int nr_plane, int nr_plane2,
|
int nr_plane, int nr_plane2,
|
||||||
int cdisp_step1, int cdisp_step2)
|
int cdisp_step1, int cdisp_step2)
|
||||||
{
|
{
|
||||||
for(int i = 0; i < nr_plane; i++)
|
for(int i = 0; i < nr_plane; i++)
|
||||||
{
|
{
|
||||||
@ -785,13 +1028,13 @@ void get_first_k_element_increase_0(__global short* u_new, __global short *d_new
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
void get_first_k_element_increase_1(__global float *u_new, __global float *d_new, __global float *l_new,
|
void get_first_k_element_increase_1(__global float *u_new, __global float *d_new, __global float *l_new,
|
||||||
__global float *r_new, __global const float *u_cur, __global const float *d_cur,
|
__global float *r_new, __global const float *u_cur, __global const float *d_cur,
|
||||||
__global const float *l_cur, __global const float *r_cur,
|
__global const float *l_cur, __global const float *r_cur,
|
||||||
__global float *data_cost_selected, __global float *disparity_selected_new,
|
__global float *data_cost_selected, __global float *disparity_selected_new,
|
||||||
__global float *data_cost_new, __global const float *data_cost_cur,
|
__global float *data_cost_new, __global const float *data_cost_cur,
|
||||||
__global const float *disparity_selected_cur,
|
__global const float *disparity_selected_cur,
|
||||||
int nr_plane, int nr_plane2,
|
int nr_plane, int nr_plane2,
|
||||||
int cdisp_step1, int cdisp_step2)
|
int cdisp_step1, int cdisp_step2)
|
||||||
{
|
{
|
||||||
for(int i = 0; i < nr_plane; i++)
|
for(int i = 0; i < nr_plane; i++)
|
||||||
{
|
{
|
||||||
@ -820,12 +1063,12 @@ void get_first_k_element_increase_1(__global float *u_new, __global float *d_new
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
__kernel void init_message_0(__global short *u_new_, __global short *d_new_, __global short *l_new_,
|
__kernel void init_message_0(__global short *u_new_, __global short *d_new_, __global short *l_new_,
|
||||||
__global short *r_new_, __global short *u_cur_, __global const short *d_cur_,
|
__global short *r_new_, __global short *u_cur_, __global const short *d_cur_,
|
||||||
__global const short *l_cur_, __global const short *r_cur_, __global short *ctemp,
|
__global const short *l_cur_, __global const short *r_cur_, __global short *ctemp,
|
||||||
__global short *selected_disp_pyr_new, __global const short *selected_disp_pyr_cur,
|
__global short *selected_disp_pyr_new, __global const short *selected_disp_pyr_cur,
|
||||||
__global short *data_cost_selected_, __global const short *data_cost_,
|
__global short *data_cost_selected_, __global const short *data_cost_,
|
||||||
int h, int w, int nr_plane, int h2, int w2, int nr_plane2,
|
int h, int w, int nr_plane, int h2, int w2, int nr_plane2,
|
||||||
int cdisp_step1, int cdisp_step2, int cmsg_step1, int cmsg_step2)
|
int cdisp_step1, int cdisp_step2, int cmsg_step1, int cmsg_step2)
|
||||||
{
|
{
|
||||||
int x = get_global_id(0);
|
int x = get_global_id(0);
|
||||||
int y = get_global_id(1);
|
int y = get_global_id(1);
|
||||||
@ -864,34 +1107,35 @@ __kernel void init_message_0(__global short *u_new_, __global short *d_new_, __g
|
|||||||
r_cur = r_cur_ + y/2 * cmsg_step2 + x/2;
|
r_cur = r_cur_ + y/2 * cmsg_step2 + x/2;
|
||||||
|
|
||||||
get_first_k_element_increase_0(u_new, d_new, l_new, r_new, u_cur, d_cur, l_cur, r_cur,
|
get_first_k_element_increase_0(u_new, d_new, l_new, r_new, u_cur, d_cur, l_cur, r_cur,
|
||||||
data_cost_selected, disparity_selected_new, data_cost_new,
|
data_cost_selected, disparity_selected_new, data_cost_new,
|
||||||
data_cost, disparity_selected_cur, nr_plane, nr_plane2,
|
data_cost, disparity_selected_cur, nr_plane, nr_plane2,
|
||||||
cdisp_step1, cdisp_step2);
|
cdisp_step1, cdisp_step2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
__kernel void init_message_1(__global float *u_new_, __global float *d_new_, __global float *l_new_,
|
__kernel void init_message_1(__global float *u_new_, __global float *d_new_, __global float *l_new_,
|
||||||
__global float *r_new_, __global float *u_cur_, __global const float *d_cur_,
|
__global float *r_new_, __global const float *u_cur_, __global const float *d_cur_,
|
||||||
__global const float *l_cur_, __global const float *r_cur_, __global float *ctemp,
|
__global const float *l_cur_, __global const float *r_cur_, __global float *ctemp,
|
||||||
__global float *selected_disp_pyr_new, __global const float *selected_disp_pyr_cur,
|
__global float *selected_disp_pyr_new, __global const float *selected_disp_pyr_cur,
|
||||||
__global float *data_cost_selected_, __global const float *data_cost_,
|
__global float *data_cost_selected_, __global const float *data_cost_,
|
||||||
int h, int w, int nr_plane, int h2, int w2, int nr_plane2,
|
int h, int w, int nr_plane, int h2, int w2, int nr_plane2,
|
||||||
int cdisp_step1, int cdisp_step2, int cmsg_step1, int cmsg_step2)
|
int cdisp_step1, int cdisp_step2, int cmsg_step1, int cmsg_step2)
|
||||||
{
|
{
|
||||||
int x = get_global_id(0);
|
int x = get_global_id(0);
|
||||||
int y = get_global_id(1);
|
int y = get_global_id(1);
|
||||||
|
|
||||||
|
|
||||||
|
__global const float *u_cur = u_cur_ + min(h2-1, y/2 + 1) * cmsg_step2 + x/2;
|
||||||
|
__global const float *d_cur = d_cur_ + max(0, y/2 - 1) * cmsg_step2 + x/2;
|
||||||
|
__global const float *l_cur = l_cur_ + y/2 * cmsg_step2 + min(w2-1, x/2 + 1);
|
||||||
|
__global const float *r_cur = r_cur_ + y/2 * cmsg_step2 + max(0, x/2 - 1);
|
||||||
|
|
||||||
|
__global float *data_cost_new = ctemp + y * cmsg_step1 + x;
|
||||||
|
|
||||||
|
__global const float *disparity_selected_cur = selected_disp_pyr_cur + y/2 * cmsg_step2 + x/2;
|
||||||
|
__global const float *data_cost = data_cost_ + y * cmsg_step1 + x;
|
||||||
|
|
||||||
if (y < h && x < w)
|
if (y < h && x < w)
|
||||||
{
|
{
|
||||||
__global const float *u_cur = u_cur_ + min(h2-1, y/2 + 1) * cmsg_step2 + x/2;
|
|
||||||
__global const float *d_cur = d_cur_ + max(0, y/2 - 1) * cmsg_step2 + x/2;
|
|
||||||
__global const float *l_cur = l_cur_ + y/2 * cmsg_step2 + min(w2-1, x/2 + 1);
|
|
||||||
__global const float *r_cur = r_cur_ + y/2 * cmsg_step2 + max(0, x/2 - 1);
|
|
||||||
|
|
||||||
__global float *data_cost_new = ctemp + y * cmsg_step1 + x;
|
|
||||||
|
|
||||||
__global const float *disparity_selected_cur = selected_disp_pyr_cur + y/2 * cmsg_step2 + x/2;
|
|
||||||
__global const float *data_cost = data_cost_ + y * cmsg_step1 + x;
|
|
||||||
|
|
||||||
for(int d = 0; d < nr_plane2; d++)
|
for(int d = 0; d < nr_plane2; d++)
|
||||||
{
|
{
|
||||||
int idx2 = d * cdisp_step2;
|
int idx2 = d * cdisp_step2;
|
||||||
@ -899,34 +1143,58 @@ __kernel void init_message_1(__global float *u_new_, __global float *d_new_, __g
|
|||||||
float val = data_cost[d * cdisp_step1] + u_cur[idx2] + d_cur[idx2] + l_cur[idx2] + r_cur[idx2];
|
float val = data_cost[d * cdisp_step1] + u_cur[idx2] + d_cur[idx2] + l_cur[idx2] + r_cur[idx2];
|
||||||
data_cost_new[d * cdisp_step1] = val;
|
data_cost_new[d * cdisp_step1] = val;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
__global float *data_cost_selected = data_cost_selected_ + y * cmsg_step1 + x;
|
__global float *data_cost_selected = data_cost_selected_ + y * cmsg_step1 + x;
|
||||||
__global float *disparity_selected_new = selected_disp_pyr_new + y * cmsg_step1 + x;
|
__global float *disparity_selected_new = selected_disp_pyr_new + y * cmsg_step1 + x;
|
||||||
|
|
||||||
__global float *u_new = u_new_ + y * cmsg_step1 + x;
|
__global float *u_new = u_new_ + y * cmsg_step1 + x;
|
||||||
__global float *d_new = d_new_ + y * cmsg_step1 + x;
|
__global float *d_new = d_new_ + y * cmsg_step1 + x;
|
||||||
__global float *l_new = l_new_ + y * cmsg_step1 + x;
|
__global float *l_new = l_new_ + y * cmsg_step1 + x;
|
||||||
__global float *r_new = r_new_ + y * cmsg_step1 + x;
|
__global float *r_new = r_new_ + y * cmsg_step1 + x;
|
||||||
|
|
||||||
|
barrier(CLK_LOCAL_MEM_FENCE);
|
||||||
|
|
||||||
|
if(y < h && x < w)
|
||||||
|
{
|
||||||
u_cur = u_cur_ + y/2 * cmsg_step2 + x/2;
|
u_cur = u_cur_ + y/2 * cmsg_step2 + x/2;
|
||||||
d_cur = d_cur_ + y/2 * cmsg_step2 + x/2;
|
d_cur = d_cur_ + y/2 * cmsg_step2 + x/2;
|
||||||
l_cur = l_cur_ + y/2 * cmsg_step2 + x/2;
|
l_cur = l_cur_ + y/2 * cmsg_step2 + x/2;
|
||||||
r_cur = r_cur_ + y/2 * cmsg_step2 + x/2;
|
r_cur = r_cur_ + y/2 * cmsg_step2 + x/2;
|
||||||
|
|
||||||
get_first_k_element_increase_1(u_new, d_new, l_new, r_new, u_cur, d_cur, l_cur, r_cur,
|
for(int i = 0; i < nr_plane; i++)
|
||||||
data_cost_selected, disparity_selected_new, data_cost_new,
|
{
|
||||||
data_cost, disparity_selected_cur, nr_plane, nr_plane2,
|
float minimum = FLT_MAX;
|
||||||
cdisp_step1, cdisp_step2);
|
int id = 0;
|
||||||
|
|
||||||
|
for(int j = 0; j < nr_plane2; j++)
|
||||||
|
{
|
||||||
|
float cur = data_cost_new[j * cdisp_step1];
|
||||||
|
if(cur < minimum)
|
||||||
|
{
|
||||||
|
minimum = cur;
|
||||||
|
id = j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
data_cost_selected[i * cdisp_step1] = data_cost[id * cdisp_step1];
|
||||||
|
disparity_selected_new[i * cdisp_step1] = disparity_selected_cur[id * cdisp_step2];
|
||||||
|
u_new[i * cdisp_step1] = u_cur[id * cdisp_step2];
|
||||||
|
d_new[i * cdisp_step1] = d_cur[id * cdisp_step2];
|
||||||
|
l_new[i * cdisp_step1] = l_cur[id * cdisp_step2];
|
||||||
|
r_new[i * cdisp_step1] = r_cur[id * cdisp_step2];
|
||||||
|
data_cost_new[id * cdisp_step1] = FLT_MAX;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////
|
||||||
//////////////////// calc all iterations /////////////////////
|
//////////////////// calc all iterations /////////////////////
|
||||||
///////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////
|
||||||
void message_per_pixel_0(__global const short *data, __global short *msg_dst, __global const short *msg1,
|
void message_per_pixel_0(__global const short *data, __global short *msg_dst, __global const short *msg1,
|
||||||
__global const short *msg2, __global const short *msg3,
|
__global const short *msg2, __global const short *msg3,
|
||||||
__global const short *dst_disp, __global const short *src_disp,
|
__global const short *dst_disp, __global const short *src_disp,
|
||||||
int nr_plane, __global short *temp,
|
int nr_plane, __global short *temp,
|
||||||
float cmax_disc_term, int cdisp_step1, float cdisc_single_jump)
|
float cmax_disc_term, int cdisp_step1, float cdisc_single_jump)
|
||||||
{
|
{
|
||||||
short minimum = SHRT_MAX;
|
short minimum = SHRT_MAX;
|
||||||
for(int d = 0; d < nr_plane; d++)
|
for(int d = 0; d < nr_plane; d++)
|
||||||
@ -948,7 +1216,7 @@ void message_per_pixel_0(__global const short *data, __global short *msg_dst, __
|
|||||||
|
|
||||||
for(int d2 = 0; d2 < nr_plane; d2++)
|
for(int d2 = 0; d2 < nr_plane; d2++)
|
||||||
cost_min = fmin(cost_min, (msg_dst[d2 * cdisp_step1] +
|
cost_min = fmin(cost_min, (msg_dst[d2 * cdisp_step1] +
|
||||||
cdisc_single_jump * abs(dst_disp[d2 * cdisp_step1] - src_disp_reg)));
|
cdisc_single_jump * abs(dst_disp[d2 * cdisp_step1] - src_disp_reg)));
|
||||||
|
|
||||||
temp[d * cdisp_step1] = convert_short_sat_rte(cost_min);
|
temp[d * cdisp_step1] = convert_short_sat_rte(cost_min);
|
||||||
sum += cost_min;
|
sum += cost_min;
|
||||||
@ -959,10 +1227,10 @@ void message_per_pixel_0(__global const short *data, __global short *msg_dst, __
|
|||||||
msg_dst[d * cdisp_step1] = convert_short_sat_rte(temp[d * cdisp_step1] - sum);
|
msg_dst[d * cdisp_step1] = convert_short_sat_rte(temp[d * cdisp_step1] - sum);
|
||||||
}
|
}
|
||||||
void message_per_pixel_1(__global const float *data, __global float *msg_dst, __global const float *msg1,
|
void message_per_pixel_1(__global const float *data, __global float *msg_dst, __global const float *msg1,
|
||||||
__global const float *msg2, __global const float *msg3,
|
__global const float *msg2, __global const float *msg3,
|
||||||
__global const float *dst_disp, __global const float *src_disp,
|
__global const float *dst_disp, __global const float *src_disp,
|
||||||
int nr_plane, __global float *temp,
|
int nr_plane, __global float *temp,
|
||||||
float cmax_disc_term, int cdisp_step1, float cdisc_single_jump)
|
float cmax_disc_term, int cdisp_step1, float cdisc_single_jump)
|
||||||
{
|
{
|
||||||
float minimum = FLT_MAX;
|
float minimum = FLT_MAX;
|
||||||
for(int d = 0; d < nr_plane; d++)
|
for(int d = 0; d < nr_plane; d++)
|
||||||
@ -984,7 +1252,7 @@ void message_per_pixel_1(__global const float *data, __global float *msg_dst, __
|
|||||||
|
|
||||||
for(int d2 = 0; d2 < nr_plane; d2++)
|
for(int d2 = 0; d2 < nr_plane; d2++)
|
||||||
cost_min = fmin(cost_min, (msg_dst[d2 * cdisp_step1] +
|
cost_min = fmin(cost_min, (msg_dst[d2 * cdisp_step1] +
|
||||||
cdisc_single_jump * fabs(dst_disp[d2 * cdisp_step1] - src_disp_reg)));
|
cdisc_single_jump * fabs(dst_disp[d2 * cdisp_step1] - src_disp_reg)));
|
||||||
|
|
||||||
temp[d * cdisp_step1] = cost_min;
|
temp[d * cdisp_step1] = cost_min;
|
||||||
sum += cost_min;
|
sum += cost_min;
|
||||||
@ -995,9 +1263,9 @@ void message_per_pixel_1(__global const float *data, __global float *msg_dst, __
|
|||||||
msg_dst[d * cdisp_step1] = temp[d * cdisp_step1] - sum;
|
msg_dst[d * cdisp_step1] = temp[d * cdisp_step1] - sum;
|
||||||
}
|
}
|
||||||
__kernel void compute_message_0(__global short *u_, __global short *d_, __global short *l_, __global short *r_,
|
__kernel void compute_message_0(__global short *u_, __global short *d_, __global short *l_, __global short *r_,
|
||||||
__global const short *data_cost_selected, __global const short *selected_disp_pyr_cur,
|
__global const short *data_cost_selected, __global const short *selected_disp_pyr_cur,
|
||||||
__global short *ctemp, int h, int w, int nr_plane, int i,
|
__global short *ctemp, int h, int w, int nr_plane, int i,
|
||||||
float cmax_disc_term, int cdisp_step1, int cmsg_step1, float cdisc_single_jump)
|
float cmax_disc_term, int cdisp_step1, int cmsg_step1, float cdisc_single_jump)
|
||||||
{
|
{
|
||||||
int y = get_global_id(1);
|
int y = get_global_id(1);
|
||||||
int x = ((get_global_id(0)) << 1) + ((y + i) & 1);
|
int x = ((get_global_id(0)) << 1) + ((y + i) & 1);
|
||||||
@ -1016,19 +1284,19 @@ __kernel void compute_message_0(__global short *u_, __global short *d_, __global
|
|||||||
__global short *temp = ctemp + y * cmsg_step1 + x;
|
__global short *temp = ctemp + y * cmsg_step1 + x;
|
||||||
|
|
||||||
message_per_pixel_0(data, u, r - 1, u + cmsg_step1, l + 1, disp, disp - cmsg_step1, nr_plane, temp,
|
message_per_pixel_0(data, u, r - 1, u + cmsg_step1, l + 1, disp, disp - cmsg_step1, nr_plane, temp,
|
||||||
cmax_disc_term, cdisp_step1, cdisc_single_jump);
|
cmax_disc_term, cdisp_step1, cdisc_single_jump);
|
||||||
message_per_pixel_0(data, d, d - cmsg_step1, r - 1, l + 1, disp, disp + cmsg_step1, nr_plane, temp,
|
message_per_pixel_0(data, d, d - cmsg_step1, r - 1, l + 1, disp, disp + cmsg_step1, nr_plane, temp,
|
||||||
cmax_disc_term, cdisp_step1, cdisc_single_jump);
|
cmax_disc_term, cdisp_step1, cdisc_single_jump);
|
||||||
message_per_pixel_0(data, l, u + cmsg_step1, d - cmsg_step1, l + 1, disp, disp - 1, nr_plane, temp,
|
message_per_pixel_0(data, l, u + cmsg_step1, d - cmsg_step1, l + 1, disp, disp - 1, nr_plane, temp,
|
||||||
cmax_disc_term, cdisp_step1, cdisc_single_jump);
|
cmax_disc_term, cdisp_step1, cdisc_single_jump);
|
||||||
message_per_pixel_0(data, r, u + cmsg_step1, d - cmsg_step1, r - 1, disp, disp + 1, nr_plane, temp,
|
message_per_pixel_0(data, r, u + cmsg_step1, d - cmsg_step1, r - 1, disp, disp + 1, nr_plane, temp,
|
||||||
cmax_disc_term, cdisp_step1, cdisc_single_jump);
|
cmax_disc_term, cdisp_step1, cdisc_single_jump);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
__kernel void compute_message_1(__global float *u_, __global float *d_, __global float *l_, __global float *r_,
|
__kernel void compute_message_1(__global float *u_, __global float *d_, __global float *l_, __global float *r_,
|
||||||
__global const float *data_cost_selected, __global const float *selected_disp_pyr_cur,
|
__global const float *data_cost_selected, __global const float *selected_disp_pyr_cur,
|
||||||
__global float *ctemp, int h, int w, int nr_plane, int i,
|
__global float *ctemp, int h, int w, int nr_plane, int i,
|
||||||
float cmax_disc_term, int cdisp_step1, int cmsg_step1, float cdisc_single_jump)
|
float cmax_disc_term, int cdisp_step1, int cmsg_step1, float cdisc_single_jump)
|
||||||
{
|
{
|
||||||
int y = get_global_id(1);
|
int y = get_global_id(1);
|
||||||
int x = ((get_global_id(0)) << 1) + ((y + i) & 1);
|
int x = ((get_global_id(0)) << 1) + ((y + i) & 1);
|
||||||
@ -1046,13 +1314,13 @@ __kernel void compute_message_1(__global float *u_, __global float *d_, __global
|
|||||||
__global float *temp = ctemp + y * cmsg_step1 + x;
|
__global float *temp = ctemp + y * cmsg_step1 + x;
|
||||||
|
|
||||||
message_per_pixel_1(data, u, r - 1, u + cmsg_step1, l + 1, disp, disp - cmsg_step1, nr_plane, temp,
|
message_per_pixel_1(data, u, r - 1, u + cmsg_step1, l + 1, disp, disp - cmsg_step1, nr_plane, temp,
|
||||||
cmax_disc_term, cdisp_step1, cdisc_single_jump);
|
cmax_disc_term, cdisp_step1, cdisc_single_jump);
|
||||||
message_per_pixel_1(data, d, d - cmsg_step1, r - 1, l + 1, disp, disp + cmsg_step1, nr_plane, temp,
|
message_per_pixel_1(data, d, d - cmsg_step1, r - 1, l + 1, disp, disp + cmsg_step1, nr_plane, temp,
|
||||||
cmax_disc_term, cdisp_step1, cdisc_single_jump);
|
cmax_disc_term, cdisp_step1, cdisc_single_jump);
|
||||||
message_per_pixel_1(data, l, u + cmsg_step1, d - cmsg_step1, l + 1, disp, disp - 1, nr_plane, temp,
|
message_per_pixel_1(data, l, u + cmsg_step1, d - cmsg_step1, l + 1, disp, disp - 1, nr_plane, temp,
|
||||||
cmax_disc_term, cdisp_step1, cdisc_single_jump);
|
cmax_disc_term, cdisp_step1, cdisc_single_jump);
|
||||||
message_per_pixel_1(data, r, u + cmsg_step1, d - cmsg_step1, r - 1, disp, disp + 1, nr_plane, temp,
|
message_per_pixel_1(data, r, u + cmsg_step1, d - cmsg_step1, r - 1, disp, disp + 1, nr_plane, temp,
|
||||||
cmax_disc_term, cdisp_step1, cdisc_single_jump);
|
cmax_disc_term, cdisp_step1, cdisc_single_jump);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1060,11 +1328,11 @@ __kernel void compute_message_1(__global float *u_, __global float *d_, __global
|
|||||||
/////////////////////////// output ////////////////////////////
|
/////////////////////////// output ////////////////////////////
|
||||||
///////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////
|
||||||
__kernel void compute_disp_0(__global const short *u_, __global const short *d_, __global const short *l_,
|
__kernel void compute_disp_0(__global const short *u_, __global const short *d_, __global const short *l_,
|
||||||
__global const short *r_, __global const short * data_cost_selected,
|
__global const short *r_, __global const short * data_cost_selected,
|
||||||
__global const short *disp_selected_pyr,
|
__global const short *disp_selected_pyr,
|
||||||
__global short* disp,
|
__global short* disp,
|
||||||
int res_step, int cols, int rows, int nr_plane,
|
int res_step, int cols, int rows, int nr_plane,
|
||||||
int cmsg_step1, int cdisp_step1)
|
int cmsg_step1, int cdisp_step1)
|
||||||
{
|
{
|
||||||
int x = get_global_id(0);
|
int x = get_global_id(0);
|
||||||
int y = get_global_id(1);
|
int y = get_global_id(1);
|
||||||
@ -1097,11 +1365,11 @@ __kernel void compute_disp_0(__global const short *u_, __global const short *d_,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
__kernel void compute_disp_1(__global const float *u_, __global const float *d_, __global const float *l_,
|
__kernel void compute_disp_1(__global const float *u_, __global const float *d_, __global const float *l_,
|
||||||
__global const float *r_, __global const float *data_cost_selected,
|
__global const float *r_, __global const float *data_cost_selected,
|
||||||
__global const float *disp_selected_pyr,
|
__global const float *disp_selected_pyr,
|
||||||
__global short *disp,
|
__global short *disp,
|
||||||
int res_step, int cols, int rows, int nr_plane,
|
int res_step, int cols, int rows, int nr_plane,
|
||||||
int cmsg_step1, int cdisp_step1)
|
int cmsg_step1, int cdisp_step1)
|
||||||
{
|
{
|
||||||
int x = get_global_id(0);
|
int x = get_global_id(0);
|
||||||
int y = get_global_id(1);
|
int y = get_global_id(1);
|
||||||
@ -1132,4 +1400,3 @@ __kernel void compute_disp_1(__global const float *u_, __global const float *d_,
|
|||||||
disp[res_step * y + x] = best;
|
disp[res_step * y + x] = best;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user