|
|
|
@ -148,10 +148,10 @@ namespace beliefpropagation_gpu |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
namespace cv { namespace gpu { namespace impl { |
|
|
|
|
typedef void (*CompDataFunc)(const DevMem2D& l, const DevMem2D& r, int channels, DevMem2D mdata, const cudaStream_t& stream); |
|
|
|
|
|
|
|
|
|
template<typename T> |
|
|
|
|
void comp_data_(const DevMem2D& l, const DevMem2D& r, int channels, DevMem2D mdata, const cudaStream_t& stream) |
|
|
|
|
typedef void (*CompDataFunc)(const DevMem2D& l, const DevMem2D& r, int channels, DevMem2D mdata, const cudaStream_t& stream); |
|
|
|
|
|
|
|
|
|
template<typename T> |
|
|
|
|
void comp_data_(const DevMem2D& l, const DevMem2D& r, int channels, DevMem2D mdata, const cudaStream_t& stream) |
|
|
|
|
{ |
|
|
|
|
dim3 threads(32, 8, 1); |
|
|
|
|
dim3 grid(1, 1, 1); |
|
|
|
@ -162,29 +162,29 @@ namespace cv { namespace gpu { namespace impl { |
|
|
|
|
if (channels == 1) |
|
|
|
|
beliefpropagation_gpu::comp_data_gray<T><<<grid, threads, 0, stream>>>(l.ptr, r.ptr, l.step, (T*)mdata.ptr, mdata.step/sizeof(T), l.cols, l.rows); |
|
|
|
|
else |
|
|
|
|
beliefpropagation_gpu::comp_data_bgr<T><<<grid, threads, 0, stream>>>(l.ptr, r.ptr, l.step, (T*)mdata.ptr, mdata.step/sizeof(T), l.cols, l.rows); |
|
|
|
|
|
|
|
|
|
if (stream == 0) |
|
|
|
|
cudaSafeCall( cudaThreadSynchronize() ); |
|
|
|
|
beliefpropagation_gpu::comp_data_bgr<T><<<grid, threads, 0, stream>>>(l.ptr, r.ptr, l.step, (T*)mdata.ptr, mdata.step/sizeof(T), l.cols, l.rows); |
|
|
|
|
|
|
|
|
|
if (stream == 0) |
|
|
|
|
cudaSafeCall( cudaThreadSynchronize() ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void comp_data(int msg_type, const DevMem2D& l, const DevMem2D& r, int channels, DevMem2D mdata, const cudaStream_t& stream) |
|
|
|
|
{ |
|
|
|
|
static CompDataFunc tab[8] = |
|
|
|
|
{ |
|
|
|
|
0, // uchar |
|
|
|
|
0, // schar |
|
|
|
|
0, // ushort |
|
|
|
|
comp_data_<short>, // short |
|
|
|
|
0, // int |
|
|
|
|
comp_data_<float>, // float |
|
|
|
|
0, // double |
|
|
|
|
0 // user type |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
CompDataFunc func = tab[msg_type]; |
|
|
|
|
if (func == 0) |
|
|
|
|
cv::gpu::error("Unsupported message type", __FILE__, __LINE__); |
|
|
|
|
static CompDataFunc tab[8] = |
|
|
|
|
{ |
|
|
|
|
0, // uchar |
|
|
|
|
0, // schar |
|
|
|
|
0, // ushort |
|
|
|
|
comp_data_<short>, // short |
|
|
|
|
0, // int |
|
|
|
|
comp_data_<float>, // float |
|
|
|
|
0, // double |
|
|
|
|
0 // user type |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
CompDataFunc func = tab[msg_type]; |
|
|
|
|
if (func == 0) |
|
|
|
|
cv::gpu::error("Unsupported message type", __FILE__, __LINE__); |
|
|
|
|
func(l, r, channels, mdata, stream); |
|
|
|
|
} |
|
|
|
|
}}} |
|
|
|
@ -220,10 +220,10 @@ namespace beliefpropagation_gpu |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
namespace cv { namespace gpu { namespace impl { |
|
|
|
|
typedef void (*DataStepDownFunc)(int dst_cols, int dst_rows, int src_rows, const DevMem2D& src, DevMem2D dst, const cudaStream_t& stream); |
|
|
|
|
|
|
|
|
|
template<typename T> |
|
|
|
|
void data_step_down_(int dst_cols, int dst_rows, int src_rows, const DevMem2D& src, DevMem2D dst, const cudaStream_t& stream) |
|
|
|
|
typedef void (*DataStepDownFunc)(int dst_cols, int dst_rows, int src_rows, const DevMem2D& src, DevMem2D dst, const cudaStream_t& stream); |
|
|
|
|
|
|
|
|
|
template<typename T> |
|
|
|
|
void data_step_down_(int dst_cols, int dst_rows, int src_rows, const DevMem2D& src, DevMem2D dst, const cudaStream_t& stream) |
|
|
|
|
{ |
|
|
|
|
dim3 threads(32, 8, 1); |
|
|
|
|
dim3 grid(1, 1, 1); |
|
|
|
@ -231,29 +231,29 @@ namespace cv { namespace gpu { namespace impl { |
|
|
|
|
grid.x = divUp(dst_cols, threads.x); |
|
|
|
|
grid.y = divUp(dst_rows, threads.y); |
|
|
|
|
|
|
|
|
|
beliefpropagation_gpu::data_step_down<T><<<grid, threads, 0, stream>>>(dst_cols, dst_rows, src_rows, (const T*)src.ptr, src.step/sizeof(T), (T*)dst.ptr, dst.step/sizeof(T)); |
|
|
|
|
|
|
|
|
|
if (stream == 0) |
|
|
|
|
cudaSafeCall( cudaThreadSynchronize() ); |
|
|
|
|
beliefpropagation_gpu::data_step_down<T><<<grid, threads, 0, stream>>>(dst_cols, dst_rows, src_rows, (const T*)src.ptr, src.step/sizeof(T), (T*)dst.ptr, dst.step/sizeof(T)); |
|
|
|
|
|
|
|
|
|
if (stream == 0) |
|
|
|
|
cudaSafeCall( cudaThreadSynchronize() ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void data_step_down(int dst_cols, int dst_rows, int src_rows, int msg_type, const DevMem2D& src, DevMem2D dst, const cudaStream_t& stream) |
|
|
|
|
{ |
|
|
|
|
static DataStepDownFunc tab[8] = |
|
|
|
|
{ |
|
|
|
|
0, // uchar |
|
|
|
|
0, // schar |
|
|
|
|
0, // ushort |
|
|
|
|
data_step_down_<short>, // short |
|
|
|
|
0, // int |
|
|
|
|
data_step_down_<float>, // float |
|
|
|
|
0, // double |
|
|
|
|
0 // user type |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
DataStepDownFunc func = tab[msg_type]; |
|
|
|
|
if (func == 0) |
|
|
|
|
cv::gpu::error("Unsupported message type", __FILE__, __LINE__); |
|
|
|
|
static DataStepDownFunc tab[8] = |
|
|
|
|
{ |
|
|
|
|
0, // uchar |
|
|
|
|
0, // schar |
|
|
|
|
0, // ushort |
|
|
|
|
data_step_down_<short>, // short |
|
|
|
|
0, // int |
|
|
|
|
data_step_down_<float>, // float |
|
|
|
|
0, // double |
|
|
|
|
0 // user type |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
DataStepDownFunc func = tab[msg_type]; |
|
|
|
|
if (func == 0) |
|
|
|
|
cv::gpu::error("Unsupported message type", __FILE__, __LINE__); |
|
|
|
|
func(dst_cols, dst_rows, src_rows, src, dst, stream); |
|
|
|
|
} |
|
|
|
|
}}} |
|
|
|
@ -285,10 +285,10 @@ namespace beliefpropagation_gpu |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
namespace cv { namespace gpu { namespace impl { |
|
|
|
|
typedef void (*LevelUpMessagesFunc)(int dst_idx, int dst_cols, int dst_rows, int src_rows, DevMem2D* mus, DevMem2D* mds, DevMem2D* mls, DevMem2D* mrs, const cudaStream_t& stream); |
|
|
|
|
|
|
|
|
|
template<typename T> |
|
|
|
|
void level_up_messages_(int dst_idx, int dst_cols, int dst_rows, int src_rows, DevMem2D* mus, DevMem2D* mds, DevMem2D* mls, DevMem2D* mrs, const cudaStream_t& stream) |
|
|
|
|
typedef void (*LevelUpMessagesFunc)(int dst_idx, int dst_cols, int dst_rows, int src_rows, DevMem2D* mus, DevMem2D* mds, DevMem2D* mls, DevMem2D* mrs, const cudaStream_t& stream); |
|
|
|
|
|
|
|
|
|
template<typename T> |
|
|
|
|
void level_up_messages_(int dst_idx, int dst_cols, int dst_rows, int src_rows, DevMem2D* mus, DevMem2D* mds, DevMem2D* mls, DevMem2D* mrs, const cudaStream_t& stream) |
|
|
|
|
{ |
|
|
|
|
dim3 threads(32, 8, 1); |
|
|
|
|
dim3 grid(1, 1, 1); |
|
|
|
@ -301,29 +301,29 @@ namespace cv { namespace gpu { namespace impl { |
|
|
|
|
beliefpropagation_gpu::level_up_message<T><<<grid, threads, 0, stream>>>(dst_cols, dst_rows, src_rows, (const T*)mus[src_idx].ptr, mus[src_idx].step/sizeof(T), (T*)mus[dst_idx].ptr, mus[dst_idx].step/sizeof(T)); |
|
|
|
|
beliefpropagation_gpu::level_up_message<T><<<grid, threads, 0, stream>>>(dst_cols, dst_rows, src_rows, (const T*)mds[src_idx].ptr, mds[src_idx].step/sizeof(T), (T*)mds[dst_idx].ptr, mds[dst_idx].step/sizeof(T)); |
|
|
|
|
beliefpropagation_gpu::level_up_message<T><<<grid, threads, 0, stream>>>(dst_cols, dst_rows, src_rows, (const T*)mls[src_idx].ptr, mls[src_idx].step/sizeof(T), (T*)mls[dst_idx].ptr, mls[dst_idx].step/sizeof(T)); |
|
|
|
|
beliefpropagation_gpu::level_up_message<T><<<grid, threads, 0, stream>>>(dst_cols, dst_rows, src_rows, (const T*)mrs[src_idx].ptr, mrs[src_idx].step/sizeof(T), (T*)mrs[dst_idx].ptr, mrs[dst_idx].step/sizeof(T)); |
|
|
|
|
|
|
|
|
|
if (stream == 0) |
|
|
|
|
cudaSafeCall( cudaThreadSynchronize() ); |
|
|
|
|
beliefpropagation_gpu::level_up_message<T><<<grid, threads, 0, stream>>>(dst_cols, dst_rows, src_rows, (const T*)mrs[src_idx].ptr, mrs[src_idx].step/sizeof(T), (T*)mrs[dst_idx].ptr, mrs[dst_idx].step/sizeof(T)); |
|
|
|
|
|
|
|
|
|
if (stream == 0) |
|
|
|
|
cudaSafeCall( cudaThreadSynchronize() ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void level_up_messages(int dst_idx, int dst_cols, int dst_rows, int src_rows, int msg_type, DevMem2D* mus, DevMem2D* mds, DevMem2D* mls, DevMem2D* mrs, const cudaStream_t& stream) |
|
|
|
|
{ |
|
|
|
|
static LevelUpMessagesFunc tab[8] = |
|
|
|
|
{ |
|
|
|
|
0, // uchar |
|
|
|
|
0, // schar |
|
|
|
|
0, // ushort |
|
|
|
|
level_up_messages_<short>, // short |
|
|
|
|
0, // int |
|
|
|
|
level_up_messages_<float>, // float |
|
|
|
|
0, // double |
|
|
|
|
0 // user type |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
LevelUpMessagesFunc func = tab[msg_type]; |
|
|
|
|
if (func == 0) |
|
|
|
|
cv::gpu::error("Unsupported message type", __FILE__, __LINE__); |
|
|
|
|
static LevelUpMessagesFunc tab[8] = |
|
|
|
|
{ |
|
|
|
|
0, // uchar |
|
|
|
|
0, // schar |
|
|
|
|
0, // ushort |
|
|
|
|
level_up_messages_<short>, // short |
|
|
|
|
0, // int |
|
|
|
|
level_up_messages_<float>, // float |
|
|
|
|
0, // double |
|
|
|
|
0 // user type |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
LevelUpMessagesFunc func = tab[msg_type]; |
|
|
|
|
if (func == 0) |
|
|
|
|
cv::gpu::error("Unsupported message type", __FILE__, __LINE__); |
|
|
|
|
func(dst_idx, dst_cols, dst_rows, src_rows, mus, mds, mls, mrs, stream); |
|
|
|
|
} |
|
|
|
|
}}} |
|
|
|
@ -430,10 +430,10 @@ namespace beliefpropagation_gpu |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
namespace cv { namespace gpu { namespace impl { |
|
|
|
|
typedef void (*CalcAllIterationFunc)(int cols, int rows, int iters, DevMem2D& u, DevMem2D& d, DevMem2D& l, DevMem2D& r, const DevMem2D& data, const cudaStream_t& stream); |
|
|
|
|
|
|
|
|
|
template<typename T> |
|
|
|
|
void calc_all_iterations_(int cols, int rows, int iters, DevMem2D& u, DevMem2D& d, DevMem2D& l, DevMem2D& r, const DevMem2D& data, const cudaStream_t& stream) |
|
|
|
|
typedef void (*CalcAllIterationFunc)(int cols, int rows, int iters, DevMem2D& u, DevMem2D& d, DevMem2D& l, DevMem2D& r, const DevMem2D& data, const cudaStream_t& stream); |
|
|
|
|
|
|
|
|
|
template<typename T> |
|
|
|
|
void calc_all_iterations_(int cols, int rows, int iters, DevMem2D& u, DevMem2D& d, DevMem2D& l, DevMem2D& r, const DevMem2D& data, const cudaStream_t& stream) |
|
|
|
|
{ |
|
|
|
|
dim3 threads(32, 8, 1); |
|
|
|
|
dim3 grid(1, 1, 1); |
|
|
|
@ -443,30 +443,30 @@ namespace cv { namespace gpu { namespace impl { |
|
|
|
|
|
|
|
|
|
for(int t = 0; t < iters; ++t) |
|
|
|
|
{ |
|
|
|
|
beliefpropagation_gpu::one_iteration<T><<<grid, threads, 0, stream>>>(t, (T*)u.ptr, (T*)d.ptr, (T*)l.ptr, (T*)r.ptr, u.step/sizeof(T), (const T*)data.ptr, data.step/sizeof(T), cols, rows); |
|
|
|
|
|
|
|
|
|
if (stream == 0) |
|
|
|
|
cudaSafeCall( cudaThreadSynchronize() ); |
|
|
|
|
} |
|
|
|
|
beliefpropagation_gpu::one_iteration<T><<<grid, threads, 0, stream>>>(t, (T*)u.ptr, (T*)d.ptr, (T*)l.ptr, (T*)r.ptr, u.step/sizeof(T), (const T*)data.ptr, data.step/sizeof(T), cols, rows); |
|
|
|
|
|
|
|
|
|
if (stream == 0) |
|
|
|
|
cudaSafeCall( cudaThreadSynchronize() ); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void calc_all_iterations(int cols, int rows, int iters, int msg_type, DevMem2D& u, DevMem2D& d, DevMem2D& l, DevMem2D& r, const DevMem2D& data, const cudaStream_t& stream) |
|
|
|
|
{ |
|
|
|
|
static CalcAllIterationFunc tab[8] = |
|
|
|
|
{ |
|
|
|
|
0, // uchar |
|
|
|
|
0, // schar |
|
|
|
|
0, // ushort |
|
|
|
|
calc_all_iterations_<short>, // short |
|
|
|
|
0, // int |
|
|
|
|
calc_all_iterations_<float>, // float |
|
|
|
|
0, // double |
|
|
|
|
0 // user type |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
CalcAllIterationFunc func = tab[msg_type]; |
|
|
|
|
if (func == 0) |
|
|
|
|
cv::gpu::error("Unsupported message type", __FILE__, __LINE__); |
|
|
|
|
static CalcAllIterationFunc tab[8] = |
|
|
|
|
{ |
|
|
|
|
0, // uchar |
|
|
|
|
0, // schar |
|
|
|
|
0, // ushort |
|
|
|
|
calc_all_iterations_<short>, // short |
|
|
|
|
0, // int |
|
|
|
|
calc_all_iterations_<float>, // float |
|
|
|
|
0, // double |
|
|
|
|
0 // user type |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
CalcAllIterationFunc func = tab[msg_type]; |
|
|
|
|
if (func == 0) |
|
|
|
|
cv::gpu::error("Unsupported message type", __FILE__, __LINE__); |
|
|
|
|
func(cols, rows, iters, u, d, l, r, data, stream); |
|
|
|
|
} |
|
|
|
|
}}} |
|
|
|
@ -516,10 +516,10 @@ namespace beliefpropagation_gpu |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
namespace cv { namespace gpu { namespace impl { |
|
|
|
|
typedef void (*OutputFunc)(const DevMem2D& u, const DevMem2D& d, const DevMem2D& l, const DevMem2D& r, const DevMem2D& data, DevMem2D disp, const cudaStream_t& stream); |
|
|
|
|
|
|
|
|
|
template<typename T> |
|
|
|
|
void output_(const DevMem2D& u, const DevMem2D& d, const DevMem2D& l, const DevMem2D& r, const DevMem2D& data, DevMem2D disp, const cudaStream_t& stream) |
|
|
|
|
typedef void (*OutputFunc)(const DevMem2D& u, const DevMem2D& d, const DevMem2D& l, const DevMem2D& r, const DevMem2D& data, DevMem2D disp, const cudaStream_t& stream); |
|
|
|
|
|
|
|
|
|
template<typename T> |
|
|
|
|
void output_(const DevMem2D& u, const DevMem2D& d, const DevMem2D& l, const DevMem2D& r, const DevMem2D& data, DevMem2D disp, const cudaStream_t& stream) |
|
|
|
|
{ |
|
|
|
|
dim3 threads(32, 8, 1); |
|
|
|
|
dim3 grid(1, 1, 1); |
|
|
|
@ -527,29 +527,29 @@ namespace cv { namespace gpu { namespace impl { |
|
|
|
|
grid.x = divUp(disp.cols, threads.x); |
|
|
|
|
grid.y = divUp(disp.rows, threads.y); |
|
|
|
|
|
|
|
|
|
beliefpropagation_gpu::output<T><<<grid, threads, 0, stream>>>(disp.cols, disp.rows, (const T*)u.ptr, (const T*)d.ptr, (const T*)l.ptr, (const T*)r.ptr, (const T*)data.ptr, u.step/sizeof(T), (short*)disp.ptr, disp.step/sizeof(short)); |
|
|
|
|
|
|
|
|
|
if (stream == 0) |
|
|
|
|
cudaSafeCall( cudaThreadSynchronize() ); |
|
|
|
|
beliefpropagation_gpu::output<T><<<grid, threads, 0, stream>>>(disp.cols, disp.rows, (const T*)u.ptr, (const T*)d.ptr, (const T*)l.ptr, (const T*)r.ptr, (const T*)data.ptr, u.step/sizeof(T), (short*)disp.ptr, disp.step/sizeof(short)); |
|
|
|
|
|
|
|
|
|
if (stream == 0) |
|
|
|
|
cudaSafeCall( cudaThreadSynchronize() ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void output(int msg_type, const DevMem2D& u, const DevMem2D& d, const DevMem2D& l, const DevMem2D& r, const DevMem2D& data, DevMem2D disp, const cudaStream_t& stream) |
|
|
|
|
{ |
|
|
|
|
static OutputFunc tab[8] = |
|
|
|
|
{ |
|
|
|
|
0, // uchar |
|
|
|
|
0, // schar |
|
|
|
|
0, // ushort |
|
|
|
|
output_<short>, // short |
|
|
|
|
0, // int |
|
|
|
|
output_<float>, // float |
|
|
|
|
0, // double |
|
|
|
|
0 // user type |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
OutputFunc func = tab[msg_type]; |
|
|
|
|
if (func == 0) |
|
|
|
|
cv::gpu::error("Unsupported message type", __FILE__, __LINE__); |
|
|
|
|
static OutputFunc tab[8] = |
|
|
|
|
{ |
|
|
|
|
0, // uchar |
|
|
|
|
0, // schar |
|
|
|
|
0, // ushort |
|
|
|
|
output_<short>, // short |
|
|
|
|
0, // int |
|
|
|
|
output_<float>, // float |
|
|
|
|
0, // double |
|
|
|
|
0 // user type |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
OutputFunc func = tab[msg_type]; |
|
|
|
|
if (func == 0) |
|
|
|
|
cv::gpu::error("Unsupported message type", __FILE__, __LINE__); |
|
|
|
|
func(u, d, l, r, data, disp, stream); |
|
|
|
|
} |
|
|
|
|
}}} |