<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic CBLAS level 3 routine problem in Intel® oneAPI Math Kernel Library</title>
    <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/CBLAS-level-3-routine-problem/m-p/789188#M2057</link>
    <description>Hi, all. I would like to use the BLAS routine dgemm to do matrix multiplication. I made a testing program and compared the results of CBLAS and BLAS. I am confused that CBLAS produced a wrong result. I check from time to time but still don't know where goes wrong. Can anyone give me some suggestion? The code and results are pasted below. Thanks in advance.&lt;BR /&gt;&lt;BR /&gt;int main()&lt;BR /&gt;{&lt;BR /&gt; const int n = 3, m = 2;&lt;BR /&gt; double A&lt;N&gt;&lt;M&gt;, B&lt;N&gt;&lt;M&gt;;&lt;BR /&gt; double d[n*m], e[n*m];&lt;BR /&gt;&lt;BR /&gt; /*************************&lt;BR /&gt; two dimension storage:&lt;BR /&gt; A = 1, 2 B = 1, 1&lt;BR /&gt; 2, 3 1, 1&lt;BR /&gt; 3, 4 1, 1&lt;BR /&gt; *************************/&lt;BR /&gt;&lt;BR /&gt; for( int i = 0; i &amp;lt; n; i++ )&lt;BR /&gt; for( int j = 0; j &amp;lt; m; j++ ){&lt;BR /&gt; A&lt;I&gt;&lt;J&gt; = i+j+1;&lt;BR /&gt; B&lt;I&gt;&lt;J&gt; = 1;&lt;BR /&gt; }&lt;BR /&gt;&lt;BR /&gt; /*************************&lt;BR /&gt; one dimension storage &lt;BR /&gt; with column-major:&lt;BR /&gt; d = {1, 2, 3, 2, 3, 4}&lt;BR /&gt; e = {1, 1, 1, 1, 1, 1}&lt;BR /&gt; *************************/&lt;BR /&gt;&lt;BR /&gt; for( int j = 0; j &amp;lt; m; j++ )&lt;BR /&gt; for( int i = 0; i &amp;lt; n; i++ ){&lt;BR /&gt; d[j*n+i] = A&lt;I&gt;&lt;J&gt;;&lt;BR /&gt; e[j*n+i] = B&lt;I&gt;&lt;J&gt;;&lt;BR /&gt; }&lt;BR /&gt;&lt;BR /&gt; /*********************************&lt;BR /&gt; Call dgemm:&lt;BR /&gt; C := alpha*op(A)*op(B) + beta*C&lt;BR /&gt; ********************************/&lt;BR /&gt;&lt;BR /&gt; /************CBLAS***************/&lt;BR /&gt;&lt;BR /&gt; CBLAS_ORDER order;&lt;BR /&gt; order = CblasRowMajor; //specify row major&lt;BR /&gt; CBLAS_TRANSPOSE transa;&lt;BR /&gt; transa = CblasTrans; // transpose A&lt;BR /&gt; CBLAS_TRANSPOSE transb;&lt;BR /&gt; transb = CblasNoTrans;&lt;BR /&gt;&lt;BR /&gt; int lda = n; //the first dimension of A&lt;BR /&gt; int ldb = n; //the first dimension of B&lt;BR /&gt; int ldc = m; //the first dimension of C &lt;BR /&gt;&lt;BR /&gt; double alpha = 1.0, beta = 0.0;&lt;BR /&gt; double C&lt;M&gt;&lt;M&gt;;&lt;BR /&gt;&lt;BR /&gt; cblas_dgemm( order, transa, transb, m, m, n, &lt;BR /&gt;  alpha, *A, lda, *B, ldb, beta, *C, ldc);&lt;BR /&gt;&lt;BR /&gt; for( int i = 0; i &amp;lt; m; i++ ){&lt;BR /&gt; for( int j = 0; j &amp;lt; m; j++ ){&lt;BR /&gt; cout &amp;lt;&amp;lt; C&lt;I&gt;&lt;J&gt; &amp;lt;&amp;lt; ", ";&lt;BR /&gt; }&lt;BR /&gt; cout &amp;lt;&amp;lt; endl;&lt;BR /&gt; }&lt;BR /&gt;&lt;BR /&gt; /*********direct Fotran call*********/&lt;BR /&gt;&lt;BR /&gt; double f[m*m];&lt;BR /&gt; char transaa = 'T';&lt;BR /&gt; char transbb = 'N';&lt;BR /&gt; dgemm( &amp;amp;transaa, &amp;amp;transbb, &amp;amp;m, &amp;amp;m, &amp;amp;n, &lt;BR /&gt;  α, d, &amp;amp;lda, e, &amp;amp;ldb, β, f, &amp;amp;ldc);&lt;BR /&gt; &lt;BR /&gt; cout &amp;lt;&amp;lt; endl;&lt;BR /&gt; for( int i = 0; i &amp;lt; m*m; i++ )&lt;BR /&gt; cout &amp;lt;&amp;lt; f&lt;I&gt; &amp;lt;&amp;lt; ", ";&lt;BR /&gt; cout &amp;lt;&amp;lt; endl;&lt;BR /&gt;&lt;BR /&gt; return 0;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;&lt;B&gt;Result:&lt;/B&gt;&lt;BR /&gt;&lt;BR /&gt;5, 6,&lt;BR /&gt;6, 7,&lt;BR /&gt;&lt;BR /&gt;6, 9, 6, 9,&lt;BR /&gt;&lt;/I&gt;&lt;/J&gt;&lt;/I&gt;&lt;/M&gt;&lt;/M&gt;&lt;/J&gt;&lt;/I&gt;&lt;/J&gt;&lt;/I&gt;&lt;/J&gt;&lt;/I&gt;&lt;/J&gt;&lt;/I&gt;&lt;/M&gt;&lt;/N&gt;&lt;/M&gt;&lt;/N&gt;</description>
    <pubDate>Sun, 20 Nov 2011 07:33:00 GMT</pubDate>
    <dc:creator>stanleyimko</dc:creator>
    <dc:date>2011-11-20T07:33:00Z</dc:date>
    <item>
      <title>CBLAS level 3 routine problem</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/CBLAS-level-3-routine-problem/m-p/789188#M2057</link>
      <description>Hi, all. I would like to use the BLAS routine dgemm to do matrix multiplication. I made a testing program and compared the results of CBLAS and BLAS. I am confused that CBLAS produced a wrong result. I check from time to time but still don't know where goes wrong. Can anyone give me some suggestion? The code and results are pasted below. Thanks in advance.&lt;BR /&gt;&lt;BR /&gt;int main()&lt;BR /&gt;{&lt;BR /&gt; const int n = 3, m = 2;&lt;BR /&gt; double A&lt;N&gt;&lt;M&gt;, B&lt;N&gt;&lt;M&gt;;&lt;BR /&gt; double d[n*m], e[n*m];&lt;BR /&gt;&lt;BR /&gt; /*************************&lt;BR /&gt; two dimension storage:&lt;BR /&gt; A = 1, 2 B = 1, 1&lt;BR /&gt; 2, 3 1, 1&lt;BR /&gt; 3, 4 1, 1&lt;BR /&gt; *************************/&lt;BR /&gt;&lt;BR /&gt; for( int i = 0; i &amp;lt; n; i++ )&lt;BR /&gt; for( int j = 0; j &amp;lt; m; j++ ){&lt;BR /&gt; A&lt;I&gt;&lt;J&gt; = i+j+1;&lt;BR /&gt; B&lt;I&gt;&lt;J&gt; = 1;&lt;BR /&gt; }&lt;BR /&gt;&lt;BR /&gt; /*************************&lt;BR /&gt; one dimension storage &lt;BR /&gt; with column-major:&lt;BR /&gt; d = {1, 2, 3, 2, 3, 4}&lt;BR /&gt; e = {1, 1, 1, 1, 1, 1}&lt;BR /&gt; *************************/&lt;BR /&gt;&lt;BR /&gt; for( int j = 0; j &amp;lt; m; j++ )&lt;BR /&gt; for( int i = 0; i &amp;lt; n; i++ ){&lt;BR /&gt; d[j*n+i] = A&lt;I&gt;&lt;J&gt;;&lt;BR /&gt; e[j*n+i] = B&lt;I&gt;&lt;J&gt;;&lt;BR /&gt; }&lt;BR /&gt;&lt;BR /&gt; /*********************************&lt;BR /&gt; Call dgemm:&lt;BR /&gt; C := alpha*op(A)*op(B) + beta*C&lt;BR /&gt; ********************************/&lt;BR /&gt;&lt;BR /&gt; /************CBLAS***************/&lt;BR /&gt;&lt;BR /&gt; CBLAS_ORDER order;&lt;BR /&gt; order = CblasRowMajor; //specify row major&lt;BR /&gt; CBLAS_TRANSPOSE transa;&lt;BR /&gt; transa = CblasTrans; // transpose A&lt;BR /&gt; CBLAS_TRANSPOSE transb;&lt;BR /&gt; transb = CblasNoTrans;&lt;BR /&gt;&lt;BR /&gt; int lda = n; //the first dimension of A&lt;BR /&gt; int ldb = n; //the first dimension of B&lt;BR /&gt; int ldc = m; //the first dimension of C &lt;BR /&gt;&lt;BR /&gt; double alpha = 1.0, beta = 0.0;&lt;BR /&gt; double C&lt;M&gt;&lt;M&gt;;&lt;BR /&gt;&lt;BR /&gt; cblas_dgemm( order, transa, transb, m, m, n, &lt;BR /&gt;  alpha, *A, lda, *B, ldb, beta, *C, ldc);&lt;BR /&gt;&lt;BR /&gt; for( int i = 0; i &amp;lt; m; i++ ){&lt;BR /&gt; for( int j = 0; j &amp;lt; m; j++ ){&lt;BR /&gt; cout &amp;lt;&amp;lt; C&lt;I&gt;&lt;J&gt; &amp;lt;&amp;lt; ", ";&lt;BR /&gt; }&lt;BR /&gt; cout &amp;lt;&amp;lt; endl;&lt;BR /&gt; }&lt;BR /&gt;&lt;BR /&gt; /*********direct Fotran call*********/&lt;BR /&gt;&lt;BR /&gt; double f[m*m];&lt;BR /&gt; char transaa = 'T';&lt;BR /&gt; char transbb = 'N';&lt;BR /&gt; dgemm( &amp;amp;transaa, &amp;amp;transbb, &amp;amp;m, &amp;amp;m, &amp;amp;n, &lt;BR /&gt;  α, d, &amp;amp;lda, e, &amp;amp;ldb, β, f, &amp;amp;ldc);&lt;BR /&gt; &lt;BR /&gt; cout &amp;lt;&amp;lt; endl;&lt;BR /&gt; for( int i = 0; i &amp;lt; m*m; i++ )&lt;BR /&gt; cout &amp;lt;&amp;lt; f&lt;I&gt; &amp;lt;&amp;lt; ", ";&lt;BR /&gt; cout &amp;lt;&amp;lt; endl;&lt;BR /&gt;&lt;BR /&gt; return 0;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;&lt;B&gt;Result:&lt;/B&gt;&lt;BR /&gt;&lt;BR /&gt;5, 6,&lt;BR /&gt;6, 7,&lt;BR /&gt;&lt;BR /&gt;6, 9, 6, 9,&lt;BR /&gt;&lt;/I&gt;&lt;/J&gt;&lt;/I&gt;&lt;/M&gt;&lt;/M&gt;&lt;/J&gt;&lt;/I&gt;&lt;/J&gt;&lt;/I&gt;&lt;/J&gt;&lt;/I&gt;&lt;/J&gt;&lt;/I&gt;&lt;/M&gt;&lt;/N&gt;&lt;/M&gt;&lt;/N&gt;</description>
      <pubDate>Sun, 20 Nov 2011 07:33:00 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/CBLAS-level-3-routine-problem/m-p/789188#M2057</guid>
      <dc:creator>stanleyimko</dc:creator>
      <dc:date>2011-11-20T07:33:00Z</dc:date>
    </item>
    <item>
      <title>CBLAS level 3 routine problem</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/CBLAS-level-3-routine-problem/m-p/789189#M2058</link>
      <description>Hello,&lt;BR /&gt;&lt;BR /&gt;The leading dimensions for the CBLAS call are set incorrectly. For the row-major matrix format, the leading dimensions should stride rows of the matrix. Since your 2D arrays are A&lt;N&gt;[&lt;STRONG&gt;m&lt;/STRONG&gt;] and B&lt;N&gt;[&lt;STRONG&gt;m&lt;/STRONG&gt;], &lt;STRONG&gt;lda &lt;/STRONG&gt;and &lt;STRONG&gt;ldb &lt;/STRONG&gt;should be &lt;STRONG&gt;m&lt;/STRONG&gt;. Please see themodified code below:&lt;BR /&gt;&lt;BR /&gt;&lt;PRE&gt;[cpp]    CBLAS_ORDER order;
    order = CblasRowMajor; //specify row major
    CBLAS_TRANSPOSE transa;
    transa = CblasTrans; // transpose A
    CBLAS_TRANSPOSE transb;
    transb = CblasNoTrans;

    int lda = m; //modified leading dimension for A
    int ldb = m; //modified leading dimension for B
    int ldc = m; //the first dimension of C
