OmniSciDB  72c90bc290
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
QueryMemoryInitializer.cpp File Reference
+ Include dependency graph for QueryMemoryInitializer.cpp:

Go to the source code of this file.

Namespaces

 anonymous_namespace{QueryMemoryInitializer.cpp}
 

Macros

#define MAX_BUFFER_SIZE   0x100000000000ll
 

Functions

void anonymous_namespace{QueryMemoryInitializer.cpp}::check_total_bitmap_memory (const QueryMemoryDescriptor &query_mem_desc)
 
std::pair< int64_t *, bool > anonymous_namespace{QueryMemoryInitializer.cpp}::alloc_group_by_buffer (const size_t numBytes, RenderAllocatorMap *render_allocator_map, const size_t thread_idx, RowSetMemoryOwner *mem_owner, const bool reuse_existing_buffer_for_thread)
 
int64_t anonymous_namespace{QueryMemoryInitializer.cpp}::get_consistent_frag_size (const std::vector< uint64_t > &frag_offsets)
 
std::vector< int64_t > anonymous_namespace{QueryMemoryInitializer.cpp}::get_consistent_frags_sizes (const std::vector< std::vector< uint64_t >> &frag_offsets)
 
std::vector< int64_t > anonymous_namespace{QueryMemoryInitializer.cpp}::get_consistent_frags_sizes (const std::vector< Analyzer::Expr * > &target_exprs, const std::vector< int64_t > &table_frag_sizes)
 
std::vector< std::vector
< int64_t > > 
anonymous_namespace{QueryMemoryInitializer.cpp}::get_col_frag_offsets (const std::vector< Analyzer::Expr * > &target_exprs, const std::vector< std::vector< uint64_t >> &table_frag_offsets)
 
int anonymous_namespace{QueryMemoryInitializer.cpp}::get_input_idx (RelAlgExecutionUnit const &ra_exe_unit, const shared::TableKey &outer_table_key)
 
void anonymous_namespace{QueryMemoryInitializer.cpp}::check_count_distinct_expr_metadata (const QueryMemoryDescriptor &query_mem_desc, const RelAlgExecutionUnit &ra_exe_unit)
 
QueryMemoryInitializer::TargetAggOpsMetadata anonymous_namespace{QueryMemoryInitializer.cpp}::collect_target_expr_metadata (const QueryMemoryDescriptor &query_mem_desc, const RelAlgExecutionUnit &ra_exe_unit)
 
 num_buffers_ (1)
 
 varlen_output_buffer_ (0)
 
 varlen_output_buffer_host_ptr_ (nullptr)
 
 count_distinct_bitmap_device_mem_ptr_ (0)
 
 count_distinct_bitmap_mem_size_ (0)
 
 count_distinct_bitmap_host_crt_ptr_ (nullptr)
 
 count_distinct_bitmap_host_mem_ptr_ (nullptr)
 
 device_allocator_ (device_allocator)
 
 thread_idx_ (0)
 
template<typename T >
int8_t * anonymous_namespace{QueryMemoryInitializer.cpp}::initColumnarBuffer (T *buffer_ptr, const T init_val, const uint32_t entry_count)
 
void anonymous_namespace{QueryMemoryInitializer.cpp}::eachAggregateTargetIdxOfType (std::vector< Analyzer::Expr * > const &target_exprs, SQLAgg const agg_type, std::function< void(Analyzer::AggExpr const *, size_t)> lambda)
 
void anonymous_namespace{QueryMemoryInitializer.cpp}::compact_projection_buffer_for_cpu_columnar (const QueryMemoryDescriptor &query_mem_desc, int8_t *projection_buffer, const size_t projection_count)
 

Variables

int64_t g_bitmap_memory_limit {8LL * 1000 * 1000 * 1000}
 
 query_mem_desc
 

Macro Definition Documentation

#define MAX_BUFFER_SIZE   0x100000000000ll

Function Documentation

count_distinct_bitmap_device_mem_ptr_ ( )
count_distinct_bitmap_host_crt_ptr_ ( nullptr  )
count_distinct_bitmap_host_mem_ptr_ ( nullptr  )
count_distinct_bitmap_mem_size_ ( )
device_allocator_ ( device_allocator  )
num_buffers_ ( )

Referenced by thread_idx_().

+ Here is the caller graph for this function:

thread_idx_ ( )

Definition at line 461 of file QueryMemoryInitializer.cpp.

References align_to_int64(), anonymous_namespace{QueryMemoryInitializer.cpp}::alloc_group_by_buffer(), CHECK, CHECK_EQ, anonymous_namespace{QueryMemoryInitializer.cpp}::get_col_frag_offsets(), anonymous_namespace{QueryMemoryInitializer.cpp}::get_consistent_frags_sizes(), MAX_BUFFER_SIZE, num_buffers_(), query_mem_desc, and target_exprs_to_infos().

Referenced by ResultSet::getThreadIdx().

