-
Notifications
You must be signed in to change notification settings - Fork 0
/
csr_hw_wrapper.cpp
308 lines (259 loc) · 14.7 KB
/
csr_hw_wrapper.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
#include "csr_hw_wrapper.h"
void create_csr_hw_matrix(csr_matrix *matrix, csr_hw_matrix ***hw_matrix, bool ***empty_rows_bitmap)
{
(*hw_matrix) = (csr_hw_matrix **)malloc(ComputeUnits*sizeof(csr_hw_matrix*));
#if CU == 1
csr_hw_matrix *hw_matrix1;
create_csr_hw_matrix(matrix, &hw_matrix1,
empty_rows_bitmap);
(*hw_matrix)[0] = hw_matrix1;
#elif CU == 2
csr_hw_matrix *hw_matrix1, *hw_matrix2;
create_csr_hw_matrix(matrix, &hw_matrix1, &hw_matrix2,
empty_rows_bitmap);
(*hw_matrix)[0] = hw_matrix1;
(*hw_matrix)[1] = hw_matrix2;
#elif CU == 4
csr_hw_matrix *hw_matrix1, *hw_matrix2, *hw_matrix3, *hw_matrix4;
create_csr_hw_matrix(matrix, &hw_matrix1, &hw_matrix2, &hw_matrix3, &hw_matrix4,
empty_rows_bitmap);
(*hw_matrix)[0] = hw_matrix1;
(*hw_matrix)[1] = hw_matrix2;
(*hw_matrix)[2] = hw_matrix3;
(*hw_matrix)[3] = hw_matrix4;
#elif CU == 8
csr_hw_matrix *hw_matrix1, *hw_matrix2, *hw_matrix3, *hw_matrix4, *hw_matrix5, *hw_matrix6, *hw_matrix7, *hw_matrix8;
create_csr_hw_matrix(matrix, &hw_matrix1, &hw_matrix2, &hw_matrix3, &hw_matrix4, &hw_matrix5, &hw_matrix6, &hw_matrix7, &hw_matrix8,
empty_rows_bitmap);
(*hw_matrix)[0] = hw_matrix1;
(*hw_matrix)[1] = hw_matrix2;
(*hw_matrix)[2] = hw_matrix3;
(*hw_matrix)[3] = hw_matrix4;
(*hw_matrix)[4] = hw_matrix5;
(*hw_matrix)[5] = hw_matrix6;
(*hw_matrix)[6] = hw_matrix7;
(*hw_matrix)[7] = hw_matrix8;
#elif CU == 10
csr_hw_matrix *hw_matrix1, *hw_matrix2, *hw_matrix3, *hw_matrix4, *hw_matrix5, *hw_matrix6, *hw_matrix7, *hw_matrix8, *hw_matrix9, *hw_matrix10;
create_csr_hw_matrix(matrix, &hw_matrix1, &hw_matrix2, &hw_matrix3, &hw_matrix4, &hw_matrix5, &hw_matrix6, &hw_matrix7, &hw_matrix8, &hw_matrix9, &hw_matrix10,
empty_rows_bitmap);
(*hw_matrix)[0] = hw_matrix1;
(*hw_matrix)[1] = hw_matrix2;
(*hw_matrix)[2] = hw_matrix3;
(*hw_matrix)[3] = hw_matrix4;
(*hw_matrix)[4] = hw_matrix5;
(*hw_matrix)[5] = hw_matrix6;
(*hw_matrix)[6] = hw_matrix7;
(*hw_matrix)[7] = hw_matrix8;
(*hw_matrix)[8] = hw_matrix9;
(*hw_matrix)[9] = hw_matrix10;
#elif CU == 12
csr_hw_matrix *hw_matrix1, *hw_matrix2, *hw_matrix3, *hw_matrix4, *hw_matrix5, *hw_matrix6, *hw_matrix7, *hw_matrix8, *hw_matrix9, *hw_matrix10, *hw_matrix11, *hw_matrix12;
create_csr_hw_matrix(matrix, &hw_matrix1, &hw_matrix2, &hw_matrix3, &hw_matrix4, &hw_matrix5, &hw_matrix6, &hw_matrix7, &hw_matrix8, &hw_matrix9, &hw_matrix10, &hw_matrix11, &hw_matrix12,
empty_rows_bitmap);
(*hw_matrix)[0] = hw_matrix1;
(*hw_matrix)[1] = hw_matrix2;
(*hw_matrix)[2] = hw_matrix3;
(*hw_matrix)[3] = hw_matrix4;
(*hw_matrix)[4] = hw_matrix5;
(*hw_matrix)[5] = hw_matrix6;
(*hw_matrix)[6] = hw_matrix7;
(*hw_matrix)[7] = hw_matrix8;
(*hw_matrix)[8] = hw_matrix9;
(*hw_matrix)[9] = hw_matrix10;
(*hw_matrix)[10] = hw_matrix11;
(*hw_matrix)[11] = hw_matrix12;
#endif
}
void create_csr_hw_y_vector(csr_hw_matrix **hw_matrix, csr_hw_vector ***hw_vector)
{
(*hw_vector) = (csr_hw_vector **)malloc(ComputeUnits*sizeof(csr_hw_vector*));
#if CU == 1
csr_hw_vector *hw_y1;
create_csr_hw_vector(&hw_y1, hw_matrix[0]->blocks, hw_matrix[0]->nr_rows);
(*hw_vector)[0] = hw_y1;
#elif CU == 2
csr_hw_vector *hw_y1, *hw_y2;
create_csr_hw_vector(&hw_y1, hw_matrix[0]->blocks, hw_matrix[0]->nr_rows);
create_csr_hw_vector(&hw_y2, hw_matrix[1]->blocks, hw_matrix[1]->nr_rows);
(*hw_vector)[0] = hw_y1;
(*hw_vector)[1] = hw_y2;
#elif CU == 4
csr_hw_vector *hw_y1, *hw_y2, *hw_y3, *hw_y4;
create_csr_hw_vector(&hw_y1, hw_matrix[0]->blocks, hw_matrix[0]->nr_rows);
create_csr_hw_vector(&hw_y2, hw_matrix[1]->blocks, hw_matrix[1]->nr_rows);
create_csr_hw_vector(&hw_y3, hw_matrix[2]->blocks, hw_matrix[2]->nr_rows);
create_csr_hw_vector(&hw_y4, hw_matrix[3]->blocks, hw_matrix[3]->nr_rows);
(*hw_vector)[0] = hw_y1;
(*hw_vector)[1] = hw_y2;
(*hw_vector)[2] = hw_y3;
(*hw_vector)[3] = hw_y4;
#elif CU == 8
csr_hw_vector *hw_y1, *hw_y2, *hw_y3, *hw_y4, *hw_y5, *hw_y6, *hw_y7, *hw_y8;
create_csr_hw_vector(&hw_y1, hw_matrix[0]->blocks, hw_matrix[0]->nr_rows);
create_csr_hw_vector(&hw_y2, hw_matrix[1]->blocks, hw_matrix[1]->nr_rows);
create_csr_hw_vector(&hw_y3, hw_matrix[2]->blocks, hw_matrix[2]->nr_rows);
create_csr_hw_vector(&hw_y4, hw_matrix[3]->blocks, hw_matrix[3]->nr_rows);
create_csr_hw_vector(&hw_y5, hw_matrix[4]->blocks, hw_matrix[4]->nr_rows);
create_csr_hw_vector(&hw_y6, hw_matrix[5]->blocks, hw_matrix[5]->nr_rows);
create_csr_hw_vector(&hw_y7, hw_matrix[6]->blocks, hw_matrix[6]->nr_rows);
create_csr_hw_vector(&hw_y8, hw_matrix[7]->blocks, hw_matrix[7]->nr_rows);
(*hw_vector)[0] = hw_y1;
(*hw_vector)[1] = hw_y2;
(*hw_vector)[2] = hw_y3;
(*hw_vector)[3] = hw_y4;
(*hw_vector)[4] = hw_y5;
(*hw_vector)[5] = hw_y6;
(*hw_vector)[6] = hw_y7;
(*hw_vector)[7] = hw_y8;
#elif CU == 10
csr_hw_vector *hw_y1, *hw_y2, *hw_y3, *hw_y4, *hw_y5, *hw_y6, *hw_y7, *hw_y8, *hw_y9, *hw_y10;
create_csr_hw_vector(&hw_y1, hw_matrix[0]->blocks, hw_matrix[0]->nr_rows);
create_csr_hw_vector(&hw_y2, hw_matrix[1]->blocks, hw_matrix[1]->nr_rows);
create_csr_hw_vector(&hw_y3, hw_matrix[2]->blocks, hw_matrix[2]->nr_rows);
create_csr_hw_vector(&hw_y4, hw_matrix[3]->blocks, hw_matrix[3]->nr_rows);
create_csr_hw_vector(&hw_y5, hw_matrix[4]->blocks, hw_matrix[4]->nr_rows);
create_csr_hw_vector(&hw_y6, hw_matrix[5]->blocks, hw_matrix[5]->nr_rows);
create_csr_hw_vector(&hw_y7, hw_matrix[6]->blocks, hw_matrix[6]->nr_rows);
create_csr_hw_vector(&hw_y8, hw_matrix[7]->blocks, hw_matrix[7]->nr_rows);
create_csr_hw_vector(&hw_y9, hw_matrix[8]->blocks, hw_matrix[8]->nr_rows);
create_csr_hw_vector(&hw_y10, hw_matrix[9]->blocks, hw_matrix[9]->nr_rows);
(*hw_vector)[0] = hw_y1;
(*hw_vector)[1] = hw_y2;
(*hw_vector)[2] = hw_y3;
(*hw_vector)[3] = hw_y4;
(*hw_vector)[4] = hw_y5;
(*hw_vector)[5] = hw_y6;
(*hw_vector)[6] = hw_y7;
(*hw_vector)[7] = hw_y8;
(*hw_vector)[8] = hw_y9;
(*hw_vector)[9] = hw_y10;
#elif CU == 12
csr_hw_vector *hw_y1, *hw_y2, *hw_y3, *hw_y4, *hw_y5, *hw_y6, *hw_y7, *hw_y8, *hw_y9, *hw_y10, *hw_y11, *hw_y12;
create_csr_hw_vector(&hw_y1, hw_matrix[0]->blocks, hw_matrix[0]->nr_rows);
create_csr_hw_vector(&hw_y2, hw_matrix[1]->blocks, hw_matrix[1]->nr_rows);
create_csr_hw_vector(&hw_y3, hw_matrix[2]->blocks, hw_matrix[2]->nr_rows);
create_csr_hw_vector(&hw_y4, hw_matrix[3]->blocks, hw_matrix[3]->nr_rows);
create_csr_hw_vector(&hw_y5, hw_matrix[4]->blocks, hw_matrix[4]->nr_rows);
create_csr_hw_vector(&hw_y6, hw_matrix[5]->blocks, hw_matrix[5]->nr_rows);
create_csr_hw_vector(&hw_y7, hw_matrix[6]->blocks, hw_matrix[6]->nr_rows);
create_csr_hw_vector(&hw_y8, hw_matrix[7]->blocks, hw_matrix[7]->nr_rows);
create_csr_hw_vector(&hw_y9, hw_matrix[8]->blocks, hw_matrix[8]->nr_rows);
create_csr_hw_vector(&hw_y10, hw_matrix[9]->blocks, hw_matrix[9]->nr_rows);
create_csr_hw_vector(&hw_y11, hw_matrix[10]->blocks, hw_matrix[10]->nr_rows);
create_csr_hw_vector(&hw_y12, hw_matrix[11]->blocks, hw_matrix[11]->nr_rows);
(*hw_vector)[0] = hw_y1;
(*hw_vector)[1] = hw_y2;
(*hw_vector)[2] = hw_y3;
(*hw_vector)[3] = hw_y4;
(*hw_vector)[4] = hw_y5;
(*hw_vector)[5] = hw_y6;
(*hw_vector)[6] = hw_y7;
(*hw_vector)[7] = hw_y8;
(*hw_vector)[8] = hw_y9;
(*hw_vector)[9] = hw_y10;
(*hw_vector)[10] = hw_y11;
(*hw_vector)[11] = hw_y12;
#endif
}
void create_csr_hw_x_vector(csr_hw_vector **hw_x, csr_vector *x, int blocks, IndexType *nr_cols)
{
create_csr_hw_vector(hw_x, blocks, nr_cols);
write_csr_hw_vector(*hw_x, x);
}
void spmv_hw(csr_hw_matrix **hw_matrix, csr_hw_vector *hw_x, csr_vector *y_fpga, bool **empty_rows_bitmap)
{
double hw_s, hw_f, hw_exec;
double ra_s, ra_f, ra_exec;
csr_hw_vector **hw_y;
create_csr_hw_y_vector(hw_matrix, &hw_y);
hw_s = getTimestamp();
for(int i=0; i<hw_matrix[0]->blocks; i++){
// std::cout << " BLOCK " << i << "\n";
#if CU == 1
spmv(
hw_matrix[0]->nr_rows[i],
hw_matrix[0]->nr_nzeros[i],
hw_matrix[0]->submatrix[i],
hw_matrix[0]->nr_ci[i],
hw_matrix[0]->nr_val[i],
hw_y[0]->values[i],
hw_x->values[i], hw_x->nr_values[i]);
#elif CU == 2
spmv(
hw_matrix[0]->nr_rows[i], hw_matrix[1]->nr_rows[i],
hw_matrix[0]->nr_nzeros[i], hw_matrix[1]->nr_nzeros[i],
hw_matrix[0]->submatrix[i], hw_matrix[1]->submatrix[i],
hw_matrix[0]->nr_ci[i], hw_matrix[1]->nr_ci[i],
hw_matrix[0]->nr_val[i], hw_matrix[1]->nr_val[i],
hw_y[0]->values[i], hw_y[1]->values[i],
hw_x->values[i], hw_x->nr_values[i]);
#elif CU == 4
spmv(
hw_matrix[0]->nr_rows[i], hw_matrix[1]->nr_rows[i], hw_matrix[2]->nr_rows[i], hw_matrix[3]->nr_rows[i],
hw_matrix[0]->nr_nzeros[i], hw_matrix[1]->nr_nzeros[i], hw_matrix[2]->nr_nzeros[i], hw_matrix[3]->nr_nzeros[i],
hw_matrix[0]->submatrix[i], hw_matrix[1]->submatrix[i], hw_matrix[2]->submatrix[i], hw_matrix[3]->submatrix[i],
hw_matrix[0]->nr_ci[i], hw_matrix[1]->nr_ci[i], hw_matrix[2]->nr_ci[i], hw_matrix[3]->nr_ci[i],
hw_matrix[0]->nr_val[i], hw_matrix[1]->nr_val[i], hw_matrix[2]->nr_val[i], hw_matrix[3]->nr_val[i],
hw_y[0]->values[i], hw_y[1]->values[i], hw_y[2]->values[i], hw_y[3]->values[i],
hw_x->values[i], hw_x->nr_values[i]);
#elif CU == 8
spmv(
hw_matrix[0]->nr_rows[i], hw_matrix[1]->nr_rows[i], hw_matrix[2]->nr_rows[i], hw_matrix[3]->nr_rows[i], hw_matrix[4]->nr_rows[i], hw_matrix[5]->nr_rows[i], hw_matrix[6]->nr_rows[i], hw_matrix[7]->nr_rows[i],
hw_matrix[0]->nr_nzeros[i], hw_matrix[1]->nr_nzeros[i], hw_matrix[2]->nr_nzeros[i], hw_matrix[3]->nr_nzeros[i], hw_matrix[4]->nr_nzeros[i], hw_matrix[5]->nr_nzeros[i], hw_matrix[6]->nr_nzeros[i], hw_matrix[7]->nr_nzeros[i],
hw_matrix[0]->submatrix[i], hw_matrix[1]->submatrix[i], hw_matrix[2]->submatrix[i], hw_matrix[3]->submatrix[i], hw_matrix[4]->submatrix[i], hw_matrix[5]->submatrix[i], hw_matrix[6]->submatrix[i], hw_matrix[7]->submatrix[i],
hw_matrix[0]->nr_ci[i], hw_matrix[1]->nr_ci[i], hw_matrix[2]->nr_ci[i], hw_matrix[3]->nr_ci[i], hw_matrix[4]->nr_ci[i], hw_matrix[5]->nr_ci[i], hw_matrix[6]->nr_ci[i], hw_matrix[7]->nr_ci[i],
hw_matrix[0]->nr_val[i], hw_matrix[1]->nr_val[i], hw_matrix[2]->nr_val[i], hw_matrix[3]->nr_val[i], hw_matrix[4]->nr_val[i], hw_matrix[5]->nr_val[i], hw_matrix[6]->nr_val[i], hw_matrix[7]->nr_val[i],
hw_y[0]->values[i], hw_y[1]->values[i], hw_y[2]->values[i], hw_y[3]->values[i], hw_y[4]->values[i], hw_y[5]->values[i], hw_y[6]->values[i], hw_y[7]->values[i],
hw_x->values[i], hw_x->nr_values[i]);
#elif CU == 10
spmv(
hw_matrix[0]->nr_rows[i], hw_matrix[1]->nr_rows[i], hw_matrix[2]->nr_rows[i], hw_matrix[3]->nr_rows[i], hw_matrix[4]->nr_rows[i], hw_matrix[5]->nr_rows[i], hw_matrix[6]->nr_rows[i], hw_matrix[7]->nr_rows[i], hw_matrix[8]->nr_rows[i], hw_matrix[9]->nr_rows[i],
hw_matrix[0]->nr_nzeros[i], hw_matrix[1]->nr_nzeros[i], hw_matrix[2]->nr_nzeros[i], hw_matrix[3]->nr_nzeros[i], hw_matrix[4]->nr_nzeros[i], hw_matrix[5]->nr_nzeros[i], hw_matrix[6]->nr_nzeros[i], hw_matrix[7]->nr_nzeros[i], hw_matrix[8]->nr_nzeros[i], hw_matrix[9]->nr_nzeros[i],
hw_matrix[0]->submatrix[i], hw_matrix[1]->submatrix[i], hw_matrix[2]->submatrix[i], hw_matrix[3]->submatrix[i], hw_matrix[4]->submatrix[i], hw_matrix[5]->submatrix[i], hw_matrix[6]->submatrix[i], hw_matrix[7]->submatrix[i], hw_matrix[8]->submatrix[i], hw_matrix[9]->submatrix[i],
hw_matrix[0]->nr_ci[i], hw_matrix[1]->nr_ci[i], hw_matrix[2]->nr_ci[i], hw_matrix[3]->nr_ci[i], hw_matrix[4]->nr_ci[i], hw_matrix[5]->nr_ci[i], hw_matrix[6]->nr_ci[i], hw_matrix[7]->nr_ci[i], hw_matrix[8]->nr_ci[i], hw_matrix[9]->nr_ci[i],
hw_matrix[0]->nr_val[i], hw_matrix[1]->nr_val[i], hw_matrix[2]->nr_val[i], hw_matrix[3]->nr_val[i], hw_matrix[4]->nr_val[i], hw_matrix[5]->nr_val[i], hw_matrix[6]->nr_val[i], hw_matrix[7]->nr_val[i], hw_matrix[8]->nr_val[i], hw_matrix[9]->nr_val[i],
hw_y[0]->values[i], hw_y[1]->values[i], hw_y[2]->values[i], hw_y[3]->values[i], hw_y[4]->values[i], hw_y[5]->values[i], hw_y[6]->values[i], hw_y[7]->values[i], hw_y[8]->values[i], hw_y[9]->values[i],
hw_x->values[i], hw_x->nr_values[i]);
#elif CU == 12
spmv(
hw_matrix[0]->nr_rows[i], hw_matrix[1]->nr_rows[i], hw_matrix[2]->nr_rows[i], hw_matrix[3]->nr_rows[i], hw_matrix[4]->nr_rows[i], hw_matrix[5]->nr_rows[i], hw_matrix[6]->nr_rows[i], hw_matrix[7]->nr_rows[i], hw_matrix[8]->nr_rows[i], hw_matrix[9]->nr_rows[i], hw_matrix[10]->nr_rows[i], hw_matrix[11]->nr_rows[i],
hw_matrix[0]->nr_nzeros[i], hw_matrix[1]->nr_nzeros[i], hw_matrix[2]->nr_nzeros[i], hw_matrix[3]->nr_nzeros[i], hw_matrix[4]->nr_nzeros[i], hw_matrix[5]->nr_nzeros[i], hw_matrix[6]->nr_nzeros[i], hw_matrix[7]->nr_nzeros[i], hw_matrix[8]->nr_nzeros[i], hw_matrix[9]->nr_nzeros[i], hw_matrix[10]->nr_nzeros[i], hw_matrix[11]->nr_nzeros[i],
hw_matrix[0]->submatrix[i], hw_matrix[1]->submatrix[i], hw_matrix[2]->submatrix[i], hw_matrix[3]->submatrix[i], hw_matrix[4]->submatrix[i], hw_matrix[5]->submatrix[i], hw_matrix[6]->submatrix[i], hw_matrix[7]->submatrix[i], hw_matrix[8]->submatrix[i], hw_matrix[9]->submatrix[i], hw_matrix[10]->submatrix[i], hw_matrix[11]->submatrix[i],
hw_matrix[0]->nr_ci[i], hw_matrix[1]->nr_ci[i], hw_matrix[2]->nr_ci[i], hw_matrix[3]->nr_ci[i], hw_matrix[4]->nr_ci[i], hw_matrix[5]->nr_ci[i], hw_matrix[6]->nr_ci[i], hw_matrix[7]->nr_ci[i], hw_matrix[8]->nr_ci[i], hw_matrix[9]->nr_ci[i], hw_matrix[10]->nr_ci[i], hw_matrix[11]->nr_ci[i],
hw_matrix[0]->nr_val[i], hw_matrix[1]->nr_val[i], hw_matrix[2]->nr_val[i], hw_matrix[3]->nr_val[i], hw_matrix[4]->nr_val[i], hw_matrix[5]->nr_val[i], hw_matrix[6]->nr_val[i], hw_matrix[7]->nr_val[i], hw_matrix[8]->nr_val[i], hw_matrix[9]->nr_val[i], hw_matrix[10]->nr_val[i], hw_matrix[11]->nr_val[i],
hw_y[0]->values[i], hw_y[1]->values[i], hw_y[2]->values[i], hw_y[3]->values[i], hw_y[4]->values[i], hw_y[5]->values[i], hw_y[6]->values[i], hw_y[7]->values[i], hw_y[8]->values[i], hw_y[9]->values[i], hw_y[10]->values[i], hw_y[11]->values[i],
hw_x->values[i], hw_x->nr_values[i]);
#endif
}
hw_f = getTimestamp();
hw_exec = (hw_f - hw_s)/(1000);
printf("Hardware execution time : %.6f ms elapsed\n", hw_exec);
ra_s = getTimestamp();
for(int i=0; i<hw_matrix[0]->blocks; i++){
IndexType offset = 0;
for(int k=0; k<ComputeUnits; k++)
accum_results(hw_y[k]->values[i], hw_y[k]->nr_values[i], y_fpga->values, y_fpga->nr_values, &offset, &(empty_rows_bitmap[i][offset]));
}
ra_f = getTimestamp();
ra_exec = (ra_f - ra_s)/(1000);
printf("Result accumulation time : %.6f ms elapsed\n", ra_exec);
printf("Total time : %.6f ms elapsed\n", hw_exec+ra_exec);
delete_csr_hw_y_vector(hw_y);
}
void delete_csr_hw_matrix(csr_hw_matrix **hw_matrix)
{
for(int i=0; i<ComputeUnits; i++)
_delete_csr_hw_matrix(&hw_matrix[i]);
free(hw_matrix);
}
void delete_csr_hw_y_vector(csr_hw_vector **hw_vector)
{
for(int i=0; i<ComputeUnits; i++)
_delete_csr_hw_vector(&hw_vector[i]);
free(hw_vector);
}
void delete_csr_hw_x_vector(csr_hw_vector *hw_vector)
{
_delete_csr_hw_vector(&hw_vector);
}