<?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 spblas memory question in Intel® oneAPI Math Kernel Library</title>
    <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/spblas-memory-question/m-p/1151976#M27214</link>
    <description>&lt;PRE class="brush:fortran; class-name:dark;"&gt;program main
    use mkl_spblas
    use iso_c_binding
    implicit none
    type(SPARSE_MATRIX_T) A, B 
    type(MATRIX_DESCR) descA
    integer :: indexing = SPARSE_INDEX_BASE_ONE
    integer m, n, nnz, stat
    integer, dimension(:), allocatable :: row_ptr, col_indx
    real(8), dimension(:), allocatable :: values
    type(c_ptr) rows_start_c, rows_end_c, col_indx_c, values_c
    integer, pointer :: rows_start_f(:), rows_end_f(:), col_indx_f(:)
    real(8), pointer :: values_f(:)
    integer i, j
    
    m = 5
    n = 5
    nnz = 13
    allocate(row_ptr(m + 1))
    allocate(col_indx(nnz))
    allocate(values(nnz))
    row_ptr = (/ 1, 4, 6, 9, 12, 14 /)
    col_indx = (/ 1, 2, 4, 1, 2, 3, 4, 5, 1, 3, 4, 2, 5 /)
    values = (/ 1.d0, -1.d0, -3.d0, -2.d0, 5.d0, 4.d0, 6.d0, 4.d0, -4.d0, 2.d0, 7.d0, 8.d0, -5.d0 /)      
    stat = mkl_sparse_d_create_csr(A, indexing, m, n, row_ptr, row_ptr(2), col_indx, values)


    descA%type = SPARSE_MATRIX_TYPE_GENERAL
    stat = mkl_sparse_copy(A, descA, B)    
    stat = mkl_sparse_destroy(A)
    deallocate(row_ptr, col_indx, values)

    stat = mkl_sparse_d_export_csr(B, indexing, m, n, rows_start_c, rows_end_c, col_indx_c, values_c)
    stat = mkl_sparse_destroy(B)

    call c_f_pointer(rows_start_c, rows_start_f, &lt;M&gt;)
    call c_f_pointer(rows_end_c  , rows_end_f  , &lt;M&gt;)
    call c_f_pointer(col_indx_c  , col_indx_f  , [rows_end_f(m) - 1])
    call c_f_pointer(values_c    , values_f    , [rows_end_f(m) - 1])
    print *, '---------------------------------------------------'
    do i = 1, m
        print *, 'row #', i 
        do j = rows_start_f(i), rows_end_f(i) - 1
            print *, col_indx_f(j), values_f(j)
        end do 
    end do 
    print *, '---------------------------------------------------'

end program main&lt;/M&gt;&lt;/M&gt;&lt;/PRE&gt;

&lt;P&gt;As the fortran code above, I construct a sparse matrix A , then I destroy A and free the memory allocated for row indices, column indices and&amp;nbsp;values of A&amp;nbsp;after I copy A to B. When I get the pointer for row indices, column indices and values of B, I again destroy B. The result is that I can still get the data of B after destroying it.&lt;/P&gt;
&lt;P&gt;My question is that how&amp;nbsp;mkl_sparse_copy allocate memory for indices and values of&amp;nbsp;the destination matrix? Dose it use the function allocate?If so,&amp;nbsp;mkl_sparse_destroy seems not to free those memories. If this will case memory leak?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;---------------------------------------------------&lt;BR /&gt;&amp;nbsp;row # &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1 &amp;nbsp; 1.00000000000000 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2 &amp;nbsp;-1.00000000000000 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4 &amp;nbsp;-3.00000000000000 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;row # &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1 &amp;nbsp;-2.00000000000000 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2 &amp;nbsp; 5.00000000000000 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;row # &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 3&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;3 &amp;nbsp; 4.00000000000000 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4 &amp;nbsp; 6.00000000000000 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;5 &amp;nbsp; 4.00000000000000 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;row # &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 4&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1 &amp;nbsp;-4.00000000000000 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;3 &amp;nbsp; 2.00000000000000 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4 &amp;nbsp; 7.00000000000000 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;row # &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 5&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2 &amp;nbsp; 8.00000000000000 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;5 &amp;nbsp;-5.00000000000000 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;---------------------------------------------------&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Thu, 05 Dec 2019 13:34:29 GMT</pubDate>
    <dc:creator>Meng__Xiangyi</dc:creator>
    <dc:date>2019-12-05T13:34:29Z</dc:date>
    <item>
      <title>spblas memory question</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/spblas-memory-question/m-p/1151976#M27214</link>
      <description>&lt;PRE class="brush:fortran; class-name:dark;"&gt;program main
    use mkl_spblas
    use iso_c_binding
    implicit none
    type(SPARSE_MATRIX_T) A, B 
    type(MATRIX_DESCR) descA
    integer :: indexing = SPARSE_INDEX_BASE_ONE
    integer m, n, nnz, stat
    integer, dimension(:), allocatable :: row_ptr, col_indx
    real(8), dimension(:), allocatable :: values
    type(c_ptr) rows_start_c, rows_end_c, col_indx_c, values_c
    integer, pointer :: rows_start_f(:), rows_end_f(:), col_indx_f(:)
    real(8), pointer :: values_f(:)
    integer i, j
    
    m = 5
    n = 5
    nnz = 13
    allocate(row_ptr(m + 1))
    allocate(col_indx(nnz))
    allocate(values(nnz))
    row_ptr = (/ 1, 4, 6, 9, 12, 14 /)
    col_indx = (/ 1, 2, 4, 1, 2, 3, 4, 5, 1, 3, 4, 2, 5 /)
    values = (/ 1.d0, -1.d0, -3.d0, -2.d0, 5.d0, 4.d0, 6.d0, 4.d0, -4.d0, 2.d0, 7.d0, 8.d0, -5.d0 /)      
    stat = mkl_sparse_d_create_csr(A, indexing, m, n, row_ptr, row_ptr(2), col_indx, values)


    descA%type = SPARSE_MATRIX_TYPE_GENERAL
    stat = mkl_sparse_copy(A, descA, B)    
    stat = mkl_sparse_destroy(A)
    deallocate(row_ptr, col_indx, values)

    stat = mkl_sparse_d_export_csr(B, indexing, m, n, rows_start_c, rows_end_c, col_indx_c, values_c)
    stat = mkl_sparse_destroy(B)

    call c_f_pointer(rows_start_c, rows_start_f, &lt;M&gt;)
    call c_f_pointer(rows_end_c  , rows_end_f  , &lt;M&gt;)
    call c_f_pointer(col_indx_c  , col_indx_f  , [rows_end_f(m) - 1])
    call c_f_pointer(values_c    , values_f    , [rows_end_f(m) - 1])
    print *, '---------------------------------------------------'
    do i = 1, m
        print *, 'row #', i 
        do j = rows_start_f(i), rows_end_f(i) - 1
            print *, col_indx_f(j), values_f(j)
        end do 
    end do 
    print *, '---------------------------------------------------'