[/cpp]&lt;/PRE&gt;&lt;BR /&gt;Then, before the FORTRAN dgemm call, we need to reset &lt;STRONG&gt;lda&lt;/STRONG&gt; and &lt;STRONG&gt;ldb&lt;/STRONG&gt; to &lt;STRONG&gt;n&lt;/STRONG&gt; since the FORTRAN call is in column-major format.&lt;BR /&gt;&lt;BR /&gt;&lt;PRE&gt;[cpp]    /*********direct Fotran call*********/

    lda = n; //reset the leading dimension of A
    ldb = n; //reset the leading dimension of B
    double f[m*m];
    char transaa = 'T';
    char transbb = 'N';
    dgemm( &amp;amp;transaa, &amp;amp;transbb, &amp;amp;m, &amp;amp;m, &amp;amp;n,
            α, d, &amp;amp;lda, e, &amp;amp;ldb, β, f, &amp;amp;ldc);[/cpp]&lt;/PRE&gt;&lt;BR /&gt;After these modifications, I get same results from CBLAS and FORTRAN dgemm:&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;Result:&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;P&gt;6, 6,&lt;/P&gt;&lt;P&gt;9, 9,&lt;/P&gt;&lt;P&gt;6, 9, 6, 9,&lt;/P&gt;&lt;BR /&gt;Best wishes,&lt;BR /&gt;&lt;BR /&gt;Efe&lt;BR /&gt;&lt;BR /&gt;&lt;/N&gt;&lt;/N&gt;</description>
      <pubDate>Mon, 21 Nov 2011 05:45:16 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/CBLAS-level-3-routine-problem/m-p/789189#M2058</guid>
      <dc:creator>Murat_G_Intel</dc:creator>
      <dc:date>2011-11-21T05:45:16Z</dc:date>
    </item>
    <item>
      <title>CBLAS level 3 routine problem</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/CBLAS-level-3-routine-problem/m-p/789190#M2059</link>
      <description>Efe,&lt;BR /&gt;&lt;BR /&gt;Thanks so much. I am kind of misunderstanding the dimension stuff. I should check carefully before posting the thread next time. &lt;BR /&gt;&lt;BR /&gt;Regards,&lt;BR /&gt;&lt;BR /&gt;Stanley</description>
      <pubDate>Mon, 21 Nov 2011 12:53:36 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/CBLAS-level-3-routine-problem/m-p/789190#M2059</guid>
      <dc:creator>stanleyimko</dc:creator>
      <dc:date>2011-11-21T12:53:36Z</dc:date>
    </item>
  </channel>
</rss>

