]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - dense-linear-algebra-libraries/linalg.git/blob - blis/frame/3/trsm/bli_trsm_cntl.c
TI Linear Algebra Library (LINALG) Rlease 1.0.0
[dense-linear-algebra-libraries/linalg.git] / blis / frame / 3 / trsm / bli_trsm_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"
38 extern scalm_t*   scalm_cntl;
40 extern blksz_t*   gemm_mc;
41 extern blksz_t*   gemm_nc;
42 extern blksz_t*   gemm_kc;
43 extern blksz_t*   gemm_mr;
44 extern blksz_t*   gemm_nr;
45 extern blksz_t*   gemm_kr;
47 #ifdef BLIS_ENABLE_C66X_EDMA
48 #define BLIS_SGEMM_FORTRSM_UKERNEL bli_sgemm_ukernel_4x4
49 #define bli_sGEMM_FORTRSM_UKERNEL BLIS_SGEMM_FORTRSM_UKERNEL
51 #undef  GENTPROT
52 #define GENTPROT( ctype, ch, kername ) \
53 \
54 void PASTEMAC(ch,kername) \
55      ( \
56        dim_t           k, \
57        ctype* restrict alpha, \
58        ctype* restrict a, \
59        ctype* restrict b, \
60        ctype* restrict beta, \
61        ctype* restrict c, inc_t rs_c, inc_t cs_c, \
62        auxinfo_t*      data  \
63      );
65 INSERT_GENTPROT_BASIC( GEMM_FORTRSM_UKERNEL )
67 blksz_t* trsm_mc;
68 blksz_t* trsm_nc;
69 blksz_t* trsm_kc;
70 blksz_t* trsm_mr;
71 blksz_t* trsm_nr;
72 blksz_t* trsm_kr;
74 func_t* gemm_fortrsm_ukrs;
75 #endif
77 extern func_t*    gemm_ukrs;
79 extern gemm_t*    gemm_cntl_bp_ke;
81 func_t*           gemmtrsm_l_ukrs;
82 func_t*           gemmtrsm_u_ukrs;
84 func_t*           trsm_l_ukrs;
85 func_t*           trsm_u_ukrs;
87 packm_t*          trsm_l_packa_cntl;
88 packm_t*          trsm_l_packb_cntl;
90 packm_t*          trsm_r_packa_cntl;
91 packm_t*          trsm_r_packb_cntl;
93 #ifdef BLIS_ENABLE_C66X_EDMA
94 extern dmam_t*    gemm_dmaa_cntl;
95 extern dmam_t*    gemm_dmab_cntl;
96 #endif
98 trsm_t*           trsm_cntl_bp_ke;
100 trsm_t*           trsm_l_cntl_op_bp;
101 trsm_t*           trsm_l_cntl_mm_op;
102 trsm_t*           trsm_l_cntl_vl_mm;
104 trsm_t*           trsm_r_cntl_op_bp;
105 trsm_t*           trsm_r_cntl_mm_op;
106 trsm_t*           trsm_r_cntl_vl_mm;
108 trsm_t*           trsm_l_cntl;
109 trsm_t*           trsm_r_cntl;
112 void bli_trsm_cntl_init()
114 #ifdef BLIS_ENABLE_C66X_EDMA
115         trsm_mc = gemm_mc;
116         trsm_nc = gemm_nc;
117         trsm_kc = gemm_kc;
119         trsm_mr
120         =
121         bli_blksz_obj_create( 4, 4,
122                               BLIS_DEFAULT_MR_D, BLIS_PACKDIM_MR_D,
123                           BLIS_DEFAULT_MR_C, BLIS_PACKDIM_MR_C,
124                           BLIS_DEFAULT_MR_Z, BLIS_PACKDIM_MR_Z );
125         trsm_nr
126         =
127         bli_blksz_obj_create( 4, 4,
128                           BLIS_DEFAULT_NR_D, BLIS_PACKDIM_NR_D,
129                           BLIS_DEFAULT_NR_C, BLIS_PACKDIM_NR_C,
130                           BLIS_DEFAULT_NR_Z, BLIS_PACKDIM_NR_Z );
132         trsm_kr = gemm_kr;
134         // Attach the register blksz_t objects as sub-blocksizes to the cache
135         // blksz_t objects.
136         bli_blksz_obj_attach_to( trsm_mr, trsm_mc );
137         bli_blksz_obj_attach_to( trsm_nr, trsm_nc );
138         bli_blksz_obj_attach_to( trsm_kr, trsm_kc );
142         gemm_fortrsm_ukrs
143                 =
144                 bli_func_obj_create( BLIS_SGEMM_FORTRSM_UKERNEL, BLIS_SGEMM_UKERNEL_PREFERS_CONTIG_ROWS,
145                                      BLIS_DGEMM_UKERNEL, BLIS_DGEMM_UKERNEL_PREFERS_CONTIG_ROWS,
146                                      BLIS_CGEMM_UKERNEL, BLIS_CGEMM_UKERNEL_PREFERS_CONTIG_ROWS,
147                                      BLIS_ZGEMM_UKERNEL, BLIS_ZGEMM_UKERNEL_PREFERS_CONTIG_ROWS );
148 #endif
150         // Create function pointer objects for each datatype-specific
151         // gemmtrsm_l and gemmtrsm_u micro-kernel.
152         gemmtrsm_l_ukrs
153         =
154         bli_func_obj_create( BLIS_SGEMMTRSM_L_UKERNEL, FALSE,
155                              BLIS_DGEMMTRSM_L_UKERNEL, FALSE,
156                              BLIS_CGEMMTRSM_L_UKERNEL, FALSE,
157                              BLIS_ZGEMMTRSM_L_UKERNEL, FALSE );
159         gemmtrsm_u_ukrs
160         =
161         bli_func_obj_create( BLIS_SGEMMTRSM_U_UKERNEL, FALSE,
162                              BLIS_DGEMMTRSM_U_UKERNEL, FALSE,
163                              BLIS_CGEMMTRSM_U_UKERNEL, FALSE,
164                              BLIS_ZGEMMTRSM_U_UKERNEL, FALSE );
167         // Create function pointer objects for each datatype-specific
168         // trsm_l and trsm_u micro-kernel.
169         trsm_l_ukrs
170         =
171         bli_func_obj_create( BLIS_STRSM_L_UKERNEL, FALSE,
172                              BLIS_DTRSM_L_UKERNEL, FALSE,
173                              BLIS_CTRSM_L_UKERNEL, FALSE,
174                              BLIS_ZTRSM_L_UKERNEL, FALSE );
176         trsm_u_ukrs
177         =
178         bli_func_obj_create( BLIS_STRSM_U_UKERNEL, FALSE,
179                              BLIS_DTRSM_U_UKERNEL, FALSE,
180                              BLIS_CTRSM_U_UKERNEL, FALSE,
181                              BLIS_ZTRSM_U_UKERNEL, FALSE );
184         // Create control tree objects for packm operations (left side).
185 #ifdef BLIS_ENABLE_C66X_MEM_POOLS
186         trsm_l_packa_cntl
187         =
188         bli_packm_cntl_obj_create( BLIS_BLOCKED,
189                                    BLIS_VARIANT1,
190                                    // IMPORTANT: n dim multiple must be mr to
191                                    // support right and bottom-right edge cases
192                                    trsm_mr,
193                                    trsm_mr,
194                                    TRUE,  // invert diagonal
195                                    TRUE,  // reverse iteration if upper?
196                                    FALSE, // reverse iteration if lower?
197                                    BLIS_PACKED_ROW_PANELS,
198                                    BLIS_BUFFER_FOR_A_BLOCK_L2 );
200         trsm_l_packb_cntl
201         =
202         bli_packm_cntl_obj_create( BLIS_BLOCKED,
203                                    BLIS_VARIANT1,
204                                    // IMPORTANT: m dim multiple must be mr since
205                                    // B_pack is updated (ie: serves as C) in trsm
206                                    trsm_mr,
207                                    trsm_nr,
208                                    FALSE, // do NOT invert diagonal
209                                    FALSE, // reverse iteration if upper?
210                                    FALSE, // reverse iteration if lower?
211                                    BLIS_PACKED_COL_PANELS,
212                                    BLIS_BUFFER_FOR_B_PANEL_L3 );
214         // Create control tree objects for packm operations (right side).
215         trsm_r_packa_cntl
216         =
217         bli_packm_cntl_obj_create( BLIS_BLOCKED,
218                                    BLIS_VARIANT1,
219                                    trsm_nr,
220                                    trsm_mr,
221                                    FALSE, // do NOT invert diagonal
222                                    FALSE, // reverse iteration if upper?
223                                    FALSE, // reverse iteration if lower?
224                                    BLIS_PACKED_ROW_PANELS,
225                                    BLIS_BUFFER_FOR_A_BLOCK_L2 );
227         trsm_r_packb_cntl
228         =
229         bli_packm_cntl_obj_create( BLIS_BLOCKED,
230                                    BLIS_VARIANT1, // pack panels of B compactly
231                                    trsm_mr,
232                                    trsm_mr,
233                                    TRUE,  // invert diagonal
234                                    FALSE, // reverse iteration if upper?
235                                    TRUE,  // reverse iteration if lower?
236                                    BLIS_PACKED_COL_PANELS,
237                                    BLIS_BUFFER_FOR_B_PANEL_L3 );
238 #else
239         trsm_l_packa_cntl
240         =
241         bli_packm_cntl_obj_create( BLIS_BLOCKED,
242                                    BLIS_VARIANT1,
243                                    // IMPORTANT: n dim multiple must be mr to
244                                    // support right and bottom-right edge cases
245                                    gemm_mr,
246                                    gemm_mr,
247                                    TRUE,  // invert diagonal
248                                    TRUE,  // reverse iteration if upper?
249                                    FALSE, // reverse iteration if lower?
250                                    BLIS_PACKED_ROW_PANELS,
251                                    BLIS_BUFFER_FOR_A_BLOCK );
253         trsm_l_packb_cntl
254         =
255         bli_packm_cntl_obj_create( BLIS_BLOCKED,
256                                    BLIS_VARIANT1,
257                                    // IMPORTANT: m dim multiple must be mr since
258                                    // B_pack is updated (ie: serves as C) in trsm
259                                    gemm_mr,
260                                    gemm_nr,
261                                    FALSE, // do NOT invert diagonal
262                                    FALSE, // reverse iteration if upper?
263                                    FALSE, // reverse iteration if lower?
264                                    BLIS_PACKED_COL_PANELS,
265                                    BLIS_BUFFER_FOR_B_PANEL );
267         // Create control tree objects for packm operations (right side).
268         trsm_r_packa_cntl
269         =
270         bli_packm_cntl_obj_create( BLIS_BLOCKED,
271                                    BLIS_VARIANT1,
272                                    gemm_nr,
273                                    gemm_mr,
274                                    FALSE, // do NOT invert diagonal
275                                    FALSE, // reverse iteration if upper?
276                                    FALSE, // reverse iteration if lower?
277                                    BLIS_PACKED_ROW_PANELS,
278                                    BLIS_BUFFER_FOR_A_BLOCK );
280         trsm_r_packb_cntl
281         =
282         bli_packm_cntl_obj_create( BLIS_BLOCKED,
283                                    BLIS_VARIANT1, // pack panels of B compactly
284                                    gemm_mr,
285                                    gemm_mr,
286                                    TRUE,  // invert diagonal
287                                    FALSE, // reverse iteration if upper?
288                                    TRUE,  // reverse iteration if lower?
289                                    BLIS_PACKED_COL_PANELS,
290                                    BLIS_BUFFER_FOR_B_PANEL );
291 #endif
293 #ifdef BLIS_ENABLE_C66X_EDMA
294         // Create control tree object for lowest-level block-panel kernel.
295         trsm_cntl_bp_ke
296         =
297         bli_trsm_cntl_obj_create( BLIS_UNB_OPT,
298                                   BLIS_VARIANT2,
299                                   NULL,
300                                   gemm_fortrsm_ukrs,
301                                   gemmtrsm_l_ukrs,
302                                   gemmtrsm_u_ukrs,
303                                   NULL, NULL, NULL, NULL,
304                                   NULL, NULL, NULL,
305                                   NULL, NULL, NULL );
307         // Create control tree object for outer panel (to block-panel)
308         // problem (left side).
309         trsm_l_cntl_op_bp
310         =
311         bli_trsm_cntl_obj_create( BLIS_BLOCKED,
312                                   BLIS_VARIANT1,
313                                   trsm_mc,
314                                   gemm_fortrsm_ukrs, NULL, NULL,
315                                   NULL,
316                                   trsm_l_packa_cntl,
317                                   trsm_l_packb_cntl,
318                                   NULL,
319                                   NULL,
320                                   NULL,
321                                   NULL,
322                                   trsm_cntl_bp_ke,
323                                   gemm_cntl_bp_ke,
324                                   NULL );
326         // Create control tree object for general problem via multiple
327         // rank-k (outer panel) updates (left side).
328         trsm_l_cntl_mm_op
329         =
330         bli_trsm_cntl_obj_create( BLIS_BLOCKED,
331                                   BLIS_VARIANT3,
332                                   trsm_kc,
333                                   gemm_fortrsm_ukrs, NULL, NULL,
334                                   NULL,
335                                   NULL,
336                                   NULL,
337                                   NULL,
338                                   NULL,
339                                   NULL,
340                                   NULL,
341                                   trsm_l_cntl_op_bp,
342                                   NULL,
343                                   NULL );
345         // Create control tree object for very large problem via multiple
346         // general problems (left side).
347         trsm_l_cntl_vl_mm
348         =
349         bli_trsm_cntl_obj_create( BLIS_BLOCKED,
350                                   BLIS_VARIANT2,
351                                   trsm_nc,
352                                   gemm_fortrsm_ukrs, NULL, NULL,
353                                   NULL,
354                                   NULL,
355                                   NULL,
356                                   NULL,
357                                   NULL,
358                                   NULL,
359                                   NULL,
360                                   trsm_l_cntl_mm_op,
361                                   NULL,
362                                   NULL );
364         // Create control tree object for outer panel (to block-panel)
365         // problem (right side).
366         trsm_r_cntl_op_bp
367         =
368         bli_trsm_cntl_obj_create( BLIS_BLOCKED,
369                                   BLIS_VARIANT1,
370                                   trsm_mc,
371                                   gemm_fortrsm_ukrs, NULL, NULL,
372                                   NULL,
373                                   trsm_r_packa_cntl,
374                                   NULL, //trsm_r_packb_cntl, //
375                                   NULL,
376                                   gemm_dmaa_cntl, //NULL, //
377                                   NULL,
378                                   NULL,
379                                   trsm_cntl_bp_ke,
380                                   gemm_cntl_bp_ke,
381                                   NULL );
383         // Create control tree object for general problem via multiple
384         // rank-k (outer panel) updates (right side).
385         trsm_r_cntl_mm_op
386         =
387         bli_trsm_cntl_obj_create( BLIS_BLOCKED,
388                                   BLIS_VARIANT3,
389                                   trsm_kc,
390                                   gemm_fortrsm_ukrs, NULL, NULL,
391                                   NULL,
392                                   NULL,
393                                   trsm_r_packb_cntl, //NULL, //
394                                   NULL,
395                                   NULL,
396                                   gemm_dmab_cntl, //NULL, //
397                                   NULL,
398                                   trsm_r_cntl_op_bp,
399                                   NULL,
400                                   NULL );
402         // Create control tree object for very large problem via multiple
403         // general problems (right side).
404         trsm_r_cntl_vl_mm
405         =
406         bli_trsm_cntl_obj_create( BLIS_BLOCKED,
407                                   BLIS_VARIANT2,
408                                   trsm_nc,
409                                   gemm_fortrsm_ukrs, NULL, NULL,
410                                   NULL,
411                                   NULL,
412                                   NULL,
413                                   NULL,
414                                   NULL,
415                                   NULL,
416                                   NULL,
417                                   trsm_r_cntl_mm_op,
418                                   NULL,
419                                   NULL );
421 #else
422         // Create control tree object for lowest-level block-panel kernel.
423         trsm_cntl_bp_ke
424         =
425         bli_trsm_cntl_obj_create( BLIS_UNB_OPT,
426                                   BLIS_VARIANT2,
427                                   NULL,
428                                   gemm_ukrs,
429                                   gemmtrsm_l_ukrs,
430                                   gemmtrsm_u_ukrs,
431                                   NULL, NULL, NULL, NULL,
432                                   NULL, NULL, NULL );
434         // Create control tree object for outer panel (to block-panel)
435         // problem (left side).
436         trsm_l_cntl_op_bp
437         =
438         bli_trsm_cntl_obj_create( BLIS_BLOCKED,
439                                   BLIS_VARIANT1,
440                                   gemm_mc,
441                                   gemm_ukrs, NULL, NULL,
442                                   NULL,
443                                   trsm_l_packa_cntl,
444                                   trsm_l_packb_cntl,
445                                   NULL,
446                                   trsm_cntl_bp_ke,
447                                   gemm_cntl_bp_ke,
448                                   NULL );
450         // Create control tree object for general problem via multiple
451         // rank-k (outer panel) updates (left side).
452         trsm_l_cntl_mm_op
453         =
454         bli_trsm_cntl_obj_create( BLIS_BLOCKED,
455                                   BLIS_VARIANT3,
456                                   gemm_kc,
457                                   gemm_ukrs, NULL, NULL,
458                                   NULL,
459                                   NULL, 
460                                   NULL,
461                                   NULL,
462                                   trsm_l_cntl_op_bp,
463                                   NULL,
464                                   NULL );
466         // Create control tree object for very large problem via multiple
467         // general problems (left side).
468         trsm_l_cntl_vl_mm
469         =
470         bli_trsm_cntl_obj_create( BLIS_BLOCKED,
471                                   BLIS_VARIANT2,
472                                   gemm_nc,
473                                   gemm_ukrs, NULL, NULL,
474                                   NULL,
475                                   NULL,
476                                   NULL,
477                                   NULL,
478                                   trsm_l_cntl_mm_op,
479                                   NULL,
480                                   NULL );
482         // Create control tree object for outer panel (to block-panel)
483         // problem (right side).
484         trsm_r_cntl_op_bp
485         =
486         bli_trsm_cntl_obj_create( BLIS_BLOCKED,
487                                   BLIS_VARIANT1,
488                                   gemm_mc,
489                                   gemm_ukrs, NULL, NULL,
490                                   NULL,
491                                   trsm_r_packa_cntl,
492                                   trsm_r_packb_cntl,
493                                   NULL,
494                                   trsm_cntl_bp_ke,
495                                   gemm_cntl_bp_ke,
496                                   NULL );
498         // Create control tree object for general problem via multiple
499         // rank-k (outer panel) updates (right side).
500         trsm_r_cntl_mm_op
501         =
502         bli_trsm_cntl_obj_create( BLIS_BLOCKED,
503                                   BLIS_VARIANT3,
504                                   gemm_kc,
505                                   gemm_ukrs, NULL, NULL,
506                                   NULL,
507                                   NULL, 
508                                   NULL,
509                                   NULL,
510                                   trsm_r_cntl_op_bp,
511                                   NULL,
512                                   NULL );
514         // Create control tree object for very large problem via multiple
515         // general problems (right side).
516         trsm_r_cntl_vl_mm
517         =
518         bli_trsm_cntl_obj_create( BLIS_BLOCKED,
519                                   BLIS_VARIANT2,
520                                   gemm_nc,
521                                   gemm_ukrs, NULL, NULL,
522                                   NULL,
523                                   NULL,
524                                   NULL,
525                                   NULL,
526                                   trsm_r_cntl_mm_op,
527                                   NULL,
528                                   NULL );
529 #endif
531         // Alias the "master" trsm control trees to shorter names.
532         trsm_l_cntl = trsm_l_cntl_vl_mm;
533         trsm_r_cntl = trsm_r_cntl_vl_mm;
536 void bli_trsm_cntl_finalize()
538 #ifdef BLIS_ENABLE_C66X_EDMA
539         bli_cntl_obj_free(trsm_mr);
540         bli_cntl_obj_free(trsm_nr);
542         bli_cntl_obj_free(gemm_fortrsm_ukrs);
543 #endif
544         bli_func_obj_free( gemmtrsm_l_ukrs );
545         bli_func_obj_free( gemmtrsm_u_ukrs );
546         bli_func_obj_free( trsm_l_ukrs );
547         bli_func_obj_free( trsm_u_ukrs );
549         bli_cntl_obj_free( trsm_l_packa_cntl );
550         bli_cntl_obj_free( trsm_l_packb_cntl );
551         bli_cntl_obj_free( trsm_r_packa_cntl );
552         bli_cntl_obj_free( trsm_r_packb_cntl );
554         bli_cntl_obj_free( trsm_cntl_bp_ke );
556         bli_cntl_obj_free( trsm_l_cntl_op_bp );
557         bli_cntl_obj_free( trsm_l_cntl_mm_op );
558         bli_cntl_obj_free( trsm_l_cntl_vl_mm );
559         bli_cntl_obj_free( trsm_r_cntl_op_bp );
560         bli_cntl_obj_free( trsm_r_cntl_mm_op );
561         bli_cntl_obj_free( trsm_r_cntl_vl_mm );
563 #ifdef BLIS_ENABLE_C66X_EDMA
564 trsm_t* bli_trsm_cntl_obj_create( impl_t     impl_type,
565                                   varnum_t   var_num,
566                                   blksz_t*   b,
567                                   func_t*    gemm_ukrs_,
568                                   func_t*    gemmtrsm_l_ukrs_,
569                                   func_t*    gemmtrsm_u_ukrs_,
570                                   scalm_t*   sub_scalm,
571                                   packm_t*   sub_packm_a,
572                                   packm_t*   sub_packm_b,
573                                   packm_t*   sub_packm_c,
574                                   dmam_t*    sub_dmam_a,
575                                   dmam_t*    sub_dmam_b,
576                                   dmam_t*    sub_dmam_c,
577                                   trsm_t*    sub_trsm,
578                                   gemm_t*    sub_gemm,
579                                   unpackm_t* sub_unpackm_c )
581         trsm_t* cntl;
583         cntl = ( trsm_t* ) bli_malloc( sizeof(trsm_t) );
585         cntl->impl_type       = impl_type;
586         cntl->var_num         = var_num;
587         cntl->b               = b;
588         cntl->gemm_ukrs       = gemm_ukrs_;
589         cntl->gemmtrsm_l_ukrs = gemmtrsm_l_ukrs_;
590         cntl->gemmtrsm_u_ukrs = gemmtrsm_u_ukrs_;
591         cntl->sub_scalm       = sub_scalm;
592         cntl->sub_packm_a     = sub_packm_a;
593         cntl->sub_packm_b     = sub_packm_b;
594         cntl->sub_packm_c     = sub_packm_c;
595         cntl->sub_dmam_a          = sub_dmam_a;
596         cntl->sub_dmam_b          = sub_dmam_b;
597         cntl->sub_dmam_c          = sub_dmam_c;
598         cntl->sub_trsm        = sub_trsm;
599         cntl->sub_gemm        = sub_gemm;
600         cntl->sub_unpackm_c   = sub_unpackm_c;
602         return cntl;
605 #else
606 trsm_t* bli_trsm_cntl_obj_create( impl_t     impl_type,
607                                   varnum_t   var_num,
608                                   blksz_t*   b,
609                                   func_t*    gemm_ukrs_,
610                                   func_t*    gemmtrsm_l_ukrs_,
611                                   func_t*    gemmtrsm_u_ukrs_,
612                                   scalm_t*   sub_scalm,
613                                   packm_t*   sub_packm_a,
614                                   packm_t*   sub_packm_b,
615                                   packm_t*   sub_packm_c,
616                                   trsm_t*    sub_trsm,
617                                   gemm_t*    sub_gemm,
618                                   unpackm_t* sub_unpackm_c )
620         trsm_t* cntl;
622         cntl = ( trsm_t* ) bli_malloc( sizeof(trsm_t) );
624         cntl->impl_type       = impl_type;
625         cntl->var_num         = var_num;
626         cntl->b               = b;
627         cntl->gemm_ukrs       = gemm_ukrs_;
628         cntl->gemmtrsm_l_ukrs = gemmtrsm_l_ukrs_;
629         cntl->gemmtrsm_u_ukrs = gemmtrsm_u_ukrs_;
630         cntl->sub_scalm       = sub_scalm;
631         cntl->sub_packm_a     = sub_packm_a;
632         cntl->sub_packm_b     = sub_packm_b;
633         cntl->sub_packm_c     = sub_packm_c;
634         cntl->sub_trsm        = sub_trsm;
635         cntl->sub_gemm        = sub_gemm;
636         cntl->sub_unpackm_c   = sub_unpackm_c;
638         return cntl;
640 #endif