|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef KERNEL_MAP_HPP |
|
|
#define KERNEL_MAP_HPP |
|
|
|
|
|
#include "types.hpp" |
|
|
|
|
|
#include <ostream> |
|
|
#include <tuple> |
|
|
#include <vector> |
|
|
|
|
|
namespace minkowski { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
using cpu_in_map = default_types::index_vector_type; |
|
|
using cpu_out_map = default_types::index_vector_type; |
|
|
|
|
|
|
|
|
using cpu_in_maps = std::vector<cpu_in_map>; |
|
|
using cpu_out_maps = std::vector<cpu_out_map>; |
|
|
struct cpu_kernel_map : std::pair<cpu_in_maps, cpu_out_maps> { |
|
|
using index_type = default_types::index_type; |
|
|
using index_pair = |
|
|
std::pair<default_types::index_type, default_types::index_type>; |
|
|
|
|
|
cpu_kernel_map() : std::pair<cpu_in_maps, cpu_out_maps>() {} |
|
|
cpu_kernel_map(std::pair<cpu_in_maps, cpu_out_maps> const &other) |
|
|
: std::pair<cpu_in_maps, cpu_out_maps>(other) {} |
|
|
|
|
|
|
|
|
cpu_kernel_map(std::vector<index_pair> &in_out, |
|
|
std::vector<default_types::dcoordinate_type> const |
|
|
&unique_batch_indicies) { |
|
|
auto comp = [](std::pair<index_type, index_type> const &l, |
|
|
std::pair<index_type, index_type> const &r) { |
|
|
return l.second < r.second; |
|
|
}; |
|
|
std::sort(in_out.begin(), in_out.end(), comp); |
|
|
|
|
|
auto const kernel_volume = unique_batch_indicies.size(); |
|
|
this->first.resize(kernel_volume); |
|
|
this->second.resize(kernel_volume); |
|
|
|
|
|
for (index_type k = 0; k < unique_batch_indicies.size(); ++k) { |
|
|
auto const lb = std::lower_bound(in_out.begin(), in_out.end(), |
|
|
index_pair{0, k}, comp); |
|
|
auto const ub = std::upper_bound(in_out.begin(), in_out.end(), |
|
|
index_pair{0, k}, comp); |
|
|
auto const curr_size = ub - lb; |
|
|
default_types::index_type start_index = lb - in_out.begin(); |
|
|
LOG_DEBUG("batch row_index:", k, "curr_size:", curr_size, |
|
|
"start_index:", start_index); |
|
|
|
|
|
auto &in_map = this->first[k]; |
|
|
auto &out_map = this->second[k]; |
|
|
in_map.resize(curr_size); |
|
|
out_map.resize(curr_size); |
|
|
|
|
|
for (uint32_t i = 0; i < curr_size; ++i) { |
|
|
auto const &curr_pair = in_out[i + start_index]; |
|
|
in_map[i] = curr_pair.first; |
|
|
out_map[i] = curr_pair.second; |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
friend std::ostream &operator<<(std::ostream &out, |
|
|
cpu_kernel_map const &kernel_map) { |
|
|
uint32_t map_size = 0; |
|
|
for (auto const &v : kernel_map.first) { |
|
|
map_size += v.size(); |
|
|
} |
|
|
out << "cpu_kernel_map: number of unique maps:" << kernel_map.first.size() |
|
|
<< ", kernel map size:" << map_size; |
|
|
return out; |
|
|
} |
|
|
}; |
|
|
|
|
|
using cpu_kernel_map_reference = std::pair<cpu_in_maps &, cpu_out_maps &>; |
|
|
|
|
|
} |
|
|
|
|
|
#endif |
|
|
|