Interface class for searching for nearest neighbors, of a set of queries, in the Random Ball Cover
data structure.
More...
#include <algorithms.hpp>
Public Types | |
enum | Memory : uint8_t { Memory::H_IN_Q, Memory::H_IN_R, Memory::H_IN_X_P, Memory::H_IN_O, Memory::H_IN_N, Memory::H_OUT_R_ID, Memory::H_OUT_Q_P, Memory::H_OUT_NN_ID, Memory::H_OUT_NN, Memory::D_IN_Q, Memory::D_IN_R, Memory::D_IN_X_P, Memory::D_IN_O, Memory::D_IN_N, Memory::D_OUT_R_ID, Memory::D_OUT_Q_P, Memory::D_OUT_NN_ID, Memory::D_OUT_NN, Memory::D_QR_D, Memory::D_QX_D } |
Enumerates the memory objects handled by the class. More... | |
Public Member Functions | |
RBCSearch (clutils::CLEnv &_env, clutils::CLEnvInfo< 1 > _info) | |
Configures an OpenCL environment as specified by _info . More... | |
cl::Memory & | get (RBCSearch::Memory mem) |
Returns a reference to an internal memory object. More... | |
void | init (unsigned int _nq, unsigned int _nr, unsigned int _nx, float _a=1.f, Staging _staging=Staging::IO) |
Configures kernel execution parameters. More... | |
void | write (RBCSearch::Memory mem=RBCSearch::Memory::D_IN_Q, void *ptr=nullptr, bool block=CL_FALSE, const std::vector< cl::Event > *events=nullptr, cl::Event *event=nullptr) |
Performs a data transfer to a device buffer. More... | |
void * | read (RBCSearch::Memory mem=RBCSearch::Memory::H_OUT_NN, bool block=CL_TRUE, const std::vector< cl::Event > *events=nullptr, cl::Event *event=nullptr) |
Performs a data transfer to a staging buffer. More... | |
void | run (const std::vector< cl::Event > *events=nullptr, cl::Event *event=nullptr, bool config=false) |
Executes the necessary kernels. More... | |
float | getAlpha () |
Gets the scaling factor \( \alpha \). More... | |
void | setAlpha (float _a) |
Sets the scaling factor \( \alpha \). More... | |
template<typename period > | |
double | run (clutils::GPUTimer< period > &timer, const std::vector< cl::Event > *events=nullptr, bool config=false) |
Executes the necessary kernels. More... | |
Public Attributes | |
cl_float * | hPtrInQ |
cl_float * | hPtrInR |
cl_float * | hPtrInXp |
cl_uint * | hPtrInO |
cl_uint * | hPtrInN |
rbc_dist_id * | hPtrOutRID |
cl_float * | hPtrOutQp |
rbc_dist_id * | hPtrOutNNID |
cl_float * | hPtrOutNN |
unsigned int | max_n |
Interface class for searching for nearest neighbors, of a set of queries, in the Random Ball Cover
data structure.
The process involves finding the representative of each query and then searching in their representative's list for their NN. The algorithm is the one described in the one shot algorithm. For more details, see [here][http://www.lcayton.com/rbc.pdf].
kernels/rbc_kernels.cl
, kernels/reduce_kernels.cl
and kernels/scan_kernels.cl
. get
to get references to the placeholders within the class and assign them to your buffers. You will have to do this strictly before the call to init
. You can also call get
(after the call to init
) to get a reference to a buffer within the class and assign it to another kernel class instance further down in your task pipeline.The following input/output OpenCL
memory objects are created by a RBCSearch
instance:
Name | Type | Placement | I/O | Use | Properties | Size |
---|---|---|---|---|---|---|
H_IN_Q | Buffer | Host | I | Staging | CL_MEM_READ_WRITE | \(n_q*d *sizeof\ (cl\_float)\) |
H_IN_R | Buffer | Host | I | Staging | CL_MEM_READ_WRITE | \(n_r*d *sizeof\ (cl\_float)\) |
H_IN_X_P | Buffer | Host | I | Staging | CL_MEM_READ_WRITE | \(n_x*d *sizeof\ (cl\_float)\) |
H_IN_O | Buffer | Host | I | Staging | CL_MEM_READ_WRITE | \(n_r *sizeof\ (cl\_uint)\) |
H_IN_N | Buffer | Host | I | Staging | CL_MEM_READ_WRITE | \(n_r *sizeof\ (cl\_uint)\) |
H_OUT_R_ID | Buffer | Host | O | Staging | CL_MEM_READ_WRITE | \(n_q*sizeof\ (rbc\_dist\_id)\) |
H_OUT_Q_P | Buffer | Host | O | Staging | CL_MEM_READ_WRITE | \(n_q*d *sizeof\ (cl\_float)\) |
H_OUT_NN_ID | Buffer | Host | O | Staging | CL_MEM_READ_WRITE | \(n_q*sizeof\ (rbc\_dist\_id)\) |
H_OUT_NN | Buffer | Host | O | Staging | CL_MEM_READ_WRITE | \(n_q*d *sizeof\ (cl\_float)\) |
D_IN_Q | Buffer | Device | I | Processing | CL_MEM_READ_ONLY | \(n_q*d *sizeof\ (cl\_float)\) |
D_IN_R | Buffer | Device | I | Processing | CL_MEM_READ_ONLY | \(n_r*d *sizeof\ (cl\_float)\) |
D_IN_X_P | Buffer | Device | I | Processing | CL_MEM_READ_ONLY | \(n_x*d *sizeof\ (cl\_float)\) |
D_IN_O | Buffer | Device | I | Processing | CL_MEM_READ_ONLY | \(n_r *sizeof\ (cl\_uint)\) |
D_IN_N | Buffer | Device | I | Processing | CL_MEM_READ_ONLY | \(n_r *sizeof\ (cl\_uint)\) |
D_OUT_R_ID | Buffer | Device | O | Processing | CL_MEM_READ_WRITE | \(n_q*sizeof\ (rbc\_dist\_id)\) |
D_OUT_Q_P | Buffer | Device | O | Processing | CL_MEM_READ_WRITE | \(n_q*d *sizeof\ (cl\_float)\) |
D_OUT_NN_ID | Buffer | Device | O | Processing | CL_MEM_READ_WRITE | \(n_q*sizeof\ (rbc\_dist\_id)\) |
D_OUT_NN | Buffer | Device | O | Processing | CL_MEM_WRITE_ONLY | \(n_q*d *sizeof\ (cl\_float)\) |
K | configures the class for using one of the available kernels for computing the Q-R distances. |
P | configures the class for using one of the available kernels for the database permutation. |
|
strong |
Enumerates the memory objects handled by the class.
H_*
names refer to staging buffers on the host. D_*
names refer to buffers on the device. cl_algo::RBC::RBCSearch< K, P, KernelTypeS::KINECT >::RBCSearch | ( | clutils::CLEnv & | _env, |
clutils::CLEnvInfo< 1 > | _info | ||
) |
Configures an OpenCL environment as specified by _info
.
[in] | _env | opencl environment. |
[in] | _info | opencl configuration. Specifies the context, queue, etc, to be used. |
cl::Memory & cl_algo::RBC::RBCSearch< K, P, KernelTypeS::KINECT >::get | ( | RBCSearch< K, P, KernelTypeS::KINECT >::Memory | mem | ) |
Returns a reference to an internal memory object.
This interface exists to allow CL memory sharing between different kernels.
[in] | mem | enumeration value specifying the requested memory object. |
float cl_algo::RBC::RBCSearch< K, P, KernelTypeS::KINECT >::getAlpha | ( | ) |
Gets the scaling factor \( \alpha \).
K
, has the value SHARED_NONE
, SHARED_R
, or SHARED_X_R
, the parameter \( \alpha \) is not applicable and the value returned is \( \infty \).void cl_algo::RBC::RBCSearch< K, P, KernelTypeS::KINECT >::init | ( | unsigned int | _nq, |
unsigned int | _nr, | ||
unsigned int | _nx, | ||
float | _a = 1.f , |
||
Staging | _staging = Staging::IO |
||
) |
Configures kernel execution parameters.
Sets up memory objects as necessary, and defines the kernel workspaces.
init
, then that memory will be maintained. Otherwise, a new memory object will be created. euclideanSquaredMetric8
in kernels/rbc_kernels.cl
.[in] | _nq | number of query points. |
[in] | _nr | number of representative points. |
[in] | _nx | number of database points. |
[in] | _a | factor scaling the results of the distance calculations for the geometric \( x_g \) and photometric \( x_p \) dimensions of the \( x\epsilon\mathbb{R}^8 \) points. That is, \( \|x-x'\|_2^2= f_g(a)\|x_g-x'_g\|_2^2+f_p(a)\|x_p-x'_p\|_2^2 \). This parameter is applicable when involving the "Kinect" kernels. That is, when the template parameter, K , gets the value KINECT , KINECT_R , or KINECT_X_R , and the template parameter, S , gets the value KINECT . For more details, take a look at euclideanSquaredMetric8 in kernels/rbc_kernels.cl . |
[in] | _staging | flag to indicate whether or not to instantiate the staging buffers. |
void * cl_algo::RBC::RBCSearch< K, P, KernelTypeS::KINECT >::read | ( | RBCSearch< K, P, KernelTypeS::KINECT >::Memory | mem = RBCSearch< K, P, KernelTypeS::KINECT >::Memory::H_OUT_NN , |
bool | block = CL_TRUE , |
||
const std::vector< cl::Event > * | events = nullptr , |
||
cl::Event * | event = nullptr |
||
) |
Performs a data transfer to a staging buffer.
The transfer happens from a device buffer to the associated (specified) staging buffer on the host.
[in] | mem | enumeration value specifying an output staging buffer. |
[in] | block | a flag to indicate whether to perform a blocking or a non-blocking operation. |
[in] | events | a wait-list of events. |
[out] | event | event associated with the read operation to the staging buffer. |
void cl_algo::RBC::RBCSearch< K, P, KernelTypeS::KINECT >::run | ( | const std::vector< cl::Event > * | events = nullptr , |
cl::Event * | event = nullptr , |
||
bool | config = false |
||
) |
Executes the necessary kernels.
The function call is non-blocking.
[in] | events | a wait-list of events. |
[out] | event | event associated with the last kernel execution. |
[in] | config | configuration flag. If true, it runs the necessary kernel, and initializes the remaining parameters and objects. |
|
inline |
Executes the necessary kernels.
This run
instance is used for profiling.
[in] | timer | GPUTimer that does the profiling of the kernel executions. |
[in] | events | a wait-list of events. |
[in] | config | configuration flag. If true, it runs the necessary kernel, and initializes the remaining parameters and objects. |
void cl_algo::RBC::RBCSearch< K, P, KernelTypeS::KINECT >::setAlpha | ( | float | _a | ) |
Sets the scaling factor \( \alpha \).
Updates the kernel arguments for the scaling factor \( \alpha \).
K
, has the value SHARED_NONE
, SHARED_R
, or SHARED_X_R
, the parameter \( \alpha \) is not applicable and the function has no effect.[in] | _a | scaling factor \( \alpha \). |
void cl_algo::RBC::RBCSearch< K, P, KernelTypeS::KINECT >::write | ( | RBCSearch< K, P, KernelTypeS::KINECT >::Memory | mem = RBCSearch< K, P, KernelTypeS::KINECT >::Memory::D_IN_Q , |
void * | ptr = nullptr , |
||
bool | block = CL_FALSE , |
||
const std::vector< cl::Event > * | events = nullptr , |
||
cl::Event * | event = nullptr |
||
) |
Performs a data transfer to a device buffer.
The transfer happens from a staging buffer on the host to the associated (specified) device buffer.
[in] | mem | enumeration value specifying an input device buffer. |
[in] | ptr | a pointer to an array holding input data. If not NULL, the data from ptr will be copied to the associated staging buffer. |
[in] | block | a flag to indicate whether to perform a blocking or a non-blocking operation. |
[in] | events | a wait-list of events. |
[out] | event | event associated with the write operation to the device buffer. |
cl_uint* cl_algo::RBC::RBCSearch< K, P, KernelTypeS::KINECT >::hPtrInN |
Mapping of the input staging buffer with the cardinalities of the representative lists.
cl_uint* cl_algo::RBC::RBCSearch< K, P, KernelTypeS::KINECT >::hPtrInO |
Mapping of the input staging buffer with the offsets of the representative lists within the db.
cl_float* cl_algo::RBC::RBCSearch< K, P, KernelTypeS::KINECT >::hPtrInQ |
Mapping of the input staging buffer for the queries.
cl_float* cl_algo::RBC::RBCSearch< K, P, KernelTypeS::KINECT >::hPtrInR |
Mapping of the input staging buffer for the representatives.
cl_float* cl_algo::RBC::RBCSearch< K, P, KernelTypeS::KINECT >::hPtrInXp |
Mapping of the input staging buffer for the permuted database.
cl_float* cl_algo::RBC::RBCSearch< K, P, KernelTypeS::KINECT >::hPtrOutNN |
Mapping of the output staging buffer for the query NNs.
rbc_dist_id* cl_algo::RBC::RBCSearch< K, P, KernelTypeS::KINECT >::hPtrOutNNID |
Mapping of the output staging buffer with the NN ids for each query.
cl_float* cl_algo::RBC::RBCSearch< K, P, KernelTypeS::KINECT >::hPtrOutQp |
Mapping of the output staging buffer for the permuted queries.
rbc_dist_id* cl_algo::RBC::RBCSearch< K, P, KernelTypeS::KINECT >::hPtrOutRID |
Mapping of the output staging buffer with the representative ids for each query.
unsigned int cl_algo::RBC::RBCSearch< K, P, KernelTypeS::KINECT >::max_n |
Maximum representative list cardinality.