MUDA
Loading...
Searching...
No Matches
sub_field_interface.h
1#pragma once
2#include <memory>
3#include <muda/ext/field/field_build_options.h>
4#include <muda/ext/field/field_entry_type.h>
5#include <vector>
6#include <unordered_map>
7#include <muda/mstl/span.h>
8
9namespace muda
10{
11class Field;
12class FieldEntryBase;
13
15{
16 template <typename T>
17 using U = std::unique_ptr<T>;
18 friend class SubField;
19 template <FieldEntryLayout Layout>
20 friend class FieldBuilder;
21
22 protected:
23 Field& m_field;
24 std::vector<U<FieldEntryBase>> m_entries;
25 FieldEntryLayoutInfo m_layout_info;
26 FieldBuildOptions m_build_options;
27 std::unordered_map<std::string, size_t> m_name_to_index;
28 size_t m_num_elements = 0;
29 uint32_t m_struct_stride = ~0;
30 std::byte* m_data_buffer = nullptr;
31 size_t m_data_buffer_size = 0;
32
33 /***************************************************************************************************
34 Subclass Implement
35 ****************************************************************************************************/
36 virtual void build_impl() = 0;
37 virtual size_t require_total_buffer_byte_size(size_t element_count) = 0;
38 virtual void calculate_new_cores(std::byte* byte_buffer,
39 size_t total_bytes,
40 size_t element_count,
41 span<FieldEntryCore> new_cores) = 0;
42 virtual bool allow_inplace_shrink() const { return true; }
43
44
45 /***************************************************************************************************
46 Common Utilities
47 ****************************************************************************************************/
48 const FieldEntryLayoutInfo& layout_info() const { return m_layout_info; }
49 const FieldBuildOptions& build_options() const { return m_build_options; }
50 size_t num_elements() const { return m_num_elements; }
51 static uint32_t round_up(uint32_t total, uint32_t N);
52 static uint32_t align(uint32_t offset, uint32_t size, uint32_t min_alignment, uint32_t max_alignment);
53 public:
54 SubFieldInterface(Field& field) MUDA_NOEXCEPT : m_field(field) {}
55 virtual ~SubFieldInterface();
56
57 // delete copy and move
58 SubFieldInterface(const SubFieldInterface&) = delete;
59 SubFieldInterface& operator=(const SubFieldInterface&) = delete;
61 SubFieldInterface& operator=(SubFieldInterface&&) = delete;
62
63 private:
64 // used to resize the entry buffer.
65 std::vector<FieldEntryCore> m_new_cores;
66 std::vector<HostDeviceConfig<FieldEntryCore>> m_host_device_new_cores;
67
68 /***************************************************************************************************
69 Internal Utilities
70 ****************************************************************************************************/
71 void aync_upload_cores();
72 void async_upload_temp_cores();
73 template <typename F> // F: void(std::byte* old_ptr, size_t old_size, std::byte* new_ptr, size_t new_size)
74 void resize_data_buffer(size_t size, F&& func);
75
76 /***************************************************************************************************
77 SubField Using Only
78 ****************************************************************************************************/
79 void resize(size_t num_elements);
80 void build();
81};
82} // namespace muda
83
84#include "details/sub_field_interface.inl"
Definition field_build_options.inl:6
Definition field_builder.h:15
Definition field_entry_layout.h:24
Definition field.h:17
Definition sub_field.h:18
Definition sub_field_interface.h:15