\hypertarget{kdgemm_8c}{}\section{src/kdgemm.c File Reference}
\label{kdgemm_8c}\index{src/kdgemm.\+c@{src/kdgemm.\+c}}


L\+A\+Ss-\/\+D\+D\+Ss kdgemm routine.  


{\ttfamily \#include \char`\"{}../include/lass.\+h\char`\"{}}\\*
Include dependency graph for kdgemm.\+c\+:
\nopagebreak
\begin{figure}[H]
\begin{center}
\leavevmode
\includegraphics[width=350pt]{kdgemm_8c__incl}
\end{center}
\end{figure}
\subsection*{Functions}
\begin{DoxyCompactItemize}
\item 
enum L\+A\+S\+S\+\_\+\+R\+E\+T\+U\+RN \hyperlink{kdgemm_8c_a1b27a37a58ea181d1e5f7eb91c6e0b58}{kdgemm} (enum D\+D\+S\+S\+\_\+\+T\+R\+A\+NS T\+R\+A\+N\+S\+\_\+A, enum D\+D\+S\+S\+\_\+\+T\+R\+A\+NS T\+R\+A\+N\+S\+\_\+B, int M, int N, int K, const double A\+L\+P\+HA, double $\ast$A, int L\+DA, double $\ast$B, int L\+DB, const double B\+E\+TA, double $\ast$C, int L\+DC)
\end{DoxyCompactItemize}


\subsection{Detailed Description}
L\+A\+Ss-\/\+D\+D\+Ss kdgemm routine. 

L\+A\+Ss-\/\+D\+D\+Ss is a software package provided by\+: Barcelona Supercomputing Center -\/ Centro Nacional de Supercomputacion

\begin{DoxyAuthor}{Author}
Pedro Valero-\/\+Lara \href{mailto:pedro.valero@bsc.es}{\tt pedro.\+valero@bsc.\+es} 
\end{DoxyAuthor}
\begin{DoxyDate}{Date}
2017-\/01-\/05   
\end{DoxyDate}


\subsection{Function Documentation}
\index{kdgemm.\+c@{kdgemm.\+c}!kdgemm@{kdgemm}}
\index{kdgemm@{kdgemm}!kdgemm.\+c@{kdgemm.\+c}}
\subsubsection[{\texorpdfstring{kdgemm(enum D\+D\+S\+S\+\_\+\+T\+R\+A\+N\+S T\+R\+A\+N\+S\+\_\+\+A, enum D\+D\+S\+S\+\_\+\+T\+R\+A\+N\+S T\+R\+A\+N\+S\+\_\+\+B, int M, int N, int K, const double A\+L\+P\+H\+A, double $\ast$\+A, int L\+D\+A, double $\ast$\+B, int L\+D\+B, const double B\+E\+T\+A, double $\ast$\+C, int L\+D\+C)}{kdgemm(enum DDSS_TRANS TRANS_A, enum DDSS_TRANS TRANS_B, int M, int N, int K, const double ALPHA, double *A, int LDA, double *B, int LDB, const double BETA, double *C, int LDC)}}]{\setlength{\rightskip}{0pt plus 5cm}enum L\+A\+S\+S\+\_\+\+R\+E\+T\+U\+RN kdgemm (
\begin{DoxyParamCaption}
\item[{enum D\+D\+S\+S\+\_\+\+T\+R\+A\+NS}]{T\+R\+A\+N\+S\+\_\+A, }
\item[{enum D\+D\+S\+S\+\_\+\+T\+R\+A\+NS}]{T\+R\+A\+N\+S\+\_\+B, }
\item[{int}]{M, }
\item[{int}]{N, }
\item[{int}]{K, }
\item[{const double}]{A\+L\+P\+HA, }
\item[{double $\ast$}]{A, }
\item[{int}]{L\+DA, }
\item[{double $\ast$}]{B, }
\item[{int}]{L\+DB, }
\item[{const double}]{B\+E\+TA, }
\item[{double $\ast$}]{C, }
\item[{int}]{L\+DC}
\end{DoxyParamCaption}
)}\hypertarget{kdgemm_8c_a1b27a37a58ea181d1e5f7eb91c6e0b58}{}\label{kdgemm_8c_a1b27a37a58ea181d1e5f7eb91c6e0b58}
Performs the matrix-\/matrix operation\+: \begin{DoxyVerb}C = ALPHA * op( A ) * op( B ) + BETA * C
\end{DoxyVerb}


where op( X ) is one of\+: \begin{DoxyVerb}op( X ) = X      or
op( X ) = X**T 
\end{DoxyVerb}


A\+L\+P\+HA and B\+E\+TA are scalars, and A, B and C are matrices, with op( A ) an M by K matrix, op( B ) a K by N matrix and C an M by N matrix.


\begin{DoxyParams}[1]{Parameters}
\mbox{\tt in}  & {\em T\+R\+A\+N\+S\+\_\+A} & enum D\+D\+S\+S\+\_\+\+T\+R\+A\+NS. T\+R\+A\+N\+S\+\_\+A specifies the form of op( A ) to be used in the matrix multiplication as follows\+:
\begin{DoxyItemize}
\item No\+Trans\+: op( A ) = A.
\item Trans\+: op( A ) = A$\ast$$\ast$T.
\end{DoxyItemize}\\
\hline
\mbox{\tt in}  & {\em T\+R\+A\+N\+S\+\_\+B} & enum D\+D\+S\+S\+\_\+\+T\+R\+A\+NS. T\+R\+A\+N\+S\+\_\+B specifies the form of op( B ) to be used in the matrix multiplication as follows\+:
\begin{DoxyItemize}
\item No\+Trans\+: op( B ) = B.
\item Trans\+: op( B ) = B$\ast$$\ast$T.
\end{DoxyItemize}\\
\hline
\mbox{\tt in}  & {\em M} & int. M specifies the number of rows of the matrix A and of the matrix C. M must be greater than zero.\\
\hline
\mbox{\tt in}  & {\em N} & int. N specifies the number of columns of the matrix B and the number of columns of the matrix C. N must be greater than zero.\\
\hline
\mbox{\tt in}  & {\em K} & int. K specifies the number of columns of the matrix A and the number of rows of the matrix B. K must be greater than zero.\\
\hline
\mbox{\tt in}  & {\em A\+L\+P\+HA} & double.\\
\hline
\mbox{\tt in}  & {\em A} & double $\ast$. A is a pointer to a matrix of dimension Ma ( rows ) by Ka ( columns ), where Ma is M and Ka is K when T\+R\+A\+N\+S\+\_\+A = No\+Trans, and Ma is K and Ka is M otherwise.\\
\hline
\mbox{\tt in}  & {\em L\+DA} & int. L\+DA specifies the number of columns of A ( row-\/major order ). When T\+R\+A\+N\+S\+\_\+A = No\+Trans then L\+DA must be at least max( 1, K ), otherwise L\+DA must be at least max( 1, M ).\\
\hline
\mbox{\tt in}  & {\em B} & double $\ast$. B is a pointer to a matrix of dimension Kb ( rows ) by Nb ( columns ), where Kb is K and Nb is N when T\+R\+A\+N\+S\+\_\+B = No\+Trans, and Kb is N and Nb is K otherwise.\\
\hline
\mbox{\tt in}  & {\em L\+DB} & int. L\+DB specifies the number of columns of B ( row-\/major order ). When T\+R\+A\+N\+S\+\_\+B = No\+Trans then L\+DB must be at least max( 1, N ), otherwise L\+DB must be at least max( 1, K ).\\
\hline
\mbox{\tt in}  & {\em B\+E\+TA} & double.\\
\hline
\mbox{\tt in,out}  & {\em C} & double $\ast$. C is a pointer to a matrix of dimension L\+DC by N. On exit, C is overwritten by the M by N matrix ( A\+L\+P\+H\+A$\ast$op( A )$\ast$op( B ) + B\+E\+T\+A$\ast$C ).\\
\hline
\mbox{\tt in}  & {\em L\+DC} & int. L\+DC specifies the number of columns of C ( row-\/major order). L\+DC must be at least max( 1, M )\\
\hline
\end{DoxyParams}

\begin{DoxyRetVals}{Return values}
{\em Success} & sucessful exit \\
\hline
{\em No\+Success} & unsucessful exit\\
\hline
\end{DoxyRetVals}
\begin{DoxySeeAlso}{See also}
\hyperlink{lass_8h_a05b6048b892d062d5656ff6e2f57fed9}{ddss\+\_\+dgemm} 

ddss\+\_\+tile 

ddss\+\_\+flat2tiled 

ddss\+\_\+tiled2flat 
\end{DoxySeeAlso}


Definition at line 131 of file kdgemm.\+c.



References ddss\+\_\+dflat2tiled(), ddss\+\_\+dtiled2flat(), and ddss\+\_\+tile\+\_\+size().



Referenced by ddss\+\_\+dgemm().


\begin{DoxyCode}
136 \{
137 
138     \textcolor{comment}{// Local variables}
139     \textcolor{keywordtype}{int} mt, kt, nt;
140     \textcolor{keywordtype}{int} mi, ki, ni;
141     \textcolor{keywordtype}{int} Am, An;
142     \textcolor{keywordtype}{int} Bm, Bn;
143     \textcolor{keywordtype}{int} tile\_size\_m;
144     \textcolor{keywordtype}{int} tile\_size\_n;
145     \textcolor{keywordtype}{int} tile\_size\_k;
146     \textcolor{keywordtype}{int} k\_check;
147     \textcolor{keywordtype}{double} betat;
148 
149     \textcolor{comment}{// Number of tiles}
150     \textcolor{keywordflow}{if} ( M % TILE\_SIZE == 0 )
151     \{
152         mt = M / TILE\_SIZE;
153     \}
154     \textcolor{keywordflow}{else}
155     \{
156         mt = ( M / TILE\_SIZE ) + 1;
157     \}
158 
159     \textcolor{keywordflow}{if} ( K % TILE\_SIZE == 0 )
160     \{
161         kt = K / TILE\_SIZE;
162     \}
163     \textcolor{keywordflow}{else}
164     \{
165         kt = ( K / TILE\_SIZE ) + 1;
166     \}
167 
168     \textcolor{keywordflow}{if} ( N % TILE\_SIZE == 0 )
169     \{
170         nt = N / TILE\_SIZE;
171     \}
172     \textcolor{keywordflow}{else}
173     \{
174         nt = ( N / TILE\_SIZE ) + 1;
175     \}
176     
177     \textcolor{comment}{/****************************}
178 \textcolor{comment}{    --Tile matrices declaration--}
179 \textcolor{comment}{    ****************************/}
180 
181     \textcolor{keywordflow}{if} ( TRANS\_A == NoTrans )
182     \{
183         Am = mt;
184         An = kt;
185     \}
186     \textcolor{keywordflow}{else}
187     \{
188         Am = kt;
189         An = mt;
190     \}
191         
192     \textcolor{keywordflow}{if} ( TRANS\_B == NoTrans )
193     \{
194         Bm = kt;
195         Bn = nt;
196     \}
197     \textcolor{keywordflow}{else}
198     \{
199         Bm = nt;
200         Bn = kt;
201     \}
202 
203     \textcolor{comment}{/***************************}
204 \textcolor{comment}{    --Tile matrices allocation--}
205 \textcolor{comment}{    ***************************/}
206     
207     double (*TILE\_A)[An][TILE\_SIZE * TILE\_SIZE] = malloc ( Am * An * 
208         TILE\_SIZE * TILE\_SIZE * \textcolor{keyword}{sizeof}( \textcolor{keywordtype}{double} ) );
209 
210     \textcolor{keywordflow}{if} ( TILE\_A == NULL)
211     \{
212         fprintf( stderr, \textcolor{stringliteral}{"Failure in kdgemm for matrix TILE\_A\(\backslash\)n"} );
213         \textcolor{keywordflow}{return} NoSuccess;
214     \}
215 
216     double (*TILE\_B)[Bn][TILE\_SIZE * TILE\_SIZE] = malloc ( Bm * Bn * 
217         TILE\_SIZE * TILE\_SIZE * \textcolor{keyword}{sizeof}( \textcolor{keywordtype}{double} ) );
218     
219     \textcolor{keywordflow}{if} ( TILE\_B == NULL)
220     \{
221         fprintf( stderr, \textcolor{stringliteral}{"Failure in kdgemm for matrix TILE\_B\(\backslash\)n"} );
222         \textcolor{keywordflow}{return} NoSuccess;
223     \}
224 
225     double (*TILE\_C)[nt][TILE\_SIZE * TILE\_SIZE] = malloc ( mt * nt * 
226         TILE\_SIZE * TILE\_SIZE * \textcolor{keyword}{sizeof}( \textcolor{keywordtype}{double} ) );
227 
228     \textcolor{keywordflow}{if} ( TILE\_C == NULL)
229     \{
230         fprintf( stderr, \textcolor{stringliteral}{"Failure in kdgemm for matrix TILE\_C\(\backslash\)n"} );
231         \textcolor{keywordflow}{return} NoSuccess;
232     \}
233 
234     \textcolor{comment}{/*********************************************}
235 \textcolor{comment}{    --From flat data layout to tiled data layout--  }
236 \textcolor{comment}{    *********************************************/}
237 
238     \textcolor{comment}{// From flat matrix A to tile matrix TILE\_A}
239     \textcolor{keywordflow}{if} ( TRANS\_A == NoTrans )
240     \{
241         \hyperlink{ddss__flat2tiled_8c_ab411e9b05a203c7905f0285ef4200a9e}{ddss\_dflat2tiled}( M, K, A, LDA, mt, kt, TILE\_A );
242     \}
243     \textcolor{keywordflow}{else}
244     \{
245         \hyperlink{ddss__flat2tiled_8c_ab411e9b05a203c7905f0285ef4200a9e}{ddss\_dflat2tiled}( K, M, A, LDA, kt, mt, TILE\_A );
246     \}
247 
248     \textcolor{comment}{// From flat matrix B to tile matrix TILE\_B }
249     \textcolor{keywordflow}{if} ( TRANS\_B == NoTrans )
250     \{
251         \hyperlink{ddss__flat2tiled_8c_ab411e9b05a203c7905f0285ef4200a9e}{ddss\_dflat2tiled}( K, N, B, LDB, kt, nt, TILE\_B );
252     \}
253     \textcolor{keywordflow}{else}
254     \{
255         \hyperlink{ddss__flat2tiled_8c_ab411e9b05a203c7905f0285ef4200a9e}{ddss\_dflat2tiled}( N, K, B, LDB, nt, kt, TILE\_B );
256     \}
257     
258     \textcolor{comment}{// From flat matrix C to tile matrix TILE\_C }
259     \hyperlink{ddss__flat2tiled_8c_ab411e9b05a203c7905f0285ef4200a9e}{ddss\_dflat2tiled}( M, N, C, LDC, mt, nt, TILE\_C );
260 
261     \textcolor{comment}{/*************}
262 \textcolor{comment}{    --DGEMM tile--}
263 \textcolor{comment}{    *************/}  
264     
265     \textcolor{keywordflow}{for} ( mi = 0; mi < mt; mi++ )
266     \{
267         tile\_size\_m = \hyperlink{ddss__tile_8c_a931442adba78807015ff9a076fb2ae49}{ddss\_tile\_size}( M, mi );
268         \textcolor{keywordflow}{for} ( ni = 0; ni < nt; ni++ )
269         \{
270             tile\_size\_n = \hyperlink{ddss__tile_8c_a931442adba78807015ff9a076fb2ae49}{ddss\_tile\_size}( N, ni );
271             \textcolor{keywordflow}{if} ( TRANS\_A == NoTrans )
272             \{
273                 k\_check = K;
274             \}
275             \textcolor{keywordflow}{else}
276             \{
277                 k\_check = M;
278             \}
279             \textcolor{comment}{// --Scale on C ( C = BETA * C )--  }
280             \textcolor{keywordflow}{if} ( ( ALPHA == 0.0 ) || ( k\_check == 0 ) )
281             \{
282 \textcolor{preprocessor}{                #pragma oss task inout( TILE\_C[mi][ni] ) \(\backslash\)}
283 \textcolor{preprocessor}{                    shared( TILE\_A, TILE\_B, TILE\_C ) \(\backslash\)}
284 \textcolor{preprocessor}{                    firstprivate( mi, ni ) \(\backslash\)}
285 \textcolor{preprocessor}{                    no\_copy\_deps}
286                 cblas\_dgemm( CblasRowMajor, 
287                             ( CBLAS\_TRANSPOSE ) TRANS\_A,
288                             ( CBLAS\_TRANSPOSE ) TRANS\_B,
289                             tile\_size\_m, 
290                             tile\_size\_n, 
291                                       0,
292                             ALPHA,   TILE\_A[0][0], 1, 
293                                      TILE\_B[0][0], 1, 
294                              BETA, TILE\_C[mi][ni], tile\_size\_n );
295             \}
296             \textcolor{keywordflow}{else} \textcolor{keywordflow}{if} ( TRANS\_A == NoTrans )
297             \{
298                 \textcolor{comment}{// --TRANS\_A = NoTrans & TRANS\_B = NoTrans--    }
299                 \textcolor{keywordflow}{if} ( TRANS\_B == NoTrans )
300                 \{
301                     \textcolor{keywordflow}{for} ( ki = 0; ki < kt; ki++ )
302                     \{
303                         tile\_size\_k = \hyperlink{ddss__tile_8c_a931442adba78807015ff9a076fb2ae49}{ddss\_tile\_size}( K, ki );
304                         \textcolor{keywordflow}{if} (ki == 0)
305                         \{
306                             betat = BETA;
307                         \}
308                         \textcolor{keywordflow}{else} 
309                         \{
310                             betat = 1.0;
311                         \}  
312                         
313 \textcolor{preprocessor}{                        #pragma oss task in( TILE\_A[mi][ki] ) \(\backslash\)}
314 \textcolor{preprocessor}{                            in( TILE\_B[ki][ni] ) \(\backslash\)}
315 \textcolor{preprocessor}{                            inout( TILE\_C[mi][ni] ) \(\backslash\)}
316 \textcolor{preprocessor}{                            shared( TILE\_A, TILE\_B, TILE\_C ) \(\backslash\)}
317 \textcolor{preprocessor}{                            firstprivate( mi, ni, ki, betat ) \(\backslash\)}
318 \textcolor{preprocessor}{                            no\_copy\_deps}
319                         cblas\_dgemm( CblasRowMajor, 
320                                     ( CBLAS\_TRANSPOSE ) TRANS\_A,
321                                     ( CBLAS\_TRANSPOSE ) TRANS\_B,
322                                     tile\_size\_m, 
323                                     tile\_size\_n, 
324                                     tile\_size\_k,
325                                     ALPHA, TILE\_A[mi][ki], tile\_size\_k,
326                                            TILE\_B[ki][ni], tile\_size\_n,
327                                     betat, TILE\_C[mi][ni], tile\_size\_n );
328                     \}
329                 \}
330                 \textcolor{comment}{// --TRANS\_A = NoTrans & TRANS\_B = Trans--  }
331                 \textcolor{keywordflow}{else}
332                 \{
333                     \textcolor{keywordflow}{for} ( ki = 0; ki < kt; ki++ )
334                     \{
335                         tile\_size\_k = \hyperlink{ddss__tile_8c_a931442adba78807015ff9a076fb2ae49}{ddss\_tile\_size}( K, ki );
336                         \textcolor{keywordflow}{if} (ki == 0)
337                         \{
338                             betat = BETA;
339                         \}
340                         \textcolor{keywordflow}{else} 
341                         \{
342                             betat = 1.0;
343                         \}  
344                             
345 \textcolor{preprocessor}{                        #pragma oss task in( TILE\_A[mi][ki] ) \(\backslash\)}
346 \textcolor{preprocessor}{                            in( TILE\_B[ni][ki] ) \(\backslash\)}
347 \textcolor{preprocessor}{                            inout( TILE\_C[mi][ni] ) \(\backslash\)}
348 \textcolor{preprocessor}{                            shared( TILE\_A, TILE\_B, TILE\_C ) \(\backslash\)}
349 \textcolor{preprocessor}{                            firstprivate( mi, ni, ki, betat )}
350                         cblas\_dgemm( CblasRowMajor, 
351                                     ( CBLAS\_TRANSPOSE ) TRANS\_A,
352                                     ( CBLAS\_TRANSPOSE ) TRANS\_B,
353                                     tile\_size\_m, 
354                                     tile\_size\_n, 
355                                     tile\_size\_k,
356                                     ALPHA,  TILE\_A[mi][ki], tile\_size\_k,
357                                             TILE\_B[ni][ki], tile\_size\_k,
358                                     betat,  TILE\_C[mi][ni], tile\_size\_n );
359                     \}
360                 \}
361             \}
362             \textcolor{keywordflow}{else}
363             \{
364                 \textcolor{comment}{// --TRANS\_A = Trans & TRANS\_B = NoTrans--  }
365                 \textcolor{keywordflow}{if} ( TRANS\_B == NoTrans )
366                 \{
367                     \textcolor{keywordflow}{for} ( ki = 0; ki < kt; ki++ )
368                     \{
369                         tile\_size\_k = \hyperlink{ddss__tile_8c_a931442adba78807015ff9a076fb2ae49}{ddss\_tile\_size}( K, ki );
370                         \textcolor{keywordflow}{if} (ki == 0)
371                         \{
372                             betat = BETA;
373                         \}
374                         \textcolor{keywordflow}{else} 
375                         \{
376                             betat = 1.0;
377                         \}  
378 
379 \textcolor{preprocessor}{                        #pragma oss task in( TILE\_A[ki][mi] ) \(\backslash\)}
380 \textcolor{preprocessor}{                            in( TILE\_B[ki][ni] ) \(\backslash\)}
381 \textcolor{preprocessor}{                            inout( TILE\_C[mi][ni] ) \(\backslash\)}
382 \textcolor{preprocessor}{                            shared( TILE\_A, TILE\_B, TILE\_C ) \(\backslash\)}
383 \textcolor{preprocessor}{                            firstprivate( mi, ni, ki, betat )}
384                         cblas\_dgemm( CblasRowMajor, 
385                                     ( CBLAS\_TRANSPOSE ) TRANS\_A,
386                                     ( CBLAS\_TRANSPOSE ) TRANS\_B,
387                                     tile\_size\_m, 
388                                     tile\_size\_n, 
389                                     tile\_size\_k,
390                                     ALPHA,  TILE\_A[ki][mi], tile\_size\_m,
391                                             TILE\_B[ki][ni], tile\_size\_n,
392                                     betat,  TILE\_C[mi][ni], tile\_size\_n );
393                     \}
394                 \}   
395                 \textcolor{comment}{// --TRANS\_A = Trans & TRANS\_B = Trans--    }
396                 \textcolor{keywordflow}{else}
397                 \{
398                     \textcolor{keywordflow}{for} ( ki = 0; ki < kt; ki++ )
399                     \{
400                         tile\_size\_k = \hyperlink{ddss__tile_8c_a931442adba78807015ff9a076fb2ae49}{ddss\_tile\_size}( K, ki );
401                         \textcolor{keywordflow}{if} (ki == 0)
402                         \{
403                             betat = BETA;
404                         \}
405                         \textcolor{keywordflow}{else} 
406                         \{
407                             betat = 1.0;
408                         \}  
409                         
410 \textcolor{preprocessor}{                        #pragma oss task in( TILE\_A[ki][mi] ) \(\backslash\)}
411 \textcolor{preprocessor}{                            in( TILE\_B[ni][ki] ) \(\backslash\)}
412 \textcolor{preprocessor}{                            inout( TILE\_C[mi][ni] ) \(\backslash\)}
413 \textcolor{preprocessor}{                            shared( TILE\_A, TILE\_B, TILE\_C ) \(\backslash\)}
414 \textcolor{preprocessor}{                            firstprivate( mi, ni, ki, betat )}
415                         cblas\_dgemm( CblasRowMajor, 
416                                     ( CBLAS\_TRANSPOSE ) TRANS\_A,
417                                     ( CBLAS\_TRANSPOSE ) TRANS\_B,
418                                     tile\_size\_m, 
419                                     tile\_size\_n, 
420                                     tile\_size\_k,
421                                     ALPHA,  TILE\_A[ki][mi], tile\_size\_m,
422                                             TILE\_B[ni][ki], tile\_size\_k,
423                                     betat,  TILE\_C[mi][ni], tile\_size\_n );
424                     \}
425                 \}
426             \}
427         \}
428     \}
429     
430     \textcolor{comment}{/************************************************}
431 \textcolor{comment}{    // --From tiled data layout to flat data layout--   }
432 \textcolor{comment}{    ************************************************/}
433     
434     \textcolor{comment}{// From tile matrix TILE\_C to flat matrix C }
435     \hyperlink{ddss__tiled2flat_8c_aeeb6b69c6b4db8333c660ef6824cdf6a}{ddss\_dtiled2flat}( M, N, C, LDC, mt, nt, TILE\_C );
436 
437     \textcolor{comment}{// --Tile matrices free--}
438     free( TILE\_A );
439     free( TILE\_B );
440     free( TILE\_C );
441 
442     \textcolor{keywordflow}{return} Success;
443 
444 \}
\end{DoxyCode}
