[petsc-users] segfault in MatAssemblyEnd() when using large matrices on multi-core MAC OS-X

Ronald M. Caplan caplanr at predsci.com
Wed Aug 1 13:23:57 CDT 2012


Hi,

Using FLUSH_ASSEMBLY periodically solved the segfault problem.
I now use the following code to set the matrix:

DO i=1,N
        IF (rank .eq. 0) THEN
           DO j=CSR_AJ(i)+1,CSR_AJ(i+1)
              call MatSetValue(A,i-1,CSR_AI(j),CSR_A(j),INSERT_VALUES,ierr)
           END DO
        END IF
        !Need to send out matrix periodically otherwise get a segfault
        !(local buffer gets full? prob on mac only?)
        IF (mod(i,100) .eq. 0) THEN
           call MatAssemblyBegin(A,MAT_FLUSH_ASSEMBLY,ierr)
           call MatAssemblyEnd(A,MAT_FLUSH_ASSEMBLY,ierr)
        END IF
      END DO
      !Assemble final matrix A across all cores:
      call MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY,ierr)
      call MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY,ierr)

and everything works fine.

I find the error strange since I am on a single quad-core MAC, the "buffer"
should never get "full"...    Is this a bug?

 - Ron C.

On Mon, Jul 30, 2012 at 3:09 PM, Jed Brown <jedbrown at mcs.anl.gov> wrote:

> On Mon, Jul 30, 2012 at 3:04 PM, Ronald M. Caplan <caplanr at predsci.com>wrote:
>
>> I seem to have solved the problem.
>>
>> I was storing my entire matrix on node 0 and then calling MatAssembly
>> (begin and end) on all nodes (which should have worked...).
>>
>> Apparently I was using too much space for the buffering or the like,
>> because when I change the code so each node sets its own matrix values,
>> than the MatAssemblyEnd does not seg fault.
>>
>
> Can you send the test case. It shouldn't seg-fault unless the machine runs
> out of memory (and most desktop systems have overcommit, so the system will
> kill arbitrary processes, not necessarily the job that did the latest
> malloc.
>
> In practice, you should call MatAssemblyBegin(...,MAT_FLUSH_ASSEMBLY)
> periodically.
>
>
>>
>> Why should this be the case?   How many elements of a vector or matrix
>> can a single node "set" before Assembly to distribute over all nodes?
>>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20120801/f161142a/attachment-0001.html>


More information about the petsc-users mailing list