461  {
462  // Table functions output columnar, basically treat this as a projection
463  const auto& consistent_frag_sizes = get_consistent_frags_sizes(frag_offsets);
464  if (consistent_frag_sizes.empty()) {
465  // No fragments in the input, no underlying buffers will be needed.
466  return;
467  }
468 
469  const size_t num_columns =
470  query_mem_desc.getBufferColSlotCount(); // shouldn't we use getColCount() ???
471  size_t total_group_by_buffer_size{0};
472  for (size_t i = 0; i < num_columns; ++i) {
473  auto ti = exe_unit.target_exprs[i]->get_type_info();
474  if (ti.usesFlatBuffer()) {
475  // See TableFunctionManager.h for info regarding flatbuffer
476  // memory managment.
477  auto slot_idx = query_mem_desc.getSlotIndexForSingleSlotCol(i);
478  CHECK(query_mem_desc.checkSlotUsesFlatBufferFormat(slot_idx));
479  checked_int64_t flatbuffer_size = query_mem_desc.getFlatBufferSize(slot_idx);
480  try {
481  total_group_by_buffer_size = align_to_int64(
482  static_cast<int64_t>(total_group_by_buffer_size + flatbuffer_size));
483  } catch (...) {
484  throw OutOfHostMemory(std::numeric_limits<int64_t>::max() / 8);
485  }
486  } else {
487  const checked_int64_t col_width = ti.get_size();
488  try {
489  const checked_int64_t group_buffer_size = col_width * num_rows_;
490  total_group_by_buffer_size = align_to_int64(
491  static_cast<int64_t>(group_buffer_size + total_group_by_buffer_size));
492  } catch (...) {
493  throw OutOfHostMemory(std::numeric_limits<int64_t>::max() / 8);
494  }
495  }
496  }
497 
498 #ifdef __SANITIZE_ADDRESS__
499  // AddressSanitizer will reject allocation sizes above 1 TiB
500 #define MAX_BUFFER_SIZE 0x10000000000ll
501 #else
502  // otherwise, we'll set the limit to 16 TiB, feel free to increase
503  // the limit if needed
504 #define MAX_BUFFER_SIZE 0x100000000000ll
505 #endif
506 
507  if (total_group_by_buffer_size >= MAX_BUFFER_SIZE) {
508  throw OutOfHostMemory(total_group_by_buffer_size);
509  }
510 
511  CHECK_EQ(num_buffers_, size_t(1));
512  auto group_by_buffer = alloc_group_by_buffer(total_group_by_buffer_size,
513  nullptr,
514  thread_idx_,
515  row_set_mem_owner.get(),
516  false)
517  .first;
518  group_by_buffers_.push_back(group_by_buffer);
519 
520  const auto column_frag_offsets =
521  get_col_frag_offsets(exe_unit.target_exprs, frag_offsets);
522  const auto column_frag_sizes =
523  get_consistent_frags_sizes(exe_unit.target_exprs, consistent_frag_sizes);
524  result_sets_.emplace_back(
525  new ResultSet(target_exprs_to_infos(exe_unit.target_exprs, query_mem_desc),
526  /*col_lazy_fetch_info=*/{},
527  col_buffers,
528  column_frag_offsets,
529  column_frag_sizes,
530  device_type,
531  device_id,
532  -1, /*thread_idx*/
534  row_set_mem_owner_,
535  executor->blockSize(),
536  executor->gridSize()));
537  result_sets_.back()->allocateStorage(reinterpret_cast<int8_t*>(group_by_buffer),
538  init_agg_vals_);
539 }
#define CHECK_EQ(x, y)
Definition: Logger.h:301
boost::multiprecision::number< boost::multiprecision::cpp_int_backend< 64, 64, boost::multiprecision::signed_magnitude, boost::multiprecision::checked, void >> checked_int64_t
num_buffers_(1)
std::pair< int64_t *, bool > alloc_group_by_buffer(const size_t numBytes, RenderAllocatorMap *render_allocator_map, const size_t thread_idx, RowSetMemoryOwner *mem_owner, const bool reuse_existing_buffer_for_thread)
std::vector< int64_t > get_consistent_frags_sizes(const std::vector< std::vector< uint64_t >> &frag_offsets)
static QueryMemoryDescriptor fixupQueryMemoryDescriptor(const QueryMemoryDescriptor &)
Definition: ResultSet.cpp:766
#define MAX_BUFFER_SIZE
#define CHECK(condition)
Definition: Logger.h:291
std::vector< TargetInfo > target_exprs_to_infos(const std::vector< Analyzer::Expr * > &targets, const QueryMemoryDescriptor &query_mem_desc)
FORCE_INLINE HOST DEVICE T align_to_int64(T addr)
std::vector< std::vector< int64_t > > get_col_frag_offsets(const std::vector< Analyzer::Expr * > &target_exprs, const std::vector< std::vector< uint64_t >> &table_frag_offsets)

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

varlen_output_buffer_ ( )
varlen_output_buffer_host_ptr_ ( nullptr  )

Variable Documentation