end program main&lt;/M&gt;&lt;/M&gt;&lt;/PRE&gt;

&lt;P&gt;As the fortran code above, I construct a sparse matrix A , then I destroy A and free the memory allocated for row indices, column indices and&amp;nbsp;values of A&amp;nbsp;after I copy A to B. When I get the pointer for row indices, column indices and values of B, I again destroy B. The result is that I can still get the data of B after destroying it.&lt;/P&gt;
&lt;P&gt;My question is that how&amp;nbsp;mkl_sparse_copy allocate memory for indices and values of&amp;nbsp;the destination matrix? Dose it use the function allocate?If so,&amp;nbsp;mkl_sparse_destroy seems not to free those memories. If this will case memory leak?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;---------------------------------------------------&lt;BR /&gt;&amp;nbsp;row # &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1 &amp;nbsp; 1.00000000000000 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2 &amp;nbsp;-1.00000000000000 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4 &amp;nbsp;-3.00000000000000 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;row # &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1 &amp;nbsp;-2.00000000000000 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2 &amp;nbsp; 5.00000000000000 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;row # &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 3&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;3 &amp;nbsp; 4.00000000000000 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4 &amp;nbsp; 6.00000000000000 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;5 &amp;nbsp; 4.00000000000000 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;row # &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 4&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1 &amp;nbsp;-4.00000000000000 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;3 &amp;nbsp; 2.00000000000000 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;4 &amp;nbsp; 7.00000000000000 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;row # &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 5&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2 &amp;nbsp; 8.00000000000000 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;5 &amp;nbsp;-5.00000000000000 &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;---------------------------------------------------&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 05 Dec 2019 13:34:29 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/spblas-memory-question/m-p/1151976#M27214</guid>
      <dc:creator>Meng__Xiangyi</dc:creator>
      <dc:date>2019-12-05T13:34:29Z</dc:date>
    </item>
    <item>
      <title>Hello,</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/spblas-memory-question/m-p/1151977#M27215</link>
      <description>&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;The routine mkl_sparse_copy uses mkl_malloc&amp;nbsp;for allocating memory.&lt;/P&gt;&lt;P&gt;It is not a memory leak. I am not sure why exactly the data are&amp;nbsp;still printable after you destroy the matrix B and I believe there should be cases when it won't, but there is no memory leak (checked&amp;nbsp;with valgrind and also with mkl_mem_stat).&lt;/P&gt;&lt;P&gt;Hope this helps!&lt;/P&gt;&lt;P&gt;Best,&lt;BR /&gt;Kirill&lt;/P&gt;</description>
      <pubDate>Wed, 11 Dec 2019 05:51:13 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/spblas-memory-question/m-p/1151977#M27215</guid>
      <dc:creator>Kirill_V_Intel</dc:creator>
      <dc:date>2019-12-11T05:51:13Z</dc:date>
    </item>
  </channel>
</rss>

