PeriDyno 1.0.0
Loading...
Searching...
No Matches
VkReduce.inl
Go to the documentation of this file.
1
2#include "VkTransfer.h"
3#include "VkConstant.h"
4
5namespace dyno {
6
7 inline int SizeOfNextLevel(int size, int localSize)
8 {
9 return (size + localSize) / localSize;
10 }
11
12 template<typename T>
13 T VkReduce<T>::reduce(const std::vector<T>& input)
14 {
15 VkHostArray<T> hostArray;
16 hostArray.resize(input.size(), input.data());
17
18 VkDeviceArray<T> deviceArray;
19 deviceArray.resize(input.size());
20
21 vkTransfer(deviceArray, hostArray);
22
23 T ret = reduce(deviceArray);
24
25 deviceArray.clear();
26 hostArray.clear();
27
28 return ret;
29 }
30
31 template<typename T>
33 {
34 unsigned int localSize = 256;
35 auto globalSize = input.size();
36
37 std::vector<VkDeviceArray<T>> buffers;
38 buffers.push_back(input);
39
40 int n = SizeOfNextLevel(globalSize, localSize);
41 while (n > 1)
42 {
43 buffers.push_back(VkDeviceArray<T>(n));
44 n = SizeOfNextLevel(n, localSize);
45 }
46
47 buffers.push_back(VkDeviceArray<T>(1));
48
50
51 mReduceKernel->begin();
52
53 for (std::size_t i = 0; i < buffers.size() - 1; i++)
54 {
55 num.setValue(buffers[i].size());
56 dim3 groupSize = vkDispatchSize(num.getValue(), localSize);
57 mReduceKernel->enqueue(groupSize, &buffers[i], &buffers[i + 1], &num);
58 }
59
60 mReduceKernel->end();
61
62 mReduceKernel->update(true);
63 mReduceKernel->wait();
64
65 std::vector<T> ret(1);
66 vkTransfer(ret, buffers.back());
67
68 T sum = ret[0];
69
70 ret.clear();
71
72 for (std::size_t i = 1; i < buffers.size(); i++)
73 {
74 buffers[i].clear();
75 }
76
77 return sum;
78 }
79
80 template<typename T>
82 mReduceKernel = nullptr;
83 }
84
85 template<typename T>
87 mReduceKernel = std::make_shared<VkProgram>(
88 BUFFER(T),
89 BUFFER(T),
90 CONSTANT(int));
91
92 mReduceKernel->load(getDynamicSpvFile<T>("shaders/glsl/core/Reduce.comp.spv"));
93 }
94}
#define BUFFER(T)
Definition VkProgram.h:96
#define CONSTANT(T)
Definition VkProgram.h:100
std::string getDynamicSpvFile(const std::string &fileName)
Definition VulkanTools.h:67
void setValue(const T val)
VkResizeType resize(uint32_t num, VkBufferUsageFlags usageFlags=0)
uint32_t size() const
void resize(uint32_t num, const T *data=nullptr)
std::shared_ptr< VkProgram > mReduceKernel
Definition VkReduce.h:22
T reduce(const std::vector< T > &input)
Definition VkReduce.inl:13
#define T(t)
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
static dim3 vkDispatchSize(uint totalSize, uint blockSize)
Definition VkProgram.h:34
int SizeOfNextLevel(int size, int localSize)
Definition VkReduce.inl:7
bool vkTransfer(VkHostArray< T > &dst, const VkDeviceArray< T > &src)
Definition VkTransfer.inl:7