Problem using MatView
Matthew Knepley
knepley at gmail.com
Thu Dec 7 09:24:36 CST 2006
Yes, the implementation is very bad. It assembles the whole matrix on process 0
before viewing. It is intended for very small matrices only. Fixing would entail
rewriting the X viewer to take pieces of the matrix at a time. This is
a low priority for
us now, but we would gladly accept contributed code.
Thanks,
Matt
On 12/7/06, Cristiano Calonaci <c.calonaci at cineca.it> wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Hi,
>
> I'm trying to plot using X a sparse matrix of order 100.000, with
> about 7.000.000 not zero elements using
>
> ierr = PetscViewerDrawOpen(PETSC_COMM_WORLD, NULL, "matrix ATA",
> PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, &ataviewer);
> CHKERRQ(ierr);
> ......
> ierr = MatView(ATA, ataviewer); CHKERRQ(ierr);
>
> When I run with one processors all is ok (fast plot), when I run with more
> processors, for examples 2, the time need to plot becomes infinite.
>
> Using gdb I fount that processors zero is always memcpying,
>
> #0 0x0000002a96a1b6c6 in memcpy () from /lib64/tls/libc.so.6
> #1 0x00000000009cd6ff in PetscMemcpy (a=0x2a9c88f200, b=0x2a9c50b200,
> n=1362576) at memc.c:102
> #2 0x00000000005f29af in MatSetValues_MPIAIJ (mat=0xdec4c0, m=1,
> im=0x7fbfffe5fc, n=121, in=0x2a9a420328, v=0x2a9758c450,
> addv=INSERT_VALUES) at mpiaij.c:187
> #3 0x000000000052fe23 in MatSetValues (mat=0xdec4c0, m=1,
> idxm=0x7fbfffe5fc, n=121, idxn=0x2a9a420328, v=0x2a9758c450,
> addv=INSERT_VALUES) at matrix.c:826
> #4 0x00000000005fe647 in MatView_MPIAIJ_ASCIIorDraworSocket
> (mat=0xdbaa50, viewer=0xd78c90) at mpiaij.c:957
> #5 0x00000000005ff229 in MatView_MPIAIJ (mat=0xdbaa50, viewer=0xd78c90)
> at mpiaij.c:1005
> #6 0x000000000052cfa8 in MatView (mat=0xdbaa50, viewer=0xd78c90) at
> matrix.c:549
>
> here (frame #4) in the MatSetValues
>
> /* This is just a temporary matrix, so explicitly using MATMPIAIJ is
> probably best */
> ierr = MatSetType(A,MATMPIAIJ);CHKERRQ(ierr);
> ierr =
> MatMPIAIJSetPreallocation(A,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr);
> ierr = PetscLogObjectParent(mat,A);CHKERRQ(ierr);
>
> /* copy over the A part */
> Aloc = (Mat_SeqAIJ*)aij->A->data;
> m = aij->A->rmap.n; ai = Aloc->i; aj = Aloc->j; a = Aloc->a;
> row = mat->rmap.rstart;
> for (i=0; i<ai[m]; i++) {aj[i] += mat->cmap.rstart ;}
> for (i=0; i<m; i++) {
> ierr =
> MatSetValues(A,1,&row,ai[i+1]-ai[i],aj,a,INSERT_VALUES);CHKERRQ(ierr);
> row++; a += ai[i+1]-ai[i]; aj += ai[i+1]-ai[i];
> }
>
> I think the problem is a lot of MatSetValues without preallocation
> (ierr =
> MatMPIAIJSetPreallocation(A,0,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr);),
> isn't it ? There is a solution ?
>
> Thaks a lot
>
> Cristiano
> - --
> ______________________________________________________________________
>
> "Un programma di computer fa quello che gli dici, non quello che vuoi"
> Terza legge di Greer
> ______________________________________________________________________
>
> Cristiano Calonaci - Supercomputing Group - CINECA
> Via Magnanelli 6/3 - 40033 Casalecchio di Reno - Bologna - Italy
> Tel.+39-0516171421 - Fax.+39-0516137273 - e-mail: c.calonaci at cineca.it
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.1 (GNU/Linux)
> Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org
>
> iD8DBQFFeC5Hvt08LyoFZwMRAjD8AJ4kp8FPo0kdgbLLg1l6sfjf/AAihQCfewSs
> 06+THVFfozPmQi4Ro5um4zM=
> =6A1q
> -----END PGP SIGNATURE-----
>
>
--
"Failure has a thousand explanations. Success doesn't need one" -- Sir
Alec Guiness
More information about the petsc-users
mailing list