========================== Aufgabe: GEMM-Macro-Kernel [TOC] ========================== Bezüglich $M_r$ und $N_r$ wird die $m \times n$ Matrix $C$ partitioniert. Dann entstehen $m_p = \left\lceil \frac{m}{M_r} \right\rceil$ Blockzeilen und $n_p = \left\lceil \frac{n}{N_r} \right\rceil$ Blockspalten: ---- LATEX --------------------------------------------------------------------- C = \left(\begin{array}{c|c|c|c} C_{0,\,0} & C_{0,\,N_r} & \dots & C_{0,\, N_r\cdot (n_p-1)} \\ \hline C_{M_r,\,0} & C_{M_r,\,N_r} & \dots & C_{M_r,\,N_r\cdot (n_p-1)} \\ \hline \vdots & \vdots & & \vdots \\ \hline C_{M_r\cdot (m_p-1),\,0} & C_{M_r\cdot (m_p-1),\,N_r} & \dots & C_{M_r\cdot (m_p-1),\,N_r\cdot (n_p-1)} \\ \end{array}\right) -------------------------------------------------------------------------------- Für $i \in \{0, M_r, \dots, M_r\cdot (m_p-1)\}$ und $j \in \{0, N_r, \dots, N_r\cdot (n_p-1)\}$ ist der Block $C_{i,\,j}$ eine $m_r \times n_r$ Matrix mit ---- LATEX --------------------------------------------------------------------- m_r = \begin{cases} M_r, & i+M_r < m, \\ m - i, & \text{else} \end{cases} \qquad\text{und}\qquad n_r = \begin{cases} N_r, & j+N_r < n, \\ n - j, & \text{else.} \end{cases} -------------------------------------------------------------------------------- Für die GEMM-Operation ---- LATEX --------------------------------------------------------------------- C \leftarrow \beta \, C + \alpha\,A B -------------------------------------------------------------------------------- liegen die Matrizen $A$ und $B$ in einem entsprechend gepackten Format als $\overline{A}$ und $\overline{B}$ vor: - $\overline{A}$ ist ein gepackter $m_c \times k_c$ Block aus $A$. Dieser besteht aus $m_p = \left\lceil \frac{m_c}{M_r} \right\rceil$ horizontalen Paneelen: ---- LATEX ------------------------------------------------------------------- \overline{A} = \left(\begin{array}{c} A_0 \\ \hline A_{M_r} \\ \hline \vdots \\ \hline A_{M_r \cdot (m_p-1)} \end{array}\right) ------------------------------------------------------------------------------ Jede Paneele hat die Dimension $M_r \times k_c$ (Die letzte Paneele wurde beim Packen eventuell mit Nullen auf $M_r$ Zeilen aufgefüllt). - $\overline{B}$ ist ein gepackter $k_c \times n_c$ Block aus $B$. Dieser besteht aus $n_p = \left\lceil \frac{n_c}{N_r} \right\rceil$ vertikalen Paneelen: ---- LATEX ------------------------------------------------------------------- \overline{B} = \left(\begin{array}{c|c|c|c} B_0 & B_{N_r} & \dots & B_{N_r\cdot (n_p-1)} \end{array}\right) ------------------------------------------------------------------------------ Jede Paneele hat die Dimension $k_c \times N_r$ (Die letzte Paneele wurde beim Packen eventuell mit Nullen auf $N_r$ Spalten aufgefüllt). Das Produkt einer Paneele aus $\overline{A}$ mit einer Paneele aus $\overline{B}$ ist somit stets ein Block mit Dimension $M_r \times N_r$ Im Algorithmus ist somit eine Fallunterscheidung notwendig: ---- BOX ----------------------------------------------------------------------- - $\overline{C}$ sei eine lokale $M_r \times N_r$ Matrix - for $i=0, M_r, \dots, M_r\cdot(m_p-1)$ - $m_r = \begin{cases} M_r,& i+M_r < m,\\ m - i,& \text{else} \end{cases}$ - for $j=0, N_r, \dots, N_r\cdot(n_p-1)$ - $n_r = \begin{cases} N_r,& j+N_r < n,\\ n - j,& \text{else} \end{cases}$ - if $m_r = M_r \;\land\; n_r = N_r$ - $C_{i,j} \leftarrow \beta C_{i,j} + \alpha \overline{A}_i \overline{B}_j$ - else - $\overline{C} \leftarrow \alpha \overline{A}_i \overline{B}_j$ - $C_{i,j} \leftarrow \beta C_{i,j} + \overline{C}_{(0:m_r-1)\times(0:n_r-1)}$ -------------------------------------------------------------------------------- Hinweise: - Das Produkt von Paneelen soll natürlich mit dem Micro-Kernel berechnet werden. - Mit $\overline{C}_{(0:m_r-1)\times(0:n_r-1)}$ bezeichnen wir die ersten $m_r$ Zeilen und $n_r$ Spalten von $\overline{C}$. Vorlage ======= Die Vorlage ist wieder unabhängig vom HPC-Projekt. Funktionen wie beispielsweise `dgescal` oder `dgeaxpy` wurden manuell vom HPC-Projekt übernommen. Vervollständigt die Funktion `dgemm_macro`: ---- CODE (type=c) ------------------------------------------------------------- #include #include #include #include #include //-- setup and print matrices -------------------------------------------------- void initGeMatrix(int m, int n, double *A, int incRowA, int incColA) { int i, j; for (i=0; i doc:index back -> doc:session07/page08 next -> doc:session07/page10