<?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 creating a MATLAB .mex file using dspsv in Intel® oneAPI Math Kernel Library</title>
    <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/creating-a-MATLAB-mex-file-using-dspsv/m-p/779813#M1349</link>
    <description>I'm trying to use the MKL libraries to build a MATLAB routine to solve a matrix equation with a packed storage symmetric matrix (to save memory). I'm able to get it up and running fine using the following code, but for larger problems (say 5000x5000, which is still relatively small) it will run fine ~50% of the time, and crash MATLAB ~50% of the time. Does anybody see anything that I am obviously doing wrong? &lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;DIV id="_mcePaste"&gt;#include &lt;STDIO.H&gt;&lt;/STDIO.H&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;#include &lt;STDDEF.H&gt;&lt;/STDDEF.H&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;#include &lt;MEX.H&gt;&lt;/MEX.H&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;DIV id="_mcePaste"&gt;typedef size_t INT; &lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;#define MKL_INT INT&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;#include "mkl_lapacke.h"&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;{	&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;/* Locals */&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;lapack_int n, nr, lda, ldb, info;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;double *ar, *br;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;ar = mxGetPr(prhs[0]); /* pointer to first input matrix */&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;  &lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;br = mxGetPr(prhs[1]); /* pointer to second input matrix */&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;	&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;// dimensions of input matrix A //&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;  &lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;lda = mxGetM(prhs[0]); &lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;  &lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;n  = mxGetM(prhs[1]);&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;  &lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;// dimensions of input matrix B //&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;  &lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;ldb = n; &lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;  &lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;nr = mxGetN(prhs[1]);	&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;if (lda != (ldb*(ldb+1)/2))&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;		&lt;/SPAN&gt;mexErrMsgTxt("Error, size mismatch.");&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;// Local arrays //&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;lapack_int *ipiv;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;ipiv = (lapack_int *) mxMalloc(2*n*sizeof(lapack_int));&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;//lapack_int ipiv&lt;N&gt;;&lt;/N&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;	&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;	&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;info = LAPACKE_dspsv( LAPACK_COL_MAJOR, 'U', n, nr, ar, ipiv, br, ldb);&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;mxFree(ipiv);&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;}&lt;/DIV&gt;</description>
    <pubDate>Wed, 07 Dec 2011 15:00:19 GMT</pubDate>
    <dc:creator>cossmann__Steven</dc:creator>
    <dc:date>2011-12-07T15:00:19Z</dc:date>
    <item>
      <title>creating a MATLAB .mex file using dspsv</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/creating-a-MATLAB-mex-file-using-dspsv/m-p/779813#M1349</link>
      <description>I'm trying to use the MKL libraries to build a MATLAB routine to solve a matrix equation with a packed storage symmetric matrix (to save memory). I'm able to get it up and running fine using the following code, but for larger problems (say 5000x5000, which is still relatively small) it will run fine ~50% of the time, and crash MATLAB ~50% of the time. Does anybody see anything that I am obviously doing wrong? &lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;DIV id="_mcePaste"&gt;#include &lt;STDIO.H&gt;&lt;/STDIO.H&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;#include &lt;STDDEF.H&gt;&lt;/STDDEF.H&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;#include &lt;MEX.H&gt;&lt;/MEX.H&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;DIV id="_mcePaste"&gt;typedef size_t INT; &lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;#define MKL_INT INT&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;#include "mkl_lapacke.h"&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;{	&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;/* Locals */&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;lapack_int n, nr, lda, ldb, info;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;double *ar, *br;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;ar = mxGetPr(prhs[0]); /* pointer to first input matrix */&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;  &lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;br = mxGetPr(prhs[1]); /* pointer to second input matrix */&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;	&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;// dimensions of input matrix A //&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;  &lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;lda = mxGetM(prhs[0]); &lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;  &lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;n  = mxGetM(prhs[1]);&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;  &lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;// dimensions of input matrix B //&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;  &lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;ldb = n; &lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;  &lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;nr = mxGetN(prhs[1]);	&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;if (lda != (ldb*(ldb+1)/2))&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;		&lt;/SPAN&gt;mexErrMsgTxt("Error, size mismatch.");&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;// Local arrays //&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;lapack_int *ipiv;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;ipiv = (lapack_int *) mxMalloc(2*n*sizeof(lapack_int));&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;//lapack_int ipiv&lt;N&gt;;&lt;/N&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;	&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;	&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;info = LAPACKE_dspsv( LAPACK_COL_MAJOR, 'U', n, nr, ar, ipiv, br, ldb);&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;mxFree(ipiv);&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;}&lt;/DIV&gt;</description>
      <pubDate>Wed, 07 Dec 2011 15:00:19 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/creating-a-MATLAB-mex-file-using-dspsv/m-p/779813#M1349</guid>
      <dc:creator>cossmann__Steven</dc:creator>
      <dc:date>2011-12-07T15:00:19Z</dc:date>
    </item>
    <item>
      <title>creating a MATLAB .mex file using dspsv</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/creating-a-MATLAB-mex-file-using-dspsv/m-p/779814#M1350</link>
      <description>The problem appears to be something I'm doing wront in LAPACKE_dspsv. When the only thing I do is remove the size checking for the symmetric matrices and change to dgesv using:&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;PRE&gt;[cpp]info = LAPACKE_dgesv( LAPACK_COL_MAJOR, n, nr, ar, lda, ipiv, br, ldb);[/cpp]&lt;/PRE&gt; &lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;everything seems to work perfectly. At least I haven't been able to crash it yet. Using dspsv, it would generally run once, and then crash the next time it ran. The input matrix is a column matrix that has the right number of elements for a packed storage matrix (n*(n+1)/2), so I have no idea what the problem could be, especially since it seems to work correctly for very small arrays and when it does run it runs fine for large arrays as well. Any ideas?&lt;/DIV&gt;</description>
      <pubDate>Wed, 07 Dec 2011 18:11:19 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/creating-a-MATLAB-mex-file-using-dspsv/m-p/779814#M1350</guid>
      <dc:creator>cossmann__Steven</dc:creator>
      <dc:date>2011-12-07T18:11:19Z</dc:date>
    </item>
    <item>
      <title>creating a MATLAB .mex file using dspsv</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/creating-a-MATLAB-mex-file-using-dspsv/m-p/779815#M1351</link>
      <description>Nevermind, I figured it out I think. I was linking to the dynamic libraries and they weren't being unloaded after I ran "clear all". I statically linked and everything seems to be working.</description>
      <pubDate>Wed, 07 Dec 2011 19:00:01 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/creating-a-MATLAB-mex-file-using-dspsv/m-p/779815#M1351</guid>
      <dc:creator>cossmann__Steven</dc:creator>
      <dc:date>2011-12-07T19:00:01Z</dc:date>
    </item>
  </channel>
</rss>

