ae2f_docs
Slp.cl.c
1#pragma OPENCL EXTENSION cl-fast-relaxed-math : enable
2#pragma OPENCL EXTENSION pod-pushconstant : enable
3
4#if __ae2f_MACRO_GENERATED
5#define ae2fVK_clspv_IS_OPENCL 1
6#endif
7
8#include "./Slp.auto.h"
9
10#define ae2f_NEED_CLASS 0
11
12#ifndef ACT
13#define ACT(r, y, i, c) *(r) = (y)[i];
14#endif
15
16#ifndef ACT_DERIV
17#define ACT_DERIV(r, y, i, c) 1
18#endif
19
20#ifndef LOSS_DERIV
21#define LOSS_DERIV(r, y, y_desired, i, c) *(r) = (y)[i] - (y_desired)[i];
22#endif
23
24/** Magic numbers */
25#define p_weight glob
26#define p_bias (glob + (osz * isz))
27#define p_inp ((p_bias) + (osz))
28#define p_out ((p_inp) + (isz))
29#define p_delta ((p_out) + osz)
30#define p_goal ((p_delta) + osz)
31
32#define loc CAST(__local ae2f_float_t*, _loc)
33
34const ae2f_structdef(struct, lr_t) {
35 host_float_t m_weight;
36 host_float_t m_bias;
37};
38
39
40/**
41 * @brief
42 *
43 * get_global_id(0) : oidx \n
44 *
45 * Global: \n
46 * , ae2f_float_t[Out][Inp] : Weight \n
47 * , ae2f_float_t[Out] : Bias \n
48 * , ae2f_float_t[Inp] \n
49 * , ae2f_float_t[Out] \n
50 *
51 * */
52__kernel void kPredict(__global host_float_t* restrict glob, const uint unused) {
53 const size_t
54 oidx = get_global_id(0)
55 , osz = get_global_size(0)
56 , iidx = get_global_id(1)
57 , isz = get_global_size(1);
58
60
63 , v_predict
64 , p_out[oidx]
65 , p_out
66 , p_inp
67 , p_weight
68 , p_bias
69 , iidx
70 , isz
71 , oidx
72 , osz
73 , ACT
74 );
75}
76
77/**
78 * @brief
79 *
80 * get_global_id(0) : oidx \n
81 * get_local_id(0) : iidx \n
82 *
83 * Global: \n
84 * ae2f_float_t[Out][Inp] : Weights \n
85 * , ae2f_float_t[Out] : Bias \n
86 * , ae2f_float_t[Inp] \n
87 * , ae2f_float_t[Out] \n
88 * , ae2f_float_t[Out] : Delta \n
89 * , ae2f_float_t[Out] : Goal \n
90 *
91 * Local: \n
92 * ae2f_float_t[Out] \n
93 * */
94__kernel void kTrain(lr_t lr, __global host_float_t* restrict glob, __local uint* restrict _loc) {
95 const size_t
96 oidx = get_global_id(0)
97 , osz = get_global_size(0)
98 , iidx = get_global_id(1)
99 , isz = get_global_size(1)
100 ;
101
102 ae2f_float_t v_tmp = 0;
103 _clAtomAddF_t(__local, ae2f_float_t) slppredict;
104#define delta slppredict.m_atom[0].m_f
105#define v_tmp1 slppredict.m_atom[1].m_f
106
107 _clSlpPredict(__local, slppredict, v_tmp, loc, p_inp, p_weight, p_bias, iidx, isz, oidx, osz, ACT);
108
109 if(iidx == 0) {
110 p_out[oidx] = v_tmp;
111 loc[oidx] = v_tmp;
112
114 delta
115 , &v_tmp, &v_tmp1
116 , loc /** out */
117 , p_goal /** out_desired */
118 , oidx, osz
119 , ACT_DERIV, LOSS_DERIV
120 );
121
123 p_bias[oidx] /** r_bias */
124 , delta /** delta */
125 , lr.m_bias
126 );
127
128 p_delta[oidx] = delta;
129 }
130
131 delta = p_delta[oidx];
132 v_tmp = p_inp[iidx];
133
135 v_tmp
136 , delta /** delta */
137 , glob /** weight */
138 , lr.m_weight
139 , isz
140 , iidx
141 , osz
142 , oidx
143 );
144
145
146#undef v_tmp1
147#undef delta
148}
149
150/**
151 * @brief
152 *
153 * get_global_id(0) : oidx \n
154 * get_local_id(0) : iidx \n
155 *
156 * Global: \n
157 * ae2f_float_t[Out][In] : Weights \n
158 * , ae2f_float_t[Out] : Bias \n
159 * , ae2f_float_t[Inp] \n
160 * , ae2f_float_t[Out] \n
161 * , ae2f_float_t[Out] : Delta \n
162 * , ae2f_float_t[Out] : Goal \n
163 *
164 * */
165__kernel void kFit(lr_t lr, __global host_float_t* restrict glob) {
166 const size_t
167 oidx = get_global_id(0)
168 , osz = get_global_size(0)
169 , iidx = get_global_id(1)
170 , isz = get_global_size(1)
171 ;
172
173 ae2f_float_t delta, v_tmp, v_tmp1;
174
175 if(iidx == 0) {
177 delta /** retdelta */
178 , &v_tmp, &v_tmp1
179 , p_out /** out */
180 , p_goal /** out_desired */
181 , oidx, osz
182 , ACT_DERIV
183 , LOSS_DERIV
184 );
185
186 /** delta */
187
189 p_bias[oidx] /** r_bias */
190 , delta /** delta */
191 , lr.m_bias
192 );
193
194 p_delta[oidx] = delta;
195 }
196
197 delta = p_delta[oidx];
199 p_inp[iidx] /** inp */
200 , delta /** delta */
201 , p_weight /** weight */
202 , lr.m_weight
203 , isz
204 , iidx
205 , osz
206 , oidx
207 );
208}
209
210/**
211 * @brief
212 * get_global_id(0): oidx
213 * get_local_id(0): iidx
214 *
215 * Global: \n
216 * ae2f_float_t[Out][In] : Weights \n
217 * , ae2f_float_t[Out] : Bias \n
218 * , ae2f_float_t[Inp] \n
219 * , ae2f_float_t[Out] : Delta \n
220 * */
221__kernel void kFollow(lr_t lr, __global host_float_t* restrict glob) {
222 const size_t
223 oidx = get_global_id(0)
224 , osz = get_global_size(0)
225 , iidx = get_global_id(1)
226 , isz = get_global_size(1)
227 ;
228
230 p_inp[iidx] /** inp */
231 , p_delta[oidx] /** delta */
232 , p_weight /** weight */
233 , lr.m_weight
234 , isz
235 , iidx
236 , osz
237 , oidx
238 );
239
240 if(iidx == 0) {
242 p_bias[oidx] /** r_bias */
243 , p_delta[oidx] /** delta */
244 , lr.m_bias
245 );
246 }
247}
#define ae2f_structdef(key, name)
Definition Cast.h:110
#define loc
Definition Mlp.cl.c:81
#define p_weight
Definition Mlp.cl.c:46
#define p_goal
Definition Mlp.cl.c:55
#define p_bias
Definition Mlp.cl.c:49
#define p_inp
Definition Mlp.cl.c:43
#define p_delta
Definition Slp.cl.c:29
#define delta
#define v_tmp1
#define p_out
Definition Slp.cl.c:28
#define __global
Definition addrspec.h:8
#define __local
Definition addrspec.h:10
#define __kernel
Definition addrspec.h:7
#define __ae2f_AnnSlpFetchDeltaOne_imp(rret, ptr_tmp0, ptr_tmp1, prm_out, prm_out_desired, prm_oidx, prm_osz, fn_actderiv, fn_lossderiv)
Definition Slp.auto.h:528
#define __ae2f_AnnSlpFollowOneW_imp(inp, delta, weight, learningrate, inp_sz, inp_idx, out_sz, out_idx)
Definition Slp.auto.h:381
#define __ae2f_AnnSlpFollowOneB_imp(rret_bias, prm_delta, prm_learningrate_bias)
Definition Slp.auto.h:400
#define size_t
Definition mac.h:20
#define CAST(t, x)
Definition mac.h:16
#define host_float_t
Definition mac.h:9
#define uint
Definition sclr.h:11
#define _clAtomAddF_t(__global, host_float_t)
Definition Slp.auto.h:24
#define _clSlpPredict(__global, v_mem, ret, loc, p_inp, p_weight, p_bias, iidx, isz, oidx, osz, ACT)
Definition Slp.auto.h:81