Sophie

Sophie

distrib > Fedora > 15 > i386 > by-pkgid > 925d05e241dbe3b9ea38e50d2b88728b > files > 93

m4ri-devel-20100817-1.fc15.i686.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>M4RI: strassen.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.4 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">M4RI&#160;<span id="projectnumber">1.0.1</span></div>
  </td>
 </tr>
 </tbody>
</table>
</div>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
      <li><a href="examples.html"><span>Examples</span></a></li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
      <li><a href="globals.html"><span>Globals</span></a></li>
    </ul>
  </div>
</div>
<div class="header">
  <div class="summary">
<a href="#define-members">Defines</a> &#124;
<a href="#func-members">Functions</a>  </div>
  <div class="headertitle">
<div class="title">strassen.h File Reference</div>  </div>
</div>
<div class="contents">

<p>Matrix operations using Strassen's formulas including Winograd's improvements.  
<a href="#details">More...</a></p>
<div class="textblock"><code>#include &lt;math.h&gt;</code><br/>
<code>#include &quot;<a class="el" href="misc_8h_source.html">misc.h</a>&quot;</code><br/>
<code>#include &quot;<a class="el" href="packedmatrix_8h_source.html">packedmatrix.h</a>&quot;</code><br/>
<code>#include &quot;<a class="el" href="brilliantrussian_8h_source.html">brilliantrussian.h</a>&quot;</code><br/>
</div>
<p><a href="strassen_8h_source.html">Go to the source code of this file.</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="define-members"></a>
Defines</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="strassen_8h.html#a2926fb2fc8b3f161f87770545eb9fd4c">STRASSEN_MUL_CUTOFF</a>&#160;&#160;&#160;MIN(((int)sqrt((double)(4*CPU_L2_CACHE))),4096)</td></tr>
<tr><td colspan="2"><h2><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="strassen_8h.html#ab6e411c4b2a86239e811685aa3594ace">mzd_mul</a> (<a class="el" href="structmzd__t.html">mzd_t</a> *C, <a class="el" href="structmzd__t.html">mzd_t</a> *A, <a class="el" href="structmzd__t.html">mzd_t</a> *B, int cutoff)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Matrix multiplication via the Strassen-Winograd matrix multiplication algorithm, i.e. compute C = AB.  <a href="#ab6e411c4b2a86239e811685aa3594ace"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="strassen_8h.html#a0f8b21c7722145a4be1b1d0a3eba46cc">mzd_addmul</a> (<a class="el" href="structmzd__t.html">mzd_t</a> *C, <a class="el" href="structmzd__t.html">mzd_t</a> *A, <a class="el" href="structmzd__t.html">mzd_t</a> *B, int cutoff)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Matrix multiplication and in-place addition via the Strassen-Winograd matrix multiplication algorithm, i.e. compute C = C+ AB.  <a href="#a0f8b21c7722145a4be1b1d0a3eba46cc"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="strassen_8h.html#aa9fbe38447fa2292a5d64ca373df4ff9">_mzd_mul_even</a> (<a class="el" href="structmzd__t.html">mzd_t</a> *C, <a class="el" href="structmzd__t.html">mzd_t</a> *A, <a class="el" href="structmzd__t.html">mzd_t</a> *B, int cutoff)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Matrix multiplication via the Strassen-Winograd matrix multiplication algorithm, i.e. compute C = AB.  <a href="#aa9fbe38447fa2292a5d64ca373df4ff9"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="strassen_8h.html#addf66f100dd926ec453d68a84a954044">_mzd_addmul_even</a> (<a class="el" href="structmzd__t.html">mzd_t</a> *C, <a class="el" href="structmzd__t.html">mzd_t</a> *A, <a class="el" href="structmzd__t.html">mzd_t</a> *B, int cutoff)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Matrix multiplication and in-place addition via the Strassen-Winograd matrix multiplication algorithm, i.e. compute C = C+ AB.  <a href="#addf66f100dd926ec453d68a84a954044"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="strassen_8h.html#ad3fd8edd1387b4a1c215a810eeecfb94">_mzd_addmul</a> (<a class="el" href="structmzd__t.html">mzd_t</a> *C, <a class="el" href="structmzd__t.html">mzd_t</a> *A, <a class="el" href="structmzd__t.html">mzd_t</a> *B, int cutoff)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Matrix multiplication and in-place addition via the Strassen-Winograd matrix multiplication algorithm, i.e. compute C = C + AB.  <a href="#ad3fd8edd1387b4a1c215a810eeecfb94"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="strassen_8h.html#a3fbe9641e2ddb5c2d40b330de5745939">_mzd_addmul_weird_weird</a> (<a class="el" href="structmzd__t.html">mzd_t</a> *C, <a class="el" href="structmzd__t.html">mzd_t</a> *A, <a class="el" href="structmzd__t.html">mzd_t</a> *B, int cutoff)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="strassen_8h.html#aeefed0956e8a7fbac589ce6ebb43e508">_mzd_addmul_weird_even</a> (<a class="el" href="structmzd__t.html">mzd_t</a> *C, <a class="el" href="structmzd__t.html">mzd_t</a> *A, <a class="el" href="structmzd__t.html">mzd_t</a> *B, int cutoff)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="strassen_8h.html#a2e71dcd2c9fab6c192cc8c701d4c61b9">_mzd_addmul_even_weird</a> (<a class="el" href="structmzd__t.html">mzd_t</a> *C, <a class="el" href="structmzd__t.html">mzd_t</a> *A, <a class="el" href="structmzd__t.html">mzd_t</a> *B, int cutoff)</td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>Matrix operations using Strassen's formulas including Winograd's improvements. </p>
<dl class="author"><dt><b>Author:</b></dt><dd>Gregory Bard &lt;<a href="mailto:bard@fordham.edu">bard@fordham.edu</a>&gt; </dd>
<dd>
Martin Albrecht &lt;<a href="mailto:M.R.Albrecht@rhul.ac.uk">M.R.Albrecht@rhul.ac.uk</a>&gt; </dd></dl>
</div><hr/><h2>Define Documentation</h2>
<a class="anchor" id="a2926fb2fc8b3f161f87770545eb9fd4c"></a><!-- doxytag: member="strassen.h::STRASSEN_MUL_CUTOFF" ref="a2926fb2fc8b3f161f87770545eb9fd4c" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define STRASSEN_MUL_CUTOFF&#160;&#160;&#160;MIN(((int)sqrt((double)(4*CPU_L2_CACHE))),4096)</td>
        </tr>
      </table>
