#include "petscis.h" #include "petscvec.h" PetscErrorCode VecScatterCreate(Vec xin,IS ix,Vec yin,IS iy,VecScatter *newctx)Collective on Vec
xin | - a vector that defines the shape (parallel data layout of the vector) of vectors from which we scatter | |
yin | - a vector that defines the shape (parallel data layout of the vector) of vectors to which we scatter | |
ix | - the indices of xin to scatter (if PETSC_NULL scatters all values) | |
iy | - the indices of yin to hold results (if PETSC_NULL fills entire vector yin) |
Options Database Keys: (uses regular MPI_Sends by default)
-vecscatter_ssend | - Uses MPI_Ssend_init() instead of MPI_Send_init() | |
-vecscatter_rsend | - use ready receiver mode for MPI sends | |
-vecscatter_merge | - VecScatterBegin() handles all of the communication, VecScatterEnd() is a nop eliminates the chance for overlap of computation and communication | |
-vecscatter_sendfirst | - Posts sends before receives | |
-vecscatter_packtogether | - Pack all messages before sending, receive all messages before unpacking | |
-vecscatter_alltoall | - Uses MPI all to all communication for scatter | |
-vecscatter_nopack | - Avoid packing to work vector when possible (if used with -vecscatter_alltoall then will use MPI_Alltoallw() |
--When packing is used--
MPI Datatypes (no packing) sendfirst merge packtogether persistent* -vecscatter_
Message passing Send p X X X always
Ssend p X X X always _ssend
Rsend p nonsense X X always _rsend
AlltoAll v or w X nonsense always X nonsense _alltoall
MPI_Win p nonsense p p nonsense _window
-vecscatter_ _nopack _sendfirst _merge _packtogether
$ Since persistent sends and receives require a constant memory address they can only be used when data is packed into the work vector
because the in and out array may be different for each call to VecScatterBegin/End().
p indicates possible, but not implemented. X indicates implemented
VecScatter VecScatterCreate(Vec x,Vec y,IS is) | -> | VecScatterCreate(x,PETSC_NULL,y,is,&s); return s; | |||
  VecScatterCreate(Vec x,Vec y,IS is,VecScatter *s) | -> | VecScatterCreate(x,PETSC_NULL,y,is,s) | |||
VecScatter VecScatterCreate(Vec x,IS is,Vec y) | -> | VecScatterCreate(x,is,y,PETSC_NULL,&s); return s; | |||
  VecScatterCreate(Vec x,IS is,Vec y,VecScatter *s) | -> | VecScatterCreate(x,is,y,PETSC_NULL,s) | |||
VecScatter VecScatterCreate(Vec x,IS is1,Vec y,IS is2) | -> | VecScatterCreate(x,is1,y,is2,&s); return s; |
Currently the MPI_Send(), MPI_Ssend() and MPI_Rsend() all use PERSISTENT versions. (this unfortunately requires that the same in and out arrays be used for each use, this is why when no using MPI_alltoallw() we always need to pack the input into the work array before sending and unpack upon recieving instead of using MPI datatypes to avoid the packing/unpacking).
Level:intermediate
Location:src/vec/vec/utils/vscat.c
Index of all Vec routines
Table of Contents for all manual pages
Index of all manual pages