ae2f_docs
MlpTrainHalf-Primal.c
1#include <ae2fVK/Ann/Mlp.h>
2#include "../vk.h"
3#include <time.h>
4
5#if 0
6static ae2fVK_AnnMlpMk_t s_mk;
7static ae2fVK_AnnMlpMapRangedGeneric_t s_mapranged;
8static ae2f_float* s_ptr0;
9static ae2f_float* s_ptr1;
10
11static void ActDummy(ae2f_float*, ae2f_float);
12static void LossDummy(ae2f_float* a, const ae2f_float* b, const ae2f_float* c, size_t d, size_t e)
13{
14 return;
15}
16
17static size_t s_lpModelLen[] = {2, 4, 3, 12, 1};
18
19#define NULL_GENERIC(T) ((T*)NULL)
20
21int main() {
22 Test_VkInit();
23
24 __ae2fVK_AnnMlpMk_imp_V(
25 uint32_t
26 , s_mk
27 , NULL_GENERIC(ae2f_float)
28 , NULL_GENERIC(ae2f_float)
29 , NULL_GENERIC(ae2f_float)
30 , NULL_GENERIC(ae2f_float)
31 , sizeof(s_lpModelLen) / sizeof(s_lpModelLen[0])
32 , s_lpModelLen
33 , NULL_GENERIC(size_t)
34 , 0, 0
35 , NULL_GENERIC(ae2f_AnnActFFN_t*), NULL_GENERIC(ae2f_AnnActFFN_t*)
36 , LossDummy
37 , 0.1, 0.1, vkdev, vkphydevmemprops
38 , NULL_GENERIC(VkAllocationCallbacks)
39 , ""
40 "#define ACT_DERIV(lidx, r, x, i, c) { *(r) = (((x)[i] + 1e-7) * (1.0 - (x)[i] - 1e-7)); } \n"
41 "#define ACT(lidx, r, x, i, c) { *(r) = (1.0 / (1.0 + exp(-(x[i])))); } \n"
42 "#define LOSS_DERIV(r, o, t, i, c) { *(r) = ((o)[i] - (t)[i]) / (c); } \n"
43 "#pragma OPENCL EXTENSION cl_khr_fp16 : enable\n"
44 "#define ae2f_float_t half\n"
45 ""
46 , "\n"
47 );
48
49 {
50 __ae2fVK_AnnMlpMapWB_imp(
51 s_mapranged
52 , *(s_mk).m_U0.m_mkswap.m_mkbase
53 , (s_mk).m_ret.m_err
54 , s_ptr0
55 , s_ptr1
56 );
57
58 assert(s_ptr0);
59 assert(s_ptr1);
60
61 size_t i = (s_mk).m_U0.m_mkswap.m_mkbase->m_mlp.m_depth - 1;
62
63 while(i--) {
64 size_t j = (s_mk).m_U0.m_mkswap.m_mkbase->m_mlp.m_outc;
65 const size_t k1 = j;
66 while(j--) {
67 size_t k = k1;
68 s_ptr1[k1 * i + j] = 0.2;
69 while(k--) {
70 s_ptr0[k1 * k1 * i + k1 * k + j] = 0.5;
71 }
72 }
73 }
74
75 __ae2fVK_AnnMlpUnMapWB_imp(
76 s_mapranged
77 , *(s_mk).m_U0.m_mkswap.m_mkbase
78 );
79 }
80
81 {
82 __ae2fVK_AnnMlpMapGoal_imp(
83 s_mapranged
84 , (*(s_mk).m_U0.m_mkswap.m_mkbase)
85 , (s_mk).m_ret.m_err
86 , s_ptr0
87 );
88
89 assert(s_ptr0);
90 s_ptr0[0] = 0.281236;
91 printf("Goal has set: %f\n", s_ptr0[0]);
92
93 __ae2fVK_AnnMlpUnMapGoal_imp(
94 s_mapranged
95 , *(s_mk).m_U0.m_mkswap.m_mkbase
96 );
97 }
98
99 {
100 __ae2fVK_AnnMlpMapOutStream_imp(
101 s_mapranged
102 , *(s_mk).m_U0.m_mkswap.m_mkbase
103 , s_mk.m_ret.m_err
104 , s_ptr0
105 );
106
107 s_ptr0[0] = 12;
108 s_ptr0[1] = 13;
109
110 const size_t
111 a_depth = (s_mk).m_U0.m_mkswap.m_mkbase->m_mlp.m_depth
112 , a_outc = (s_mk).m_U0.m_mkswap.m_mkbase->m_mlp.m_outc;
113
114
115 printf("OUT INIT FOR TEST: %f\n", (s_ptr0[(a_depth - 1) * a_outc] = 4));
116
117 __ae2fVK_AnnMlpUnMapOutStream_imp(s_mapranged, *(s_mk).m_U0.m_mkswap.m_mkbase);
118 }
119
120 VkCommandBuffer vkcmdbuf = NULL;
121 VkCommandPool vkcmdpool = NULL;
122 {
123 VkCommandPoolCreateInfo vkcmdpoolcreatinfo;
124 vkcmdpoolcreatinfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
125 vkcmdpoolcreatinfo.pNext = NULL;
126 vkcmdpoolcreatinfo.queueFamilyIndex = 0;
127 vkcmdpoolcreatinfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
128
129 if((((s_mk).m_U0.m_mkswap.m_mkbase->m_vkres) = vkCreateCommandPool(
130 vkdev
131 , &vkcmdpoolcreatinfo
132 , NULL
133 , &vkcmdpool
134 )) != VK_SUCCESS)
135 {
136 printf("Errval: %d\n", (s_mk.m_U0.m_mkswap.m_mkbase)->m_vkres);
137 assert(!"vkCreateCommandPool has failed.");
138 return -1;
139 }
140
141 unless(vkcmdpool) {
142 assert(!"vkCreateCommandPool went null");
143 return -1;
144 }
145 }
146
147 {
148 VkCommandBufferAllocateInfo vkcmdallocinfo;
149 vkcmdallocinfo.commandBufferCount = 1;
150 vkcmdallocinfo.pNext = NULL;
151 vkcmdallocinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
152 vkcmdallocinfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
153 vkcmdallocinfo.commandPool = vkcmdpool;
154
155 if((s_mk.m_U0.m_mkswap.m_mkbase->m_vkres =
156 vkAllocateCommandBuffers(
157 (vkdev)
158 , &vkcmdallocinfo
159 , &vkcmdbuf
160 )) != VK_SUCCESS)
161 {
162 printf("Errval: %d\n", (s_mk.m_U0.m_mkswap.m_mkbase)->m_vkres);
163 assert(!"vkAllocateCommandBuffers has failed.");
164 return -1;
165 }
166
167 unless((vkcmdbuf))
168 {
169 printf("Errval: %d\n", (s_mk.m_U0.m_mkswap.m_mkbase)->m_vkres);
170 assert(!"vkAllocateCommandBuffers went null.");
171 return -1;
172 }
173 }
174
175 {
176 ae2fVK_AnnMlpCreatDescPool_t v_poolmk;
177 ae2fVK_AnnMlpDescPoolCmdMk_t v_cmdmk;
178
179 ae2fVK_AnnMlpDescPool v_descpool;
180 ae2fVK_AnnMlpDescPoolCmd v_descpoolcmd;
181
182 /** Getting pool */
183 __ae2fVK_AnnMlpDescPoolMk_imp(
184 v_poolmk
185 , v_descpool
186 , s_mk.m_ret.m_err
187 , (s_mk.m_U0.m_mkswap.m_mkbase[0])
188 , VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT
189 , 1
190 );
191
192 /** Getting predict command */
193 __ae2fVK_AnnMlpDescPoolCmdMkTrain_imp(
194 v_cmdmk
195 , (s_mk.m_U0.m_mkswap.m_mkbase[0])
196 , s_mk.m_ret.m_err
197 , v_descpool
198 , v_descpoolcmd
199 , vkcmdbuf
200 );
201
202 assert(s_mk.m_ret.m_err == ae2f_errGlob_OK);
203
204
205 VkSubmitInfo submit_info = {
206 .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
207 .commandBufferCount = 1,
208 .pCommandBuffers = &vkcmdbuf,
209 };
210 size_t i;
211
212 if (vkQueueSubmit(
213 vkqueue
214 , 1
215 , &submit_info
216 , VK_NULL_HANDLE
217 ) != VK_SUCCESS)
218 {
219 assert(!"vkQueueSubmit failed");
220 return -1;
221 }
222
223 if (vkQueueWaitIdle(vkqueue) != VK_SUCCESS) {
224 assert(!"vkQueueWaitIdle failed");
225 return -1;
226 }
227
228 {
229 __ae2fVK_AnnMlpMapOutStream_imp(
230 s_mapranged
231 , *(s_mk).m_U0.m_mkswap.m_mkbase
232 , s_mk.m_ret.m_err
233 , s_ptr0
234 );
235
236 const size_t
237 a_depth = (s_mk).m_U0.m_mkswap.m_mkbase->m_mlp.m_depth
238 , a_outc = (s_mk).m_U0.m_mkswap.m_mkbase->m_mlp.m_outc;
239
240 printf("OUT: %f\n", s_ptr0[(a_depth - 1) * (a_outc)]);
241 printf("IN: %f %f\n", s_ptr0[0], s_ptr0[1]);
242
243
244 __ae2fVK_AnnMlpUnMapOutStream_imp(s_mapranged, *(s_mk).m_U0.m_mkswap.m_mkbase);
245
246 }
247
248 clock_t curr;
249 curr = clock();
250
251 for(i = 0; i < 10000; i++) {
252 if (vkQueueSubmit(
253 vkqueue
254 , 1
255 , &submit_info
256 , VK_NULL_HANDLE
257 ) != VK_SUCCESS)
258 {
259 assert(!"vkQueueSubmit failed");
260 return -1;
261 }
262
263 if (vkQueueWaitIdle(vkqueue) != VK_SUCCESS) {
264 assert(!"vkQueueWaitIdle failed");
265 return -1;
266 }
267 }
268
269 printf("TIME ELAPSED: %lf\n", ((double)(clock() - curr)) / ((double)CLOCKS_PER_SEC));
270
271 __ae2fVK_AnnMlpDescPoolCmdClean_imp(
272 s_mk.m_U0.m_mkswap.m_mkbase[0]
273 , v_descpool
274 , v_descpoolcmd
275 );
276
277 __ae2fVK_AnnMlpDescPoolClean_imp(
278 s_mk.m_U0.m_mkswap.m_mkbase[0]
279 , v_descpool
280 );
281 }
282
283 {
284 __ae2fVK_AnnMlpMapOutStream_imp(
285 s_mapranged
286 , *(s_mk).m_U0.m_mkswap.m_mkbase
287 , s_mk.m_ret.m_err
288 , s_ptr0
289 );
290
291 const size_t
292 a_depth = (s_mk).m_U0.m_mkswap.m_mkbase->m_mlp.m_depth
293 , a_outc = (s_mk).m_U0.m_mkswap.m_mkbase->m_mlp.m_outc;
294
295 printf("OUT: %f\n", s_ptr0[(a_depth - 1) * (a_outc)]);
296 printf("IN: %f %f\n", s_ptr0[0], s_ptr0[1]);
297
298
299 __ae2fVK_AnnMlpUnMapOutStream_imp(s_mapranged, *(s_mk).m_U0.m_mkswap.m_mkbase);
300 }
301
302 vkFreeCommandBuffers(vkdev, vkcmdpool, 1, &vkcmdbuf);
303 vkDestroyCommandPool(vkdev, vkcmdpool, NULL);
304
305 __ae2fVK_AnnMlpClean_imp(*((s_mk).m_U0.m_mkswap.m_mkbase));
306 free((s_mk).m_U0.m_mkswap.m_mkbase);
307 Test_VkEnd();
308 return 0;
309}
310
311#else
312
313int main () { return 0; }
314#endif