PeriDyno 1.0.0
Loading...
Searching...
No Matches
Array.inl
Go to the documentation of this file.
1#include "VkDeviceArray.h"
2#include "VkTransfer.h"
3
4namespace dyno
5{
6 template<typename T>
8 {
9 if (mData.size() != src.size())
10 this->resize(src.size());
11
12 vkTransfer(mData, *src.handle());
13 //cuSafeCall(cudaMemcpy(this->begin(), src.begin(), src.size() * sizeof(T), cudaMemcpyDeviceToHost));
14 }
15
20 template<typename T>
21 class Array<T, DeviceType::GPU>
22 {
23 public:
24 Array()
25 {
26 };
27
28 Array(uint num)
29 {
30 this->resize(num);
31 }
32
36 ~Array() {};
37
38 void resize(const uint n);
39
43 void reset();
44
48 void clear();
49
50// inline const T* begin() const { return mData; }
51// inline T* begin() { return mData; }
52
53 inline const VkDeviceArray<T>* handle() const { return &mData; }
54 inline VkDeviceArray<T>* handle() { return &mData; }
55
56 VkBuffer buffer() const { return mData.bufferHandle(); }
57
58 uint32_t bufferSize() { return mData.bufferSize(); }
59
60 DeviceType deviceType() { return DeviceType::GPU; }
61
62 inline T& operator [] (unsigned int id) {
63 return mData[id];
64 }
65
66 inline T& operator [] (unsigned int id) const {
67 return mData[id];
68 }
69
70 inline uint size() const { return mData.size(); }
71 inline bool isCPU() const { return false; }
72 inline bool isGPU() const { return true; }
73 inline bool isEmpty() const { return mData.size() == 0; }
74
75 void assign(const Array<T, DeviceType::GPU>& src);
76 void assign(const Array<T, DeviceType::CPU>& src);
77 void assign(const std::vector<T>& src);
78
79 void assign(const Array<T, DeviceType::GPU>& src, const uint count, const uint dstOffset = 0, const uint srcOffset = 0);
80 void assign(const Array<T, DeviceType::CPU>& src, const uint count, const uint dstOffset = 0, const uint srcOffset = 0);
81 void assign(const std::vector<T>& src, const uint count, const uint dstOffset = 0, const uint srcOffset = 0);
82
83 friend std::ostream& operator<<(std::ostream& out, const Array<T, DeviceType::GPU>& dArray)
84 {
85 Array<T, DeviceType::CPU> hArray;
86 hArray.assign(dArray);
87
88 out << hArray;
89
90 return out;
91 }
92
93 private:
94 VkDeviceArray<T> mData;
95 };
96
97 template<typename T>
99
100 template<typename T>
102 {
103 if (mData.size() == n) return;
104
105 if (n == 0) {
106 mData.clear();
107 return;
108 }
109
110 mData.resize(n);
111 }
112
113 template<typename T>
115 {
116 mData.clear();
117 }
118
119 template<typename T>
121 {
122 //TODO:
123 //cuSafeCall(cudaMemset((void*)mData, 0, mTotalNum * sizeof(T)));
124 }
125
126 template<typename T>
128 {
129 if (src.size() == 0)
130 {
131 mData.clear();
132 return;
133 }
134
135 if (mData.size() != src.size())
136 this->resize(src.size());
137
138 vkTransfer(mData, *src.handle());
139 //cuSafeCall(cudaMemcpy(mData, src.begin(), src.size() * sizeof(T), cudaMemcpyDeviceToDevice));
140 }
141
142 template<typename T>
144 {
145 if (mData.size() != src.size())
146 this->resize(src.size());
147
148 vkTransfer(mData, *src.handle());
149 //cuSafeCall(cudaMemcpy(mData, src.begin(), src.size() * sizeof(T), cudaMemcpyHostToDevice));
150 }
151
152
153 template<typename T>
154 void Array<T, DeviceType::GPU>::assign(const std::vector<T>& src)
155 {
156 if (mData.size() != src.size())
157 this->resize((uint)src.size());
158
159 vkTransfer(mData, src);
160 //cuSafeCall(cudaMemcpy(mData, src.data(), src.size() * sizeof(T), cudaMemcpyHostToDevice));
161 }
162
163 template<typename T>
164 void Array<T, DeviceType::GPU>::assign(const std::vector<T>& src, const uint count, const uint dstOffset, const uint srcOffset)
165 {
166 //cuSafeCall(cudaMemcpy(mData + dstOffset, src.begin() + srcOffset, count * sizeof(T), cudaMemcpyHostToDevice));
167 }
168
169 template<typename T>
170 void Array<T, DeviceType::GPU>::assign(const Array<T, DeviceType::CPU>& src, const uint count, const uint dstOffset, const uint srcOffset)
171 {
172 //cuSafeCall(cudaMemcpy(mData + dstOffset, src.begin() + srcOffset, count * sizeof(T), cudaMemcpyHostToDevice));
173 }
174
175 template<typename T>
176 void Array<T, DeviceType::GPU>::assign(const Array<T, DeviceType::GPU>& src, const uint count, const uint dstOffset, const uint srcOffset)
177 {
178 vkTransfer(mData, (uint64_t)dstOffset, *src.handle(), (uint64_t)srcOffset, (uint64_t)count);
179 }
180}
This class is designed to be elegant, so it can be directly passed to GPU as parameters.
Definition Array.h:27
#define T(t)
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
Array< T, DeviceType::GPU > DArray
Definition Array.inl:89
unsigned int uint
Definition VkProgram.h:14
bool vkTransfer(VkHostArray< T > &dst, const VkDeviceArray< T > &src)
Definition VkTransfer.inl:7