- publishing free software manuals
Valgrind 3.3 - Advanced Debugging and Profiling for GNU/Linux applications
by J. Seward, N. Nethercote, J. Weidendorfer and the Valgrind Development Team
Paperback (6"x9"), 164 pages
ISBN 0954612051
RRP £12.95 ($19.95)

Get a printed copy>>>

5.8.5 Writing new MPI function wrappers

For the most part the wrappers are straightforward. The only significant complexity arises with nonblocking receives.

The issue is that ‘MPI_Irecv’ states the recv buffer and returns immediately, giving a handle (‘MPI_Request’) for the transaction. Later the user will have to poll for completion with ‘MPI_Wait’ etc, and when the transaction completes successfully, the wrappers have to paint the recv buffer. But the recv buffer details are not presented to ‘MPI_Wait’---only the handle is. The library therefore maintains a shadow table which associates uncompleted ‘MPI_Request’s with the corresponding buffer address/count/type. When an operation completes, the table is searched for the associated address/count/type info, and memory is marked accordingly.

Access to the table is guarded by a (POSIX pthreads) lock, so as to make the library thread-safe.

The table is allocated with ‘malloc’ and never ‘free’d, so it will show up in leak checks.

Writing new wrappers should be fairly easy. The source file is ‘auxprogs/libmpiwrap.c’. If possible, find an existing wrapper for a function of similar behaviour to the one you want to wrap, and use it as a starting point. The wrappers are organised in sections in the same order as the MPI 1.1 spec, to aid navigation. When adding a wrapper, remember to comment out the definition of the default wrapper in the long list of defaults at the bottom of the file (do not remove it, just comment it out).

ISBN 0954612051Valgrind 3.3 - Advanced Debugging and Profiling for GNU/Linux applicationsSee the print edition