Fredrik,

    This question belongs on petsc-dev at mcs.anl.gov since it involves 
additions/extensions to PETSc so I am moving the discussion over to there.

    We have not done the required work to have ghosted vectors work with CUSP 
yet, so this will require some additions to PETSc. We can help you with that 
process but since the PETSc team does not have a CUSP person developing PETSc 
full time you will need to actual contribute some code but I'll try to guide 
you in the right direction.

     The first observation is that ghosted vectors in PETSc are actually 
handled with largely the same code as VECMPI vectors (with just no ghost points 
by default) so in theory little work needs to be done to get the functionality 
you need. What makes the needed changes non-trivial is the current interface 
where one calls VecCreateGhost() to create the vectors.   This is one of our 
"easy" interfaces and it is somewhat legacy in that there is no way to control 
the types of the vectors since it creates everything about the vector in one 
step.   Note that we have the same issues with regard to the pthread versions 
of the PETSc vectors and ghosting.

    So before we even talk about what code to change/add we need to decide on 
the interface.  Presumably you want to be able to decide at runtime whether to 
use regular VECMPI, VECMPICUSP or VECMPIPTHREAD  in your ghosted vectors. How 
do we get that information in there? An additional argument to VecCreateGhost() 
(ugly?)? Options database (by calling VecSetFromOptions() ?), other ways?  So 
for example one could have:

VecCreateGhost(......)
VecSetFromOptions(......)

to set the specific type cusp or pthread? What about 

VecCreateGhost(......)
VecSetType(......,VECMPICUSP);   

which as you note doesn't currently work. Note that the PTHREAD version needs 
to do its own memory allocation so essentially has to undo much of what 
VecCreateGhost() already did, is that a bad thing?

Or do we get rid of VecCreateGhost() completely and change the model to 
something like

VecCreate()
VecSetType()
VecSetGhosted()

or 

VecCreate()
VecSetTypeFromOptions()
VecSetGhosted()

or even 

VecCreate()
VecSetGhosted()   which will just default to regular MPI ghosted.

this model allows a clean implementation that doesn't require undoing 
previously built internals.


Everyone chime in with observations so we can figure out any refactorizations 
needed.

   Barry





On Feb 6, 2012, at 8:33 AM, Fredrik Heffer Valdmanis wrote:

> Hi,
> 
> In FEniCS, we use ghosted vectors for parallel computations, with the 
> functions
> 
> VecCreateGhost
> VecGhostGetLocalForm
> 
> As I am integrating the new GPU-based vectors and matrices in FEniCS, I want 
> the ghosted vectors to be of type VECMPICUSP. I have tried to do this by 
> calling VecSetType after creating the vector, but that makes 
> VecGhostGetLocalForm give an error. 
> 
> Is it possible to set the type to be mpicusp when using ghost vectors, 
> without changing much of the code? If so, how?
> 
> If not, how would you recommend I proceed to work with mpicusp vectors in 
> this context?
> 
> Thanks!
> 
> -- 
> Fredrik


Reply via email to