Broadcasting packed objects

59 views
Skip to first unread message

Maurice Rohracker

unread,
Jun 8, 2020, 6:46:53 AM6/8/20
to deal.II User Group
Dear deal.II community,

For a distributed implementation, we would like to broadcast packed data objects.

For the beginning, we would like to understand how the serialize function for packing an object is working in the sense of the deal.II way, before it is getting more complicated.

I created a small test with a class, which should be broadcasted. As a comparison, I took the dealii:Point<dim>, which can obviously be packed and broadcasted without any issues.

Unfortunately, the broadcast for our class does not work. We assume that our serialize function is not in the correct manner. Is it possible to pack own objects using the dealii::Utilities:pack() function? What is the proper way defining the serialize function?

Attached you'll find our small example code. We are using deal.II 9.0.1.

Thank you very much in advance.

Best regards,
Maurice Rohracker
Master Student Computational Engineering
FAU Erlange-Nürnberg
CMakeLists.txt
Room.h
serializationTestMain.cpp

peterrum

unread,
Jun 8, 2020, 8:19:25 AM6/8/20
to deal.II User Group
Dear Maurice,

The problem is that the size of `auto buffer = dealii::Utilities::pack(r1);` is not the same on all processes, which is a requirement if you use `MPI_Bcast`. My suggestion would to split the procedure into two steps: 1) bcast the size on rank 1; 2) bcast the actual data.

Peter

peterrum

unread,
Jun 8, 2020, 4:56:15 PM6/8/20
to deal.II User Group
What you could also do is to turn compression off.

Peter

Maurice Rohracker

unread,
Jun 9, 2020, 4:53:27 PM6/9/20
to deal.II User Group
Thanks, Peter, that helped so far!

Another question would be, how would then the serialize function look like if one has another class as a member of a class. So, in this case, how would the serialize function look like if one has a class House and two of its member are of the type Room?
A serializing of nested objects so to speak.

Wolfgang Bangerth

unread,
Jun 9, 2020, 6:52:37 PM6/9/20
to dea...@googlegroups.com
On 6/9/20 2:53 PM, Maurice Rohracker wrote:
> Thanks, Peter, that helped so far!
>
> Another question would be, how would then the serialize function look like if
> one has another class as a member of a class. So, in this case, how would the
> serialize function look like if one has a class House and two of its member
> are of the type Room?
> A serializing of nested objects so to speak.

The pack()/unpack() functions make use of the fact that many of the deal.II
classes have save()/load() functions (sometimes combined into a serialize()
function) that recursively save/load/serialize the member variables of these
classes. Here is an example:
https://github.com/dealii/dealii/blob/master/include/deal.II/grid/tria.h#L4030-L4062

In these functions, operator& is used to serialize variables into/out of the
given stream. If these variables are themselves classes, then that just calls
these classes' respective save/load/serialize functions.

Best
W.

--
------------------------------------------------------------------------
Wolfgang Bangerth email: bang...@colostate.edu
www: http://www.math.colostate.edu/~bangerth/

Reply all
Reply to author
Forward
0 new messages