]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - dense-linear-algebra-libraries/linalg.git/blob - blis/frame/3/gemm/4mh/bli_gemm4mh_cntl.c
TI Linear Algebra Library (LINALG) Rlease 1.0.0
[dense-linear-algebra-libraries/linalg.git] / blis / frame / 3 / gemm / 4mh / bli_gemm4mh_cntl.c
1 /*
3    BLIS    
4    An object-based framework for developing high-performance BLAS-like
5    libraries.
7    Copyright (C) 2014, The University of Texas at Austin
9    Redistribution and use in source and binary forms, with or without
10    modification, are permitted provided that the following conditions are
11    met:
12     - Redistributions of source code must retain the above copyright
13       notice, this list of conditions and the following disclaimer.
14     - Redistributions in binary form must reproduce the above copyright
15       notice, this list of conditions and the following disclaimer in the
16       documentation and/or other materials provided with the distribution.
17     - Neither the name of The University of Texas at Austin nor the names
18       of its contributors may be used to endorse or promote products
19       derived from this software without specific prior written permission.
21    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25    HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 */
35 #include "blis.h"
37 extern scalm_t*   scalm_cntl;
39 blksz_t*          gemm4mh_mc;
40 blksz_t*          gemm4mh_nc;
41 blksz_t*          gemm4mh_kc;
42 blksz_t*          gemm4mh_mr;
43 blksz_t*          gemm4mh_nr;
44 blksz_t*          gemm4mh_kr;
46 func_t*           gemm4mh_ukrs;
48 packm_t*          gemm4mh_packa_cntl_ro;
49 packm_t*          gemm4mh_packb_cntl_ro;
50 packm_t*          gemm4mh_packa_cntl_io;
51 packm_t*          gemm4mh_packb_cntl_io;
53 gemm_t*           gemm4mh_cntl_bp_ke;
54 gemm_t*           gemm4mh_cntl_op_bp_rr;
55 gemm_t*           gemm4mh_cntl_mm_op_rr;
56 gemm_t*           gemm4mh_cntl_vl_mm_rr;
57 gemm_t*           gemm4mh_cntl_op_bp_ri;
58 gemm_t*           gemm4mh_cntl_mm_op_ri;
59 gemm_t*           gemm4mh_cntl_vl_mm_ri;
60 gemm_t*           gemm4mh_cntl_op_bp_ir;
61 gemm_t*           gemm4mh_cntl_mm_op_ir;
62 gemm_t*           gemm4mh_cntl_vl_mm_ir;
63 gemm_t*           gemm4mh_cntl_op_bp_ii;
64 gemm_t*           gemm4mh_cntl_mm_op_ii;
65 gemm_t*           gemm4mh_cntl_vl_mm_ii;
67 gemm_t*           gemm4mh_cntl_rr;
68 gemm_t*           gemm4mh_cntl_ri;
69 gemm_t*           gemm4mh_cntl_ir;
70 gemm_t*           gemm4mh_cntl_ii;
73 void bli_gemm4mh_cntl_init()
74 {
75         // Create blocksize objects for each dimension.
76         // NOTE: the complex blocksizes for 4mh are equal to their
77         // corresponding real domain counterparts.
78         gemm4mh_mc
79         =
80         bli_blksz_obj_create( 0,                 0,
81                               0,                 0,
82                               BLIS_DEFAULT_MC_S, BLIS_MAXIMUM_MC_S,
83                               BLIS_DEFAULT_MC_D, BLIS_MAXIMUM_MC_D );
84         gemm4mh_nc
85         =
86         bli_blksz_obj_create( 0,                 0,
87                               0,                 0,
88                               BLIS_DEFAULT_NC_S, BLIS_MAXIMUM_NC_S,
89                               BLIS_DEFAULT_NC_D, BLIS_MAXIMUM_NC_D );
90         gemm4mh_kc
91         =
92         bli_blksz_obj_create( 0,                 0,
93                               0,                 0,
94                               BLIS_DEFAULT_KC_S, BLIS_MAXIMUM_KC_S,
95                               BLIS_DEFAULT_KC_D, BLIS_MAXIMUM_KC_D );
96         gemm4mh_mr
97         =
98         bli_blksz_obj_create( 0,                 0,
99                               0,                 0,
100                               BLIS_DEFAULT_MR_S, BLIS_PACKDIM_MR_S,
101                               BLIS_DEFAULT_MR_D, BLIS_PACKDIM_MR_D );
102         gemm4mh_nr
103         =
104         bli_blksz_obj_create( 0,                 0,
105                               0,                 0,
106                               BLIS_DEFAULT_NR_S, BLIS_PACKDIM_NR_S,
107                               BLIS_DEFAULT_NR_D, BLIS_PACKDIM_NR_D );
108         gemm4mh_kr
109         =
110         bli_blksz_obj_create( 0,                 0,
111                               0,                 0,
112                               BLIS_DEFAULT_KR_S, BLIS_PACKDIM_KR_S,
113                               BLIS_DEFAULT_KR_D, BLIS_PACKDIM_KR_D );
116         // Attach the register blksz_t objects as sub-blocksizes to the cache
117         // blksz_t objects.
118         bli_blksz_obj_attach_to( gemm4mh_mr, gemm4mh_mc );
119         bli_blksz_obj_attach_to( gemm4mh_nr, gemm4mh_nc );
120         bli_blksz_obj_attach_to( gemm4mh_kr, gemm4mh_kc );
123         // Create function pointer object for each datatype-specific gemm
124         // micro-kernel.
125         gemm4mh_ukrs
126         =
127         bli_func_obj_create(
128             NULL,                  FALSE,
129             NULL,                  FALSE,
130             BLIS_CGEMM4MH_UKERNEL, BLIS_CGEMM4MH_UKERNEL_PREFERS_CONTIG_ROWS,
131             BLIS_ZGEMM4MH_UKERNEL, BLIS_ZGEMM4MH_UKERNEL_PREFERS_CONTIG_ROWS );
134         // Create control tree objects for packm operations (real only).
135         gemm4mh_packa_cntl_ro
136         =
137         bli_packm_cntl_obj_create( BLIS_BLOCKED,
138                                    BLIS_VARIANT2,
139                                    gemm4mh_mr,
140                                    gemm4mh_kr,
141                                    FALSE, // do NOT invert diagonal
142                                    FALSE, // reverse iteration if upper?
143                                    FALSE, // reverse iteration if lower?
144                                    BLIS_PACKED_ROW_PANELS_RO,
145                                    BLIS_BUFFER_FOR_A_BLOCK );
147         gemm4mh_packb_cntl_ro
148         =
149         bli_packm_cntl_obj_create( BLIS_BLOCKED,
150                                    BLIS_VARIANT2,
151                                    gemm4mh_kr,
152                                    gemm4mh_nr,
153                                    FALSE, // do NOT invert diagonal
154                                    FALSE, // reverse iteration if upper?
155                                    FALSE, // reverse iteration if lower?
156                                    BLIS_PACKED_COL_PANELS_RO,
157                                    BLIS_BUFFER_FOR_B_PANEL );
159         // Create control tree objects for packm operations (imag only).
160         gemm4mh_packa_cntl_io
161         =
162         bli_packm_cntl_obj_create( BLIS_BLOCKED,
163                                    BLIS_VARIANT2,
164                                    gemm4mh_mr,
165                                    gemm4mh_kr,
166                                    FALSE, // do NOT invert diagonal
167                                    FALSE, // reverse iteration if upper?
168                                    FALSE, // reverse iteration if lower?
169                                    BLIS_PACKED_ROW_PANELS_IO,
170                                    BLIS_BUFFER_FOR_A_BLOCK );
172         gemm4mh_packb_cntl_io
173         =
174         bli_packm_cntl_obj_create( BLIS_BLOCKED,
175                                    BLIS_VARIANT2,
176                                    gemm4mh_kr,
177                                    gemm4mh_nr,
178                                    FALSE, // do NOT invert diagonal
179                                    FALSE, // reverse iteration if upper?
180                                    FALSE, // reverse iteration if lower?
181                                    BLIS_PACKED_COL_PANELS_IO,
182                                    BLIS_BUFFER_FOR_B_PANEL );
187 #ifdef BLIS_ENABLE_C66X_EDMA
188         // Create control tree object for lowest-level block-panel kernel.
189         gemm4mh_cntl_bp_ke
190         =
191         bli_gemm_cntl_obj_create( BLIS_UNB_OPT,
192                                   BLIS_VARIANT2,
193                                   NULL,
194                                   gemm4mh_ukrs,
195                                   NULL, NULL, NULL,
196                                   NULL, NULL, NULL,
197                                   NULL, NULL, NULL );
198         //
199         // Create control tree for A.real * B.real.
200         //
202         // Create control tree object for outer panel (to block-panel)
203         // problem. (real x real)
204         gemm4mh_cntl_op_bp_rr
205         =
206         bli_gemm_cntl_obj_create( BLIS_BLOCKED,
207                                   BLIS_VARIANT1,
208                                   gemm4mh_mc,
209                                   gemm4mh_ukrs,
210                                   NULL,
211                                   gemm4mh_packa_cntl_ro,
212                                   gemm4mh_packb_cntl_ro,
213                                   NULL,
214                                   NULL, NULL, NULL,
215                                   gemm4mh_cntl_bp_ke,
216                                   NULL );
218         // Create control tree object for general problem via multiple
219         // rank-k (outer panel) updates. (real x real)
220         gemm4mh_cntl_mm_op_rr
221         =
222         bli_gemm_cntl_obj_create( BLIS_BLOCKED,
223                                   BLIS_VARIANT3,
224                                   gemm4mh_kc,
225                                   gemm4mh_ukrs,
226                                   NULL,
227                                   NULL,
228                                   NULL,
229                                   NULL,
230                                   NULL, NULL, NULL,
231                                   gemm4mh_cntl_op_bp_rr,
232                                   NULL );
234         // Create control tree object for very large problem via multiple
235         // general problems. (real x real)
236         gemm4mh_cntl_vl_mm_rr
237         =
238         bli_gemm_cntl_obj_create( BLIS_BLOCKED,
239                                   BLIS_VARIANT2,
240                                   gemm4mh_nc,
241                                   gemm4mh_ukrs,
242                                   NULL,
243                                   NULL,
244                                   NULL,
245                                   NULL,
246                                   NULL, NULL, NULL,
247                                   gemm4mh_cntl_mm_op_rr,
248                                   NULL );
250         //
251         // Create control tree for A.real * B.imag.
252         //
254         // Create control tree object for outer panel (to block-panel)
255         // problem. (real x imag)
256         gemm4mh_cntl_op_bp_ri
257         =
258         bli_gemm_cntl_obj_create( BLIS_BLOCKED,
259                                   BLIS_VARIANT1,
260                                   gemm4mh_mc,
261                                   gemm4mh_ukrs,
262                                   NULL,
263                                   gemm4mh_packa_cntl_ro,
264                                   gemm4mh_packb_cntl_io,
265                                   NULL,
266                                   NULL, NULL, NULL,
267                                   gemm4mh_cntl_bp_ke,
268                                   NULL );
270         // Create control tree object for general problem via multiple
271         // rank-k (outer panel) updates. (real x imag)
272         gemm4mh_cntl_mm_op_ri
273         =
274         bli_gemm_cntl_obj_create( BLIS_BLOCKED,
275                                   BLIS_VARIANT3,
276                                   gemm4mh_kc,
277                                   gemm4mh_ukrs,
278                                   NULL,
279                                   NULL,
280                                   NULL,
281                                   NULL,
282                                   NULL, NULL, NULL,
283                                   gemm4mh_cntl_op_bp_ri,
284                                   NULL );
286         // Create control tree object for very large problem via multiple
287         // general problems. (real x imag)
288         gemm4mh_cntl_vl_mm_ri
289         =
290         bli_gemm_cntl_obj_create( BLIS_BLOCKED,
291                                   BLIS_VARIANT2,
292                                   gemm4mh_nc,
293                                   gemm4mh_ukrs,
294                                   NULL,
295                                   NULL,
296                                   NULL,
297                                   NULL,
298                                   NULL, NULL, NULL,
299                                   gemm4mh_cntl_mm_op_ri,
300                                   NULL );
302         //
303         // Create control tree for A.imag * B.real.
304         //
306         // Create control tree object for outer panel (to block-panel)
307         // problem. (imag x real)
308         gemm4mh_cntl_op_bp_ir
309         =
310         bli_gemm_cntl_obj_create( BLIS_BLOCKED,
311                                   BLIS_VARIANT1,
312                                   gemm4mh_mc,
313                                   gemm4mh_ukrs,
314                                   NULL,
315                                   gemm4mh_packa_cntl_io,
316                                   gemm4mh_packb_cntl_ro,
317                                   NULL,
318                                   NULL, NULL, NULL,
319                                   gemm4mh_cntl_bp_ke,
320                                   NULL );
322         // Create control tree object for general problem via multiple
323         // rank-k (outer panel) updates. (imag x real)
324         gemm4mh_cntl_mm_op_ir
325         =
326         bli_gemm_cntl_obj_create( BLIS_BLOCKED,
327                                   BLIS_VARIANT3,
328                                   gemm4mh_kc,
329                                   gemm4mh_ukrs,
330                                   NULL,
331                                   NULL,
332                                   NULL,
333                                   NULL,
334                                   NULL, NULL, NULL,
335                                   gemm4mh_cntl_op_bp_ir,
336                                   NULL );
338         // Create control tree object for very large problem via multiple
339         // general problems. (imag x real)
340         gemm4mh_cntl_vl_mm_ir
341         =
342         bli_gemm_cntl_obj_create( BLIS_BLOCKED,
343                                   BLIS_VARIANT2,
344                                   gemm4mh_nc,
345                                   gemm4mh_ukrs,
346                                   NULL,
347                                   NULL,
348                                   NULL,
349                                   NULL,
350                                   NULL, NULL, NULL,
351                                   gemm4mh_cntl_mm_op_ir,
352                                   NULL );
354         //
355         // Create control tree for A.imag * B.imag.
356         //
358         // Create control tree object for outer panel (to block-panel)
359         // problem. (imag x imag)
360         gemm4mh_cntl_op_bp_ii
361         =
362         bli_gemm_cntl_obj_create( BLIS_BLOCKED,
363                                   BLIS_VARIANT1,
364                                   gemm4mh_mc,
365                                   gemm4mh_ukrs,
366                                   NULL,
367                                   gemm4mh_packa_cntl_io,
368                                   gemm4mh_packb_cntl_io,
369                                   NULL,
370                                   NULL, NULL, NULL,
371                                   gemm4mh_cntl_bp_ke,
372                                   NULL );
374         // Create control tree object for general problem via multiple
375         // rank-k (outer panel) updates. (imag x imag)
376         gemm4mh_cntl_mm_op_ii
377         =
378         bli_gemm_cntl_obj_create( BLIS_BLOCKED,
379                                   BLIS_VARIANT3,
380                                   gemm4mh_kc,
381                                   gemm4mh_ukrs,
382                                   NULL,
383                                   NULL,
384                                   NULL,
385                                   NULL,
386                                   NULL, NULL, NULL,
387                                   gemm4mh_cntl_op_bp_ii,
388                                   NULL );
390         // Create control tree object for very large problem via multiple
391         // general problems. (imag x imag)
392         gemm4mh_cntl_vl_mm_ii
393         =
394         bli_gemm_cntl_obj_create( BLIS_BLOCKED,
395                                   BLIS_VARIANT2,
396                                   gemm4mh_nc,
397                                   gemm4mh_ukrs,
398                                   NULL,
399                                   NULL,
400                                   NULL,
401                                   NULL,
402                                   NULL, NULL, NULL,
403                                   gemm4mh_cntl_mm_op_ii,
404                                   NULL );
407         // Alias the "master" gemm control tree to a shorter name.
408         gemm4mh_cntl_rr = gemm4mh_cntl_vl_mm_rr;
409         gemm4mh_cntl_ri = gemm4mh_cntl_vl_mm_ri;
410         gemm4mh_cntl_ir = gemm4mh_cntl_vl_mm_ir;
411         gemm4mh_cntl_ii = gemm4mh_cntl_vl_mm_ii;
413 #else
414         // Create control tree object for lowest-level block-panel kernel.
415         gemm4mh_cntl_bp_ke
416         =
417         bli_gemm_cntl_obj_create( BLIS_UNB_OPT,
418                                   BLIS_VARIANT2,
419                                   NULL,
420                                   gemm4mh_ukrs,
421                                   NULL, NULL, NULL,
422                                   NULL, NULL, NULL );
423         //
424         // Create control tree for A.real * B.real.
425         //
427         // Create control tree object for outer panel (to block-panel)
428         // problem. (real x real)
429         gemm4mh_cntl_op_bp_rr
430         =
431         bli_gemm_cntl_obj_create( BLIS_BLOCKED,
432                                   BLIS_VARIANT1,
433                                   gemm4mh_mc,
434                                   gemm4mh_ukrs,
435                                   NULL,
436                                   gemm4mh_packa_cntl_ro,
437                                   gemm4mh_packb_cntl_ro,
438                                   NULL,
439                                   gemm4mh_cntl_bp_ke,
440                                   NULL );
442         // Create control tree object for general problem via multiple
443         // rank-k (outer panel) updates. (real x real)
444         gemm4mh_cntl_mm_op_rr
445         =
446         bli_gemm_cntl_obj_create( BLIS_BLOCKED,
447                                   BLIS_VARIANT3,
448                                   gemm4mh_kc,
449                                   gemm4mh_ukrs,
450                                   NULL,
451                                   NULL,
452                                   NULL,
453                                   NULL,
454                                   gemm4mh_cntl_op_bp_rr,
455                                   NULL );
457         // Create control tree object for very large problem via multiple
458         // general problems. (real x real)
459         gemm4mh_cntl_vl_mm_rr
460         =
461         bli_gemm_cntl_obj_create( BLIS_BLOCKED,
462                                   BLIS_VARIANT2,
463                                   gemm4mh_nc,
464                                   gemm4mh_ukrs,
465                                   NULL,
466                                   NULL,
467                                   NULL,
468                                   NULL,
469                                   gemm4mh_cntl_mm_op_rr,
470                                   NULL );
472         //
473         // Create control tree for A.real * B.imag.
474         //
476         // Create control tree object for outer panel (to block-panel)
477         // problem. (real x imag)
478         gemm4mh_cntl_op_bp_ri
479         =
480         bli_gemm_cntl_obj_create( BLIS_BLOCKED,
481                                   BLIS_VARIANT1,
482                                   gemm4mh_mc,
483                                   gemm4mh_ukrs,
484                                   NULL,
485                                   gemm4mh_packa_cntl_ro,
486                                   gemm4mh_packb_cntl_io,
487                                   NULL,
488                                   gemm4mh_cntl_bp_ke,
489                                   NULL );
491         // Create control tree object for general problem via multiple
492         // rank-k (outer panel) updates. (real x imag)
493         gemm4mh_cntl_mm_op_ri
494         =
495         bli_gemm_cntl_obj_create( BLIS_BLOCKED,
496                                   BLIS_VARIANT3,
497                                   gemm4mh_kc,
498                                   gemm4mh_ukrs,
499                                   NULL,
500                                   NULL,
501                                   NULL,
502                                   NULL,
503                                   gemm4mh_cntl_op_bp_ri,
504                                   NULL );
506         // Create control tree object for very large problem via multiple
507         // general problems. (real x imag)
508         gemm4mh_cntl_vl_mm_ri
509         =
510         bli_gemm_cntl_obj_create( BLIS_BLOCKED,
511                                   BLIS_VARIANT2,
512                                   gemm4mh_nc,
513                                   gemm4mh_ukrs,
514                                   NULL,
515                                   NULL,
516                                   NULL,
517                                   NULL,
518                                   gemm4mh_cntl_mm_op_ri,
519                                   NULL );
521         //
522         // Create control tree for A.imag * B.real.
523         //
525         // Create control tree object for outer panel (to block-panel)
526         // problem. (imag x real)
527         gemm4mh_cntl_op_bp_ir
528         =
529         bli_gemm_cntl_obj_create( BLIS_BLOCKED,
530                                   BLIS_VARIANT1,
531                                   gemm4mh_mc,
532                                   gemm4mh_ukrs,
533                                   NULL,
534                                   gemm4mh_packa_cntl_io,
535                                   gemm4mh_packb_cntl_ro,
536                                   NULL,
537                                   gemm4mh_cntl_bp_ke,
538                                   NULL );
540         // Create control tree object for general problem via multiple
541         // rank-k (outer panel) updates. (imag x real)
542         gemm4mh_cntl_mm_op_ir
543         =
544         bli_gemm_cntl_obj_create( BLIS_BLOCKED,
545                                   BLIS_VARIANT3,
546                                   gemm4mh_kc,
547                                   gemm4mh_ukrs,
548                                   NULL,
549                                   NULL,
550                                   NULL,
551                                   NULL,
552                                   gemm4mh_cntl_op_bp_ir,
553                                   NULL );
555         // Create control tree object for very large problem via multiple
556         // general problems. (imag x real)
557         gemm4mh_cntl_vl_mm_ir
558         =
559         bli_gemm_cntl_obj_create( BLIS_BLOCKED,
560                                   BLIS_VARIANT2,
561                                   gemm4mh_nc,
562                                   gemm4mh_ukrs,
563                                   NULL,
564                                   NULL,
565                                   NULL,
566                                   NULL,
567                                   gemm4mh_cntl_mm_op_ir,
568                                   NULL );
570         //
571         // Create control tree for A.imag * B.imag.
572         //
574         // Create control tree object for outer panel (to block-panel)
575         // problem. (imag x imag)
576         gemm4mh_cntl_op_bp_ii
577         =
578         bli_gemm_cntl_obj_create( BLIS_BLOCKED,
579                                   BLIS_VARIANT1,
580                                   gemm4mh_mc,
581                                   gemm4mh_ukrs,
582                                   NULL,
583                                   gemm4mh_packa_cntl_io,
584                                   gemm4mh_packb_cntl_io,
585                                   NULL,
586                                   gemm4mh_cntl_bp_ke,
587                                   NULL );
589         // Create control tree object for general problem via multiple
590         // rank-k (outer panel) updates. (imag x imag)
591         gemm4mh_cntl_mm_op_ii
592         =
593         bli_gemm_cntl_obj_create( BLIS_BLOCKED,
594                                   BLIS_VARIANT3,
595                                   gemm4mh_kc,
596                                   gemm4mh_ukrs,
597                                   NULL,
598                                   NULL,
599                                   NULL,
600                                   NULL,
601                                   gemm4mh_cntl_op_bp_ii,
602                                   NULL );
604         // Create control tree object for very large problem via multiple
605         // general problems. (imag x imag)
606         gemm4mh_cntl_vl_mm_ii
607         =
608         bli_gemm_cntl_obj_create( BLIS_BLOCKED,
609                                   BLIS_VARIANT2,
610                                   gemm4mh_nc,
611                                   gemm4mh_ukrs,
612                                   NULL,
613                                   NULL,
614                                   NULL,
615                                   NULL,
616                                   gemm4mh_cntl_mm_op_ii,
617                                   NULL );
620         // Alias the "master" gemm control tree to a shorter name.
621         gemm4mh_cntl_rr = gemm4mh_cntl_vl_mm_rr;
622         gemm4mh_cntl_ri = gemm4mh_cntl_vl_mm_ri;
623         gemm4mh_cntl_ir = gemm4mh_cntl_vl_mm_ir;
624         gemm4mh_cntl_ii = gemm4mh_cntl_vl_mm_ii;
625 #endif
628 void bli_gemm4mh_cntl_finalize()
630         bli_blksz_obj_free( gemm4mh_mc );
631         bli_blksz_obj_free( gemm4mh_nc );
632         bli_blksz_obj_free( gemm4mh_kc );
633         bli_blksz_obj_free( gemm4mh_mr );
634         bli_blksz_obj_free( gemm4mh_nr );
635         bli_blksz_obj_free( gemm4mh_kr );
637         bli_func_obj_free( gemm4mh_ukrs );
639         bli_cntl_obj_free( gemm4mh_packa_cntl_ro );
640         bli_cntl_obj_free( gemm4mh_packb_cntl_ro );
641         bli_cntl_obj_free( gemm4mh_packa_cntl_io );
642         bli_cntl_obj_free( gemm4mh_packb_cntl_io );
644         bli_cntl_obj_free( gemm4mh_cntl_bp_ke );
645         bli_cntl_obj_free( gemm4mh_cntl_op_bp_rr );
646         bli_cntl_obj_free( gemm4mh_cntl_mm_op_rr );
647         bli_cntl_obj_free( gemm4mh_cntl_vl_mm_rr );
648         bli_cntl_obj_free( gemm4mh_cntl_op_bp_ri );
649         bli_cntl_obj_free( gemm4mh_cntl_mm_op_ri );
650         bli_cntl_obj_free( gemm4mh_cntl_vl_mm_ri );
651         bli_cntl_obj_free( gemm4mh_cntl_op_bp_ir );
652         bli_cntl_obj_free( gemm4mh_cntl_mm_op_ir );
653         bli_cntl_obj_free( gemm4mh_cntl_vl_mm_ir );
654         bli_cntl_obj_free( gemm4mh_cntl_op_bp_ii );
655         bli_cntl_obj_free( gemm4mh_cntl_mm_op_ii );
656         bli_cntl_obj_free( gemm4mh_cntl_vl_mm_ii );