</div>
<div class="memdoc">
<p>The default cutoff for Strassen-Winograd multiplication. It should hold hold that 2 * (n^2)/8 fits into the L2 cache. </p>

</div>
</div>
<hr/><h2>Function Documentation</h2>
<a class="anchor" id="ad3fd8edd1387b4a1c215a810eeecfb94"></a><!-- doxytag: member="strassen.h::_mzd_addmul" ref="ad3fd8edd1387b4a1c215a810eeecfb94" args="(mzd_t *C, mzd_t *A, mzd_t *B, int cutoff)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="structmzd__t.html">mzd_t</a>* _mzd_addmul </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td>
          <td class="paramname"><em>C</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td>
          <td class="paramname"><em>A</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td>
          <td class="paramname"><em>B</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>cutoff</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Matrix multiplication and in-place addition via the Strassen-Winograd matrix multiplication algorithm, i.e. compute C = C + AB. </p>
<p>The matrices A and B are respectively m x k and k x n, and can be not aligned on the RADIX grid.</p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table class="params">
    <tr><td class="paramname">C</td><td>Preallocated product matrix, may be NULL for automatic creation. </td></tr>
    <tr><td class="paramname">A</td><td>Input matrix A </td></tr>
    <tr><td class="paramname">B</td><td>Input matrix B </td></tr>
    <tr><td class="paramname">cutoff</td><td>Minimal dimension for Strassen recursion. </td></tr>
  </table>
  </dd>
</dl>

<p><p>Assumes that B and C are aligned in the same manner (as in a Schur complement)</p>
</p>

</div>
</div>
<a class="anchor" id="addf66f100dd926ec453d68a84a954044"></a><!-- doxytag: member="strassen.h::_mzd_addmul_even" ref="addf66f100dd926ec453d68a84a954044" args="(mzd_t *C, mzd_t *A, mzd_t *B, int cutoff)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="structmzd__t.html">mzd_t</a>* _mzd_addmul_even </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td>
          <td class="paramname"><em>C</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td>
          <td class="paramname"><em>A</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td>
          <td class="paramname"><em>B</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>cutoff</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Matrix multiplication and in-place addition via the Strassen-Winograd matrix multiplication algorithm, i.e. compute C = C+ AB. </p>
<p>This is the actual implementation. Any matrix where either the number of rows or the number of columns is smaller than cutoff is processed using the M4RM algorithm.</p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table class="params">
    <tr><td class="paramname">C</td><td>Preallocated product matrix, may be NULL for automatic creation. </td></tr>
    <tr><td class="paramname">A</td><td>Input matrix A </td></tr>
    <tr><td class="paramname">B</td><td>Input matrix B </td></tr>
    <tr><td class="paramname">cutoff</td><td>Minimal dimension for Strassen recursion.</td></tr>
  </table>
  </dd>
</dl>
<dl class="note"><dt><b>Note:</b></dt><dd>This implementation is heavily inspired by the function strassen_window_multiply_c in Sage 3.0; For reference see <a href="http://www.sagemath.org">http://www.sagemath.org</a> </dd></dl>

<p><dl class="todo"><dt><b><a class="el" href="todo.html#_todo000012">Todo:</a></b></dt><dd>make sure not to overwrite crap after ncols and before width*RADIX </dd></dl>
<dl class="note"><dt><b>Note:</b></dt><dd>See Marco Bodrato; "A Strassen-like Matrix Multiplication
 Suited for Squaring and Highest Power Computation"; <a href="http://bodrato.it/papres/#CIVV2008">http://bodrato.it/papres/#CIVV2008</a> for reference on the used sequence of operations.</dd></dl>
</p>

</div>
</div>
<a class="anchor" id="a2e71dcd2c9fab6c192cc8c701d4c61b9"></a><!-- doxytag: member="strassen.h::_mzd_addmul_even_weird" ref="a2e71dcd2c9fab6c192cc8c701d4c61b9" args="(mzd_t *C, mzd_t *A, mzd_t *B, int cutoff)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="structmzd__t.html">mzd_t</a>* _mzd_addmul_even_weird </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td>
          <td class="paramname"><em>C</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td>
          <td class="paramname"><em>A</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td>
          <td class="paramname"><em>B</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>cutoff</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<p>C = A*B + C for A with offset != 0 and B with offset == 0.</p>
<p>This is scratch code. </p>

</div>
</div>
<a class="anchor" id="aeefed0956e8a7fbac589ce6ebb43e508"></a><!-- doxytag: member="strassen.h::_mzd_addmul_weird_even" ref="aeefed0956e8a7fbac589ce6ebb43e508" args="(mzd_t *C, mzd_t *A, mzd_t *B, int cutoff)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="structmzd__t.html">mzd_t</a>* _mzd_addmul_weird_even </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td>
          <td class="paramname"><em>C</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td>
          <td class="paramname"><em>A</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td>
          <td class="paramname"><em>B</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>cutoff</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<p>C = A*B + C for A with offset == 0 and B with offset != 0.</p>
<p>This is scratch code. </p>

</div>
</div>
<a class="anchor" id="a3fbe9641e2ddb5c2d40b330de5745939"></a><!-- doxytag: member="strassen.h::_mzd_addmul_weird_weird" ref="a3fbe9641e2ddb5c2d40b330de5745939" args="(mzd_t *C, mzd_t *A, mzd_t *B, int cutoff)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="structmzd__t.html">mzd_t</a>* _mzd_addmul_weird_weird </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td>
          <td class="paramname"><em>C</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td>
          <td class="paramname"><em>A</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td>
          <td class="paramname"><em>B</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>cutoff</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">
<p>C = A*B + C for matrices with offsets != 0</p>
<p>This is scratch code. </p>

</div>
</div>
<a class="anchor" id="aa9fbe38447fa2292a5d64ca373df4ff9"></a><!-- doxytag: member="strassen.h::_mzd_mul_even" ref="aa9fbe38447fa2292a5d64ca373df4ff9" args="(mzd_t *C, mzd_t *A, mzd_t *B, int cutoff)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="structmzd__t.html">mzd_t</a>* _mzd_mul_even </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td>
          <td class="paramname"><em>C</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td>
          <td class="paramname"><em>A</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td>
          <td class="paramname"><em>B</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>cutoff</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Matrix multiplication via the Strassen-Winograd matrix multiplication algorithm, i.e. compute C = AB. </p>
<p>This is the actual implementation. Any matrix where either the number of rows or the number of columns is smaller than cutoff is processed using the M4RM algorithm.</p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table class="params">
    <tr><td class="paramname">C</td><td>Preallocated product matrix, may be NULL for automatic creation. </td></tr>
    <tr><td class="paramname">A</td><td>Input matrix A </td></tr>
    <tr><td class="paramname">B</td><td>Input matrix B </td></tr>
    <tr><td class="paramname">cutoff</td><td>Minimal dimension for Strassen recursion.</td></tr>
  </table>
  </dd>
</dl>
<dl class="note"><dt><b>Note:</b></dt><dd>This implementation is heavily inspired by the function strassen_window_multiply_c in Sage 3.0; For reference see <a href="http://www.sagemath.org">http://www.sagemath.org</a> </dd></dl>

<p><dl class="note"><dt><b>Note:</b></dt><dd>See Marco Bodrato; "A Strassen-like Matrix Multiplication
 Suited for Squaring and Highest Power Computation"; <a href="http://bodrato.it/papres/#CIVV2008">http://bodrato.it/papres/#CIVV2008</a> for reference on the used sequence of operations.</dd></dl>
<dl class="todo"><dt><b><a class="el" href="todo.html#_todo000010">Todo:</a></b></dt><dd>ideally we would use the same Wmk throughout the function but some called function doesn't like that and we end up with a wrong result if we use virtual Wmk matrices. Ideally, this should be fixed not worked around. The check whether the bug has been fixed, use only one Wmk and check if mzd_mul(4096, 3528, 4096, 2124) still returns the correct answer. </dd></dl>
</p>

</div>
</div>
<a class="anchor" id="a0f8b21c7722145a4be1b1d0a3eba46cc"></a><!-- doxytag: member="strassen.h::mzd_addmul" ref="a0f8b21c7722145a4be1b1d0a3eba46cc" args="(mzd_t *C, mzd_t *A, mzd_t *B, int cutoff)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="structmzd__t.html">mzd_t</a>* mzd_addmul </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td>
          <td class="paramname"><em>C</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td>
          <td class="paramname"><em>A</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td>
          <td class="paramname"><em>B</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>cutoff</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Matrix multiplication and in-place addition via the Strassen-Winograd matrix multiplication algorithm, i.e. compute C = C+ AB. </p>
<p>This is the wrapper function including bounds checks. See _mzd_addmul_even for implementation details.</p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table class="params">
    <tr><td class="paramname">C</td><td>product matrix </td></tr>
    <tr><td class="paramname">A</td><td>Input matrix A </td></tr>
    <tr><td class="paramname">B</td><td>Input matrix B </td></tr>
    <tr><td class="paramname">cutoff</td><td>Minimal dimension for Strassen recursion. </td></tr>
  </table>
  </dd>
</dl>
<dl><dt><b>Examples: </b></dt><dd><a class="el" href="testsuite_2test_multiplication_8c-example.html#a12">testsuite/test_multiplication.c</a>, and <a class="el" href="testsuite_2test_pluq_8c-example.html#a10">testsuite/test_pluq.c</a>.</dd>
</dl>
</div>
</div>
<a class="anchor" id="ab6e411c4b2a86239e811685aa3594ace"></a><!-- doxytag: member="strassen.h::mzd_mul" ref="ab6e411c4b2a86239e811685aa3594ace" args="(mzd_t *C, mzd_t *A, mzd_t *B, int cutoff)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="structmzd__t.html">mzd_t</a>* mzd_mul </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td>
          <td class="paramname"><em>C</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td>
          <td class="paramname"><em>A</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="structmzd__t.html">mzd_t</a> *&#160;</td>
          <td class="paramname"><em>B</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>cutoff</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Matrix multiplication via the Strassen-Winograd matrix multiplication algorithm, i.e. compute C = AB. </p>
<p>This is the wrapper function including bounds checks. See _mzd_mul_even for implementation details.</p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table class="params">
    <tr><td class="paramname">C</td><td>Preallocated product matrix, may be NULL for automatic creation. </td></tr>
    <tr><td class="paramname">A</td><td>Input matrix A </td></tr>
    <tr><td class="paramname">B</td><td>Input matrix B </td></tr>
    <tr><td class="paramname">cutoff</td><td>Minimal dimension for Strassen recursion. </td></tr>
  </table>
  </dd>
</dl>
<dl><dt><b>Examples: </b></dt><dd><a class="el" href="testsuite_2bench_elimination_8c-example.html#a5">testsuite/bench_elimination.c</a>, <a class="el" href="testsuite_2test_multiplication_8c-example.html#a3">testsuite/test_multiplication.c</a>, and <a class="el" href="testsuite_2test_pluq_8c-example.html#a4">testsuite/test_pluq.c</a>.</dd>
</dl>
</div>
</div>
</div>
<hr class="footer"/><address class="footer"><small>Generated on Sat Apr 23 2011 for M4RI by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
</body>
</html>