1c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 2c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---------------------------------------------------------------*/ 3c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- ---*/ 4157a8c40575f4ce99c36a91434a43afd4db13717sewardj/*--- A library of wrappers for MPI 2 functions. ---*/ 5c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- ---*/ 6c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---------------------------------------------------------------*/ 7c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 8c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* ---------------------------------------------------------------- 9c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 10c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj Notice that the following BSD-style license applies to this one 11c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj file (mpiwrap.c) only. The rest of Valgrind is licensed under the 12c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj terms of the GNU General Public License, version 2, unless 13c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj otherwise indicated. See the COPYING file in the source 14c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj distribution for details. 15c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 16c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj ---------------------------------------------------------------- 17c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 18c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj This file is part of Valgrind, a dynamic binary instrumentation 19c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj framework. 20c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 210f157ddb404bcde7815a1c5bf2d7e41c114f3d73sewardj Copyright (C) 2006-2013 OpenWorks LLP. All rights reserved. 22c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 23c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj Redistribution and use in source and binary forms, with or without 24c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj modification, are permitted provided that the following conditions 25c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj are met: 26c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 27c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1. Redistributions of source code must retain the above copyright 28c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj notice, this list of conditions and the following disclaimer. 29c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 30c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 2. The origin of this software must not be misrepresented; you must 31c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj not claim that you wrote the original software. If you use this 32c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj software in a product, an acknowledgment in the product 33c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj documentation would be appreciated but is not required. 34c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 35c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 3. Altered source versions must be plainly marked as such, and must 36c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj not be misrepresented as being the original software. 37c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 38c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 4. The name of the author may not be used to endorse or promote 39c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj products derived from this software without specific prior written 40c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj permission. 41c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 42c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 43c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 44c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 45c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 46c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 47c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 48c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 49c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 50c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 51c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 52c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 53c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 54c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj Neither the names of the U.S. Department of Energy nor the 55c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj University of California nor the names of its contributors may be 56c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj used to endorse or promote products derived from this software 57c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj without prior written permission. 58c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj*/ 59c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 60753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj/* Handling of MPI_STATUS{ES}_IGNORE for MPI_Status* arguments. 61753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj 62753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj The MPI-2 spec allows many functions which have MPI_Status* purely 63753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj as an out parameter, to accept the constants MPI_STATUS_IGNORE or 64753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj MPI_STATUSES_IGNORE there instead, if the caller does not care 65753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj about the status. See the MPI-2 spec sec 4.5.1 ("Passing 66753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj MPI_STATUS_IGNORE for Status"). (mpi2-report.pdf, 1615898 bytes, 67753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj md5=694a5efe2fd291eecf7e8c9875b5f43f). 68753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj 69753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj This library handles such cases by allocating a fake MPI_Status 70753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj object (on the stack) or an array thereof (on the heap), and 71753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj passing that onwards instead. From the outside the caller sees no 72753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj difference. Unfortunately the simpler approach of merely detecting 73753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj and handling these special cases at a lower level does not work, 74753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj because we need to use information returned in MPI_Status* 75753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj arguments to paint result buffers, even if the caller doesn't 76753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj supply a real MPI_Status object. 77753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj 78753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj Eg, MPI_Recv. We can't paint the result buffer without knowing how 79753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj many items arrived; but we can't find that out without passing a 80753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj real MPI_Status object to the (real) MPI_Recv call. Hence, if the 81753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj caller did not supply one, we have no option but to use a temporary 82753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj stack allocated one for the inner call. Ditto, more indirectly 83753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj (via maybe_complete) for nonblocking receives and the various 84753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj associated wait/test calls. */ 85753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj 86c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 87c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 88c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- includes ---*/ 89c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 90c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 91c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj#include <stdio.h> 92c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj#include <assert.h> 93c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj#include <unistd.h> /* getpid */ 94c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj#include <stdlib.h> /* exit */ 95c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj#include <string.h> /* strstr */ 96c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj#include <pthread.h> /* pthread_mutex_{lock,unlock} */ 97c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 98c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* Include Valgrind magic macros for writing wrappers. */ 99209740130b440ab0ed1a37010ca17031e61caa17sewardj#include "../memcheck/memcheck.h" 100c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 101dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj/* Include macros for VALGRIND_{DIS,EN}ABLE_ERROR_REPORTING. 102dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj This is somewhat experimental and hence disable-able, by 103dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj setting cONFIG_DER to zero. */ 104dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj#include "../include/valgrind.h" 105dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj 106dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj#define cONFIG_DER 1 /* set to 0 to disable */ 107dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj 108c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 109c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 110c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Connect to MPI library ---*/ 111c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 112c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 113c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* Include headers for whatever MPI implementation the wrappers are to 11480637751e7c438c7ed679ac2094c6c205882f0cesewardj be used with. The configure system will tell us what the path to 11580637751e7c438c7ed679ac2094c6c205882f0cesewardj the chosen MPI implementation is, via -I.. to the compiler. */ 116c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj#include "mpi.h" 117c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 118c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* Where are API symbols? 119abbad834efb4e359020d79961c9214cac817aea5sewardj Open MPI lib/libmpi.so, soname = libmpi.so.0 120abbad834efb4e359020d79961c9214cac817aea5sewardj Quadrics MPI lib/libmpi.so, soname = libmpi.so.0 121abbad834efb4e359020d79961c9214cac817aea5sewardj MPICH libmpich.so.1.0, soname = libmpich.so.1.0 122abbad834efb4e359020d79961c9214cac817aea5sewardj 1236e9de463ef677f093e9f24f126e1b11c28cf59fdsewardj A suitable soname to match with is therefore "libmpi*.so*". 124c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj*/ 1256e9de463ef677f093e9f24f126e1b11c28cf59fdsewardj#define I_WRAP_FNNAME_U(_name) \ 1266e9de463ef677f093e9f24f126e1b11c28cf59fdsewardj I_WRAP_SONAME_FNNAME_ZU(libmpiZaZdsoZa,_name) 127c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 128cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj 129753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj/* Define HAVE_MPI_STATUS_IGNORE iff we have to deal with 130753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj MPI_STATUS{ES}_IGNORE. */ 131753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj#if MPI_VERSION >= 2 \ 132753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj || (defined(MPI_STATUS_IGNORE) && defined(MPI_STATUSES_IGNORE)) 133753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj# undef HAVE_MPI_STATUS_IGNORE 134753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj# define HAVE_MPI_STATUS_IGNORE 1 135753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj#else 136753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj# undef HAVE_MPI_STATUS_IGNORE 137753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj#endif 138753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj 139753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj 140c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 141c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Decls ---*/ 142c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 143c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 144c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjtypedef unsigned char Bool; 145c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj#define False ((Bool)0) 146c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj#define True ((Bool)1) 147c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 14863daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* Word, UWord are machine words - same size as a pointer. This is 14963daa8afee0bf09c5527975d14f884d98ee77f9esewardj checked at startup. The wrappers below use 'long' to mean a 15063daa8afee0bf09c5527975d14f884d98ee77f9esewardj machine word - this too is tested at startup. */ 15163daa8afee0bf09c5527975d14f884d98ee77f9esewardjtypedef signed long Word; 15263daa8afee0bf09c5527975d14f884d98ee77f9esewardjtypedef unsigned long UWord; 15363daa8afee0bf09c5527975d14f884d98ee77f9esewardj 154cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj#if !defined(offsetof) 155cbc2e0e2161539f16906082b35653d81fc2fef02sewardj# define offsetof(type,memb) ((UWord)&((type*)0)->memb) 156cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj#endif 157cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj 158cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj/* Find the size of long double image (not 'sizeof(long double)'). 159cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj See comments in sizeofOneNamedTy. */ 160cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardjstatic long sizeof_long_double_image ( void ); 161cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj 162c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 163c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 164c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Simple helpers ---*/ 165c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 166c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 167c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* ------ Helpers for debug printing ------ */ 168c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 169c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* constant */ 170c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjstatic const char* preamble = "valgrind MPI wrappers"; 171c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 172c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* established at startup */ 173d465d99e1db7ab81b09446a7b47688ef14c4f124sewardjstatic pid_t my_pid = -1; 174d465d99e1db7ab81b09446a7b47688ef14c4f124sewardjstatic char* options_str = NULL; 175d465d99e1db7ab81b09446a7b47688ef14c4f124sewardjstatic int opt_verbosity = 1; 176d465d99e1db7ab81b09446a7b47688ef14c4f124sewardjstatic Bool opt_missing = 0; /* 0:silent; 1:warn; 2:abort */ 177d465d99e1db7ab81b09446a7b47688ef14c4f124sewardjstatic Bool opt_help = False; 178d465d99e1db7ab81b09446a7b47688ef14c4f124sewardjstatic Bool opt_initkludge = False; 179c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1809c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjstatic void before ( char* fnname ) 181c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 182c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj /* This isn't thread-safe wrt 'done' (no locking). It's not 183c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj critical. */ 184c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj static int done = 0; 185c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (done == 0) { 186c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj done = 1; 187c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj my_pid = getpid(); 188c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj options_str = getenv("MPIWRAP_DEBUG"); 189ec8b614219f9746385ee7d0bc20e209302713f68sewardj if (options_str) { 19063daa8afee0bf09c5527975d14f884d98ee77f9esewardj if (NULL != strstr(options_str, "warn")) 19163daa8afee0bf09c5527975d14f884d98ee77f9esewardj opt_missing = 1; 19263daa8afee0bf09c5527975d14f884d98ee77f9esewardj if (NULL != strstr(options_str, "strict")) 19363daa8afee0bf09c5527975d14f884d98ee77f9esewardj opt_missing = 2; 194ec8b614219f9746385ee7d0bc20e209302713f68sewardj if (NULL != strstr(options_str, "verbose")) 195ec8b614219f9746385ee7d0bc20e209302713f68sewardj opt_verbosity++; 196ec8b614219f9746385ee7d0bc20e209302713f68sewardj if (NULL != strstr(options_str, "quiet")) 197ec8b614219f9746385ee7d0bc20e209302713f68sewardj opt_verbosity--; 19863daa8afee0bf09c5527975d14f884d98ee77f9esewardj if (NULL != strstr(options_str, "help")) 19963daa8afee0bf09c5527975d14f884d98ee77f9esewardj opt_help = True; 200d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj if (NULL != strstr(options_str, "initkludge")) 201d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj opt_initkludge = True; 202ec8b614219f9746385ee7d0bc20e209302713f68sewardj } 203ec8b614219f9746385ee7d0bc20e209302713f68sewardj if (opt_verbosity > 0) 204ec8b614219f9746385ee7d0bc20e209302713f68sewardj fprintf(stderr, "%s %5d: Active for pid %d\n", 205ec8b614219f9746385ee7d0bc20e209302713f68sewardj preamble, my_pid, my_pid); 20663daa8afee0bf09c5527975d14f884d98ee77f9esewardj /* Sanity check - that Word/UWord really are machine words. */ 20763daa8afee0bf09c5527975d14f884d98ee77f9esewardj assert(sizeof(Word) == sizeof(void*)); 20863daa8afee0bf09c5527975d14f884d98ee77f9esewardj assert(sizeof(UWord) == sizeof(void*)); 209301a50f9bddfaf2c894031d9750282d69bf2103csewardj /* Sanity check - char is byte-sized (else address calculations 210301a50f9bddfaf2c894031d9750282d69bf2103csewardj in walk_type don't work. */ 211301a50f9bddfaf2c894031d9750282d69bf2103csewardj assert(sizeof(char) == 1); 212c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (opt_help) { 213c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj fprintf(stderr, "\n"); 214c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj fprintf(stderr, "Valid options for the MPIWRAP_DEBUG environment" 215c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj " variable are:\n"); 216c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj fprintf(stderr, "\n"); 217d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj fprintf(stderr, " quiet be silent except for errors\n"); 218d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj fprintf(stderr, " verbose show wrapper entries/exits\n"); 219d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj fprintf(stderr, " strict abort the program if a function" 220c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj " with no wrapper is used\n"); 221d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj fprintf(stderr, " warn give a warning if a function" 22263daa8afee0bf09c5527975d14f884d98ee77f9esewardj " with no wrapper is used\n"); 223d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj fprintf(stderr, " help display this message, then exit\n"); 224d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj fprintf(stderr, " initkludge debugging hack; do not use\n"); 225c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj fprintf(stderr, "\n"); 226c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj fprintf(stderr, "Multiple options are allowed, eg" 227c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj " MPIWRAP_DEBUG=strict,verbose\n"); 22863daa8afee0bf09c5527975d14f884d98ee77f9esewardj fprintf(stderr, "Note: 'warn' generates output even if 'quiet'" 22963daa8afee0bf09c5527975d14f884d98ee77f9esewardj " is also specified\n"); 230c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj fprintf(stderr, "\n"); 231c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj fprintf(stderr, "%s %5d: exiting now\n", preamble, my_pid ); 232c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj exit(1); 233c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 234ec8b614219f9746385ee7d0bc20e209302713f68sewardj if (opt_verbosity > 0) 235ec8b614219f9746385ee7d0bc20e209302713f68sewardj fprintf(stderr, 236ec8b614219f9746385ee7d0bc20e209302713f68sewardj "%s %5d: Try MPIWRAP_DEBUG=help for possible options\n", 237ec8b614219f9746385ee7d0bc20e209302713f68sewardj preamble, my_pid); 238c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 239c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 240ec8b614219f9746385ee7d0bc20e209302713f68sewardj if (opt_verbosity > 1) 241c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj fprintf(stderr, "%s %5d: enter PMPI_%s\n", preamble, my_pid, fnname ); 242c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 243c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 244d465d99e1db7ab81b09446a7b47688ef14c4f124sewardjstatic __inline__ void after ( char* fnname, int err ) 245c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 246ec8b614219f9746385ee7d0bc20e209302713f68sewardj if (opt_verbosity > 1) 247c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj fprintf(stderr, "%s %5d: exit PMPI_%s (err = %d)\n", 248c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj preamble, my_pid, fnname, err ); 249c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 250c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 251c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjstatic void barf ( char* msg ) 252c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 253c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj fprintf(stderr, "%s %5d: fatal: %s\n", preamble, my_pid, msg); 254c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj fprintf(stderr, "%s %5d: exiting now\n", preamble, my_pid ); 255c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj exit(1); 256c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 257c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 258533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj/* Half-hearted type-showing function (for debugging). */ 259533bfda1c401c38de38a8c12111ab2cb9346eec5sewardjstatic void showTy ( FILE* f, MPI_Datatype ty ) 260533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj{ 261533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj if (ty == MPI_DATATYPE_NULL) fprintf(f,"DATATYPE_NULL"); 262533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj else if (ty == MPI_BYTE) fprintf(f,"BYTE"); 263533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj else if (ty == MPI_PACKED) fprintf(f,"PACKED"); 264533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj else if (ty == MPI_CHAR) fprintf(f,"CHAR"); 265533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj else if (ty == MPI_SHORT) fprintf(f,"SHORT"); 266533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj else if (ty == MPI_INT) fprintf(f,"INT"); 267533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj else if (ty == MPI_LONG) fprintf(f,"LONG"); 268533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj else if (ty == MPI_FLOAT) fprintf(f,"FLOAT"); 269533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj else if (ty == MPI_DOUBLE) fprintf(f,"DOUBLE"); 270533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj else if (ty == MPI_LONG_DOUBLE) fprintf(f,"LONG_DOUBLE"); 271533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj else if (ty == MPI_UNSIGNED_CHAR) fprintf(f,"UNSIGNED_CHAR"); 272533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj else if (ty == MPI_UNSIGNED_SHORT) fprintf(f,"UNSIGNED_SHORT"); 273533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj else if (ty == MPI_UNSIGNED_LONG) fprintf(f,"UNSIGNED_LONG"); 274533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj else if (ty == MPI_UNSIGNED) fprintf(f,"UNSIGNED"); 275533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj else if (ty == MPI_FLOAT_INT) fprintf(f,"FLOAT_INT"); 276533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj else if (ty == MPI_DOUBLE_INT) fprintf(f,"DOUBLE_INT"); 277533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj else if (ty == MPI_LONG_DOUBLE_INT) fprintf(f,"LONG_DOUBLE_INT"); 278533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj else if (ty == MPI_LONG_INT) fprintf(f,"LONG_INT"); 279533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj else if (ty == MPI_SHORT_INT) fprintf(f,"SHORT_INT"); 280533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj else if (ty == MPI_2INT) fprintf(f,"2INT"); 281533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj else if (ty == MPI_UB) fprintf(f,"UB"); 282533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj else if (ty == MPI_LB) fprintf(f,"LB"); 283533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj# if defined(MPI_WCHAR) 284533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj else if (ty == MPI_WCHAR) fprintf(f,"WCHAR"); 285533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj# endif 286533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj else if (ty == MPI_LONG_LONG_INT) fprintf(f,"LONG_LONG_INT"); 28787f75f7f6196345db089f9334fbcdacd96b060d8sewardj# if defined(MPI_LONG_LONG) 288533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj else if (ty == MPI_LONG_LONG) fprintf(f,"LONG_LONG"); 28987f75f7f6196345db089f9334fbcdacd96b060d8sewardj# endif 290582031ba14f3e7f6f8579dd6f368c8013c5b40fbsewardj# if defined(MPI_UNSIGNED_LONG_LONG) 291533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj else if (ty == MPI_UNSIGNED_LONG_LONG) fprintf(f,"UNSIGNED_LONG_LONG"); 292582031ba14f3e7f6f8579dd6f368c8013c5b40fbsewardj# endif 293443aa37437f8637e8842ada083a400c5578a2d8asewardj# if defined(MPI_REAL8) 294443aa37437f8637e8842ada083a400c5578a2d8asewardj else if (ty == MPI_REAL8) fprintf(f, "REAL8"); 295443aa37437f8637e8842ada083a400c5578a2d8asewardj# endif 296443aa37437f8637e8842ada083a400c5578a2d8asewardj# if defined(MPI_REAL4) 297443aa37437f8637e8842ada083a400c5578a2d8asewardj else if (ty == MPI_REAL4) fprintf(f, "REAL4"); 298443aa37437f8637e8842ada083a400c5578a2d8asewardj# endif 299a7802967336adb950dcfb71f152759e45ea16e4bsewardj# if defined(MPI_REAL) 300a7802967336adb950dcfb71f152759e45ea16e4bsewardj else if (ty == MPI_REAL) fprintf(f, "REAL"); 301a7802967336adb950dcfb71f152759e45ea16e4bsewardj# endif 302443aa37437f8637e8842ada083a400c5578a2d8asewardj# if defined(MPI_INTEGER8) 303443aa37437f8637e8842ada083a400c5578a2d8asewardj else if (ty == MPI_INTEGER8) fprintf(f, "INTEGER8"); 304443aa37437f8637e8842ada083a400c5578a2d8asewardj# endif 305443aa37437f8637e8842ada083a400c5578a2d8asewardj# if defined(MPI_INTEGER4) 306443aa37437f8637e8842ada083a400c5578a2d8asewardj else if (ty == MPI_INTEGER4) fprintf(f, "INTEGER4"); 307443aa37437f8637e8842ada083a400c5578a2d8asewardj# endif 308a7802967336adb950dcfb71f152759e45ea16e4bsewardj# if defined(MPI_INTEGER) 309a7802967336adb950dcfb71f152759e45ea16e4bsewardj else if (ty == MPI_INTEGER) fprintf(f, "INTEGER"); 310a7802967336adb950dcfb71f152759e45ea16e4bsewardj# endif 311a8c487f6ba9811fdc483ff02925dd34f93be09basewardj# if defined(MPI_DOUBLE_PRECISION) 312a8c487f6ba9811fdc483ff02925dd34f93be09basewardj else if (ty == MPI_DOUBLE_PRECISION) fprintf(f, "DOUBLE_PRECISION"); 313a8c487f6ba9811fdc483ff02925dd34f93be09basewardj# endif 314a7802967336adb950dcfb71f152759e45ea16e4bsewardj# if defined(MPI_COMPLEX) 315a7802967336adb950dcfb71f152759e45ea16e4bsewardj else if (ty == MPI_COMPLEX) fprintf(f, "COMPLEX"); 316a7802967336adb950dcfb71f152759e45ea16e4bsewardj# endif 317a7802967336adb950dcfb71f152759e45ea16e4bsewardj# if defined(MPI_DOUBLE_COMPLEX) 318a7802967336adb950dcfb71f152759e45ea16e4bsewardj else if (ty == MPI_DOUBLE_COMPLEX) fprintf(f, "DOUBLE_COMPLEX"); 319a7802967336adb950dcfb71f152759e45ea16e4bsewardj# endif 320a7802967336adb950dcfb71f152759e45ea16e4bsewardj# if defined(MPI_LOGICAL) 321a7802967336adb950dcfb71f152759e45ea16e4bsewardj else if (ty == MPI_LOGICAL) fprintf(f, "LOGICAL"); 322a7802967336adb950dcfb71f152759e45ea16e4bsewardj# endif 323a7802967336adb950dcfb71f152759e45ea16e4bsewardj# if defined(MPI_2INTEGER) 324a7802967336adb950dcfb71f152759e45ea16e4bsewardj else if (ty == MPI_2INTEGER) fprintf(f, "2INTEGER"); 325a7802967336adb950dcfb71f152759e45ea16e4bsewardj# endif 326a7802967336adb950dcfb71f152759e45ea16e4bsewardj# if defined(MPI_2COMPLEX) 327a7802967336adb950dcfb71f152759e45ea16e4bsewardj else if (ty == MPI_2COMPLEX) fprintf(f, "2COMPLEX"); 328a7802967336adb950dcfb71f152759e45ea16e4bsewardj# endif 329a7802967336adb950dcfb71f152759e45ea16e4bsewardj# if defined(MPI_2DOUBLE_COMPLEX) 330a7802967336adb950dcfb71f152759e45ea16e4bsewardj else if (ty == MPI_2DOUBLE_COMPLEX) fprintf(f, "2DOUBLE_COMPLEX"); 331a7802967336adb950dcfb71f152759e45ea16e4bsewardj# endif 332a7802967336adb950dcfb71f152759e45ea16e4bsewardj# if defined(MPI_2REAL) 333a7802967336adb950dcfb71f152759e45ea16e4bsewardj else if (ty == MPI_2REAL) fprintf(f, "2REAL"); 334a7802967336adb950dcfb71f152759e45ea16e4bsewardj# endif 335a7802967336adb950dcfb71f152759e45ea16e4bsewardj# if defined(MPI_2DOUBLE_PRECISION) 336a7802967336adb950dcfb71f152759e45ea16e4bsewardj else if (ty == MPI_2DOUBLE_PRECISION) fprintf(f, "2DOUBLE_PRECISION"); 337a7802967336adb950dcfb71f152759e45ea16e4bsewardj# endif 338a7802967336adb950dcfb71f152759e45ea16e4bsewardj# if defined(MPI_CHARACTER) 339a7802967336adb950dcfb71f152759e45ea16e4bsewardj else if (ty == MPI_CHARACTER) fprintf(f, "CHARACTER"); 340a7802967336adb950dcfb71f152759e45ea16e4bsewardj# endif 341533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj else fprintf(f,"showTy:???"); 342533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj} 343533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj 344533bfda1c401c38de38a8c12111ab2cb9346eec5sewardjstatic void showCombiner ( FILE* f, int combiner ) 345533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj{ 346533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj switch (combiner) { 347533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj case MPI_COMBINER_NAMED: fprintf(f, "NAMED"); break; 348cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#if defined(MPI_COMBINER_DUP) 349533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj case MPI_COMBINER_DUP: fprintf(f, "DUP"); break; 350cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj# endif 351533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj case MPI_COMBINER_CONTIGUOUS: fprintf(f, "CONTIGUOUS"); break; 352533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj case MPI_COMBINER_VECTOR: fprintf(f, "VECTOR"); break; 353cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#if defined(MPI_COMBINER_HVECTOR_INTEGER) 354533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj case MPI_COMBINER_HVECTOR_INTEGER: fprintf(f, "HVECTOR_INTEGER"); break; 355cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj# endif 356533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj case MPI_COMBINER_HVECTOR: fprintf(f, "HVECTOR"); break; 357533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj case MPI_COMBINER_INDEXED: fprintf(f, "INDEXED"); break; 358cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#if defined(MPI_COMBINER_HINDEXED_INTEGER) 359533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj case MPI_COMBINER_HINDEXED_INTEGER: fprintf(f, "HINDEXED_INTEGER"); break; 360cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj# endif 361533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj case MPI_COMBINER_HINDEXED: fprintf(f, "HINDEXED"); break; 362cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#if defined(MPI_COMBINER_INDEXED_BLOCK) 363533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj case MPI_COMBINER_INDEXED_BLOCK: fprintf(f, "INDEXED_BLOCK"); break; 364cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj# endif 365cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#if defined(MPI_COMBINER_STRUCT_INTEGER) 366533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj case MPI_COMBINER_STRUCT_INTEGER: fprintf(f, "STRUCT_INTEGER"); break; 367cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj# endif 368533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj case MPI_COMBINER_STRUCT: fprintf(f, "STRUCT"); break; 369cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#if defined(MPI_COMBINER_SUBARRAY) 370533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj case MPI_COMBINER_SUBARRAY: fprintf(f, "SUBARRAY"); break; 371cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj# endif 372cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#if defined(MPI_COMBINER_DARRAY) 373533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj case MPI_COMBINER_DARRAY: fprintf(f, "DARRAY"); break; 374cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj# endif 375cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#if defined(MPI_COMBINER_F90_REAL) 376533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj case MPI_COMBINER_F90_REAL: fprintf(f, "F90_REAL"); break; 377cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj# endif 378cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#if defined(MPI_COMBINER_F90_COMPLEX) 379533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj case MPI_COMBINER_F90_COMPLEX: fprintf(f, "F90_COMPLEX"); break; 380cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj# endif 381cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#if defined(MPI_COMBINER_F90_INTEGER) 382533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj case MPI_COMBINER_F90_INTEGER: fprintf(f, "F90_INTEGER"); break; 383cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj# endif 384cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj#if defined(MPI_COMBINER_RESIZED) 385533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj case MPI_COMBINER_RESIZED: fprintf(f, "RESIZED"); break; 386cc8c39945ff9b70d7c1c51205f96abd911da4c33sewardj# endif 387533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj default: fprintf(f, "showCombiner:??"); break; 388533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj } 389533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj} 390533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj 391533bfda1c401c38de38a8c12111ab2cb9346eec5sewardj 392c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* ------ Get useful bits of info ------ */ 393c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 394c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* Note, PMPI_Comm_rank/size are themselves wrapped. Should work 395c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj fine. */ 396c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 397d465d99e1db7ab81b09446a7b47688ef14c4f124sewardjstatic __inline__ int comm_rank ( MPI_Comm comm ) 398c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 399c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int err, r; 400c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj err = PMPI_Comm_rank(comm, &r); 401c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj return err ? 0/*arbitrary*/ : r; 402c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 403c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 404d465d99e1db7ab81b09446a7b47688ef14c4f124sewardjstatic __inline__ int comm_size ( MPI_Comm comm ) 405c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 406c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int err, r; 407c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj err = PMPI_Comm_size(comm, &r); 408c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj return err ? 0/*arbitrary*/ : r; 409c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 410c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 411d465d99e1db7ab81b09446a7b47688ef14c4f124sewardjstatic __inline__ Bool count_from_Status( /*OUT*/int* recv_count, 412c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj MPI_Datatype datatype, 413c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj MPI_Status* status) 414c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 415c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int n; 41626c60a8706eb45cbf303437adc87e313e104d4efsewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 417c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int err = PMPI_Get_count(status, datatype, &n); 41826c60a8706eb45cbf303437adc87e313e104d4efsewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 419c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (err == MPI_SUCCESS) { 420c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj *recv_count = n; 421c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj return True; 422c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } else { 423c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj return False; 424c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 425c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 426c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 427c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* It's critical that we can do equality on MPI_Requests. 428c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj Unfortunately these are opaque objects to us (handles, in the 429c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj parlance of the MPI 1.1 spec). Fortunately Sec 2.4.1 ("Opaque 430c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj Objects") specifies that "In C, [...] These [handles] should be 431c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj types that support assignment and equality operations." Hence the 432c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj following function should compile for any compliant definition of 433c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj MPI_Request. */ 434d465d99e1db7ab81b09446a7b47688ef14c4f124sewardjstatic __inline__ 435c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjBool eq_MPI_Request ( MPI_Request r1, MPI_Request r2 ) 436c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 437c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj return r1 == r2; 438c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 439c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 440753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj/* Return True if status is MPI_STATUS_IGNORE or MPI_STATUSES_IGNORE. 441753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj On MPI-1.x platforms which don't have these symbols (and they would 442753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj only have them if they've been backported from 2.x) always return 443753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj False. */ 444753ab9ddc9605773accb060f2762c0eb063a0fc2sewardjstatic __inline__ 445753ab9ddc9605773accb060f2762c0eb063a0fc2sewardjBool isMSI ( MPI_Status* status ) 446753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj{ 447753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj# if defined(HAVE_MPI_STATUS_IGNORE) 448753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj return status == MPI_STATUSES_IGNORE || status == MPI_STATUS_IGNORE; 449753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj# else 450753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj return False; 451753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj# endif 452753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj} 453753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj 4548717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj/* Get the 'extent' of a type. Note, as per the MPI spec this 4558717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj includes whatever padding would be required when using 'ty' in an 4568717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj array. */ 457301a50f9bddfaf2c894031d9750282d69bf2103csewardjstatic long extentOfTy ( MPI_Datatype ty ) 458301a50f9bddfaf2c894031d9750282d69bf2103csewardj{ 459301a50f9bddfaf2c894031d9750282d69bf2103csewardj int r; 460301a50f9bddfaf2c894031d9750282d69bf2103csewardj MPI_Aint n; 461301a50f9bddfaf2c894031d9750282d69bf2103csewardj r = PMPI_Type_extent(ty, &n); 462301a50f9bddfaf2c894031d9750282d69bf2103csewardj assert(r == MPI_SUCCESS); 463301a50f9bddfaf2c894031d9750282d69bf2103csewardj return (long)n; 464301a50f9bddfaf2c894031d9750282d69bf2103csewardj} 465c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 466cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj/* Free up *ty, if it is safe to do so */ 467301a50f9bddfaf2c894031d9750282d69bf2103csewardjstatic void maybeFreeTy ( MPI_Datatype* ty ) 468301a50f9bddfaf2c894031d9750282d69bf2103csewardj{ 469301a50f9bddfaf2c894031d9750282d69bf2103csewardj int r, n_ints, n_addrs, n_dtys, tycon; 470c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 471301a50f9bddfaf2c894031d9750282d69bf2103csewardj r = PMPI_Type_get_envelope( *ty, &n_ints, &n_addrs, &n_dtys, &tycon ); 472301a50f9bddfaf2c894031d9750282d69bf2103csewardj assert(r == MPI_SUCCESS); 473c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 474cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj /* can't free named types */ 475cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj if (tycon == MPI_COMBINER_NAMED) 476cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj return; 477cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj 478cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj /* some kinds of structs are predefined so we can't free them 479cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj either. */ 480cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj if (*ty == MPI_FLOAT_INT || *ty == MPI_DOUBLE_INT 481cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj || *ty == MPI_LONG_INT || *ty == MPI_2INT 482cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj || *ty == MPI_SHORT_INT || *ty == MPI_LONG_DOUBLE_INT) 483cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj return; 484cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj 485cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj /* Looks OK - free it. */ 486cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj if (0) { 487cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj /* show me what you're about to free .. */ 488cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj fprintf(stderr, "freeing combiner "); 489cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj showCombiner(stderr,tycon); 490cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj fprintf(stderr, " ty= "); 491cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj showTy(stderr,*ty); 492cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj fprintf(stderr,"\n"); 493301a50f9bddfaf2c894031d9750282d69bf2103csewardj } 494cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj r = PMPI_Type_free(ty); 495cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj assert(r == MPI_SUCCESS); 496c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 497c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 4988717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj/* How big is a "named" (base) type? Returns 0 if not known. Note. 4998717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj There is a subtlety, which is that this is required to return the 5008717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj exact size of one item of the type, NOT the size of it when padded 5018717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj suitably to make an array of them. In particular that's why the 502cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj size of LONG_DOUBLE is computed by looking at the result of doing a 503cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj long double store, rather than just asking what is the sizeof(long 504cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj double). 505cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj 506cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj For LONG_DOUBLE on x86-linux and amd64-linux my impression is that 507cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj the right answer is 10 even though sizeof(long double) says 12 and 508cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj 16 respectively. On ppc32-linux it appears to be 16. 5093f55c9c5458230180cfd74079c31e0409ba65976sewardj 5103f55c9c5458230180cfd74079c31e0409ba65976sewardj Ref: MPI 1.1 doc p18 */ 5118717d1a523a9e64ce934d83833a4c55e2bcf737dsewardjstatic long sizeofOneNamedTy ( MPI_Datatype ty ) 5121646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj{ 513cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj if (ty == MPI_CHAR) return sizeof(signed char); 514cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj if (ty == MPI_SHORT) return sizeof(signed short int); 515cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj if (ty == MPI_INT) return sizeof(signed int); 516cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj if (ty == MPI_LONG) return sizeof(signed long int); 517c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj if (ty == MPI_UNSIGNED_CHAR) return sizeof(unsigned char); 518c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj if (ty == MPI_UNSIGNED_SHORT) return sizeof(unsigned short int); 519cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj if (ty == MPI_UNSIGNED) return sizeof(unsigned int); 520cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj if (ty == MPI_UNSIGNED_LONG) return sizeof(unsigned long int); 521cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj if (ty == MPI_FLOAT) return sizeof(float); 522cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj if (ty == MPI_DOUBLE) return sizeof(double); 523cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj if (ty == MPI_BYTE) return 1; 524cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj if (ty == MPI_LONG_DOUBLE) return sizeof_long_double_image(); 525ee3465927d146e6b632dc550e1f6f41867bb5321sewardj if (ty == MPI_PACKED) return 1; 526a7802967336adb950dcfb71f152759e45ea16e4bsewardj if (ty == MPI_LONG_LONG_INT) return sizeof(signed long long int); 527cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj 528443aa37437f8637e8842ada083a400c5578a2d8asewardj# if defined(MPI_REAL8) 529a7802967336adb950dcfb71f152759e45ea16e4bsewardj if (ty == MPI_REAL8) return 8; /* MPI2 spec */; 530443aa37437f8637e8842ada083a400c5578a2d8asewardj# endif 531443aa37437f8637e8842ada083a400c5578a2d8asewardj# if defined(MPI_REAL4) 532a7802967336adb950dcfb71f152759e45ea16e4bsewardj if (ty == MPI_REAL4) return 4; /* MPI2 spec */; 533a7802967336adb950dcfb71f152759e45ea16e4bsewardj# endif 534a7802967336adb950dcfb71f152759e45ea16e4bsewardj# if defined(MPI_REAL) 535a7802967336adb950dcfb71f152759e45ea16e4bsewardj if (ty == MPI_REAL) return 4; /* MPI2 spec */; 536443aa37437f8637e8842ada083a400c5578a2d8asewardj# endif 537443aa37437f8637e8842ada083a400c5578a2d8asewardj# if defined(MPI_INTEGER8) 538a7802967336adb950dcfb71f152759e45ea16e4bsewardj if (ty == MPI_INTEGER8) return 8; /* MPI2 spec */; 539443aa37437f8637e8842ada083a400c5578a2d8asewardj# endif 540443aa37437f8637e8842ada083a400c5578a2d8asewardj# if defined(MPI_INTEGER4) 541a7802967336adb950dcfb71f152759e45ea16e4bsewardj if (ty == MPI_INTEGER4) return 4; /* MPI2 spec */; 542a7802967336adb950dcfb71f152759e45ea16e4bsewardj# endif 543a7802967336adb950dcfb71f152759e45ea16e4bsewardj# if defined(MPI_INTEGER) 544a7802967336adb950dcfb71f152759e45ea16e4bsewardj if (ty == MPI_INTEGER) return 4; /* MPI2 spec */; 545443aa37437f8637e8842ada083a400c5578a2d8asewardj# endif 546a8c487f6ba9811fdc483ff02925dd34f93be09basewardj# if defined(MPI_DOUBLE_PRECISION) 547a7802967336adb950dcfb71f152759e45ea16e4bsewardj if (ty == MPI_DOUBLE_PRECISION) return 8; /* MPI2 spec */; 548a8c487f6ba9811fdc483ff02925dd34f93be09basewardj# endif 549443aa37437f8637e8842ada083a400c5578a2d8asewardj 550cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj /* new in MPI2: */ 551493743fe81c081d1ce3162ee01519fe450fbec8bsewardj# if defined(MPI_WCHAR) 552a7802967336adb950dcfb71f152759e45ea16e4bsewardj if (ty == MPI_WCHAR) return 2; /* MPI2 spec */; 553493743fe81c081d1ce3162ee01519fe450fbec8bsewardj# endif 554493743fe81c081d1ce3162ee01519fe450fbec8bsewardj# if defined(MPI_SIGNED_CHAR) 555a7802967336adb950dcfb71f152759e45ea16e4bsewardj if (ty == MPI_SIGNED_CHAR) return 1; /* MPI2 spec */; 556493743fe81c081d1ce3162ee01519fe450fbec8bsewardj# endif 557582031ba14f3e7f6f8579dd6f368c8013c5b40fbsewardj# if defined(MPI_UNSIGNED_LONG_LONG) 558a7802967336adb950dcfb71f152759e45ea16e4bsewardj if (ty == MPI_UNSIGNED_LONG_LONG) return 8; /* MPI2 spec */; 559a7802967336adb950dcfb71f152759e45ea16e4bsewardj# endif 560a7802967336adb950dcfb71f152759e45ea16e4bsewardj# if defined(MPI_COMPLEX) 561a7802967336adb950dcfb71f152759e45ea16e4bsewardj if (ty == MPI_COMPLEX) return 2 * 4; /* MPI2 spec */ 562a7802967336adb950dcfb71f152759e45ea16e4bsewardj# endif 563a7802967336adb950dcfb71f152759e45ea16e4bsewardj# if defined(MPI_DOUBLE_COMPLEX) 564a7802967336adb950dcfb71f152759e45ea16e4bsewardj if (ty == MPI_DOUBLE_COMPLEX) return 2 * 8; /* MPI2 spec */ 565582031ba14f3e7f6f8579dd6f368c8013c5b40fbsewardj# endif 566a7802967336adb950dcfb71f152759e45ea16e4bsewardj# if defined(MPI_LOGICAL) 567a7802967336adb950dcfb71f152759e45ea16e4bsewardj if (ty == MPI_LOGICAL) return 4; /* MPI2 spec */ 568a7802967336adb950dcfb71f152759e45ea16e4bsewardj# endif 569a7802967336adb950dcfb71f152759e45ea16e4bsewardj# if defined(MPI_2INTEGER) 570a7802967336adb950dcfb71f152759e45ea16e4bsewardj if (ty == MPI_2INTEGER) return 2 * 4; /* undocumented in MPI2 */ 571a7802967336adb950dcfb71f152759e45ea16e4bsewardj# endif 572a7802967336adb950dcfb71f152759e45ea16e4bsewardj# if defined(MPI_2COMPLEX) 573a7802967336adb950dcfb71f152759e45ea16e4bsewardj if (ty == MPI_2COMPLEX) return 2 * 8; /* undocumented in MPI2 */ 574a7802967336adb950dcfb71f152759e45ea16e4bsewardj# endif 575a7802967336adb950dcfb71f152759e45ea16e4bsewardj# if defined(MPI_2DOUBLE_COMPLEX) 576a7802967336adb950dcfb71f152759e45ea16e4bsewardj /* 32: this is how openmpi-1.2.2 behaves on x86-linux, but I have 577a7802967336adb950dcfb71f152759e45ea16e4bsewardj really no idea if this is right. */ 578a7802967336adb950dcfb71f152759e45ea16e4bsewardj if (ty == MPI_2DOUBLE_COMPLEX) return 32; /* undocumented in MPI2 */ 579a7802967336adb950dcfb71f152759e45ea16e4bsewardj# endif 580a7802967336adb950dcfb71f152759e45ea16e4bsewardj# if defined(MPI_2REAL) 581a7802967336adb950dcfb71f152759e45ea16e4bsewardj if (ty == MPI_2REAL) return 2 * 4; /* undocumented in MPI2 */ 582a7802967336adb950dcfb71f152759e45ea16e4bsewardj# endif 583a7802967336adb950dcfb71f152759e45ea16e4bsewardj# if defined(MPI_2DOUBLE_PRECISION) 584a7802967336adb950dcfb71f152759e45ea16e4bsewardj if (ty == MPI_2DOUBLE_PRECISION) return 2 * 8; /* undocumented in MPI2 */ 585a7802967336adb950dcfb71f152759e45ea16e4bsewardj# endif 586a7802967336adb950dcfb71f152759e45ea16e4bsewardj# if defined(MPI_CHARACTER) 587a7802967336adb950dcfb71f152759e45ea16e4bsewardj if (ty == MPI_CHARACTER) return 1; /* MPI2 spec */ 588a7802967336adb950dcfb71f152759e45ea16e4bsewardj# endif 589a7802967336adb950dcfb71f152759e45ea16e4bsewardj 590cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj /* Note: the following are named structs, not named basic types, 591cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj and so are not handled here: 592cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj FLOAT_INT DOUBLE_INT LONG_INT 2INT SHORT_INT LONG_DOUBLE_INT 593cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj My guess is they are probably for doing max-w-index style 594cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj reductions, the INT carrying the index of the max/min and the 595cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj other type its actual value. 596cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj */ 5971646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj return 0; 5981646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj} 5991646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj 600c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 601cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj/* Find the size of long double image (not 'sizeof(long double)'). 602cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj See comments in sizeofOneNamedTy. 603cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj*/ 604cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardjstatic long sizeof_long_double_image ( void ) 605cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj{ 606cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj long i; 607cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj unsigned char* p; 608cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj static long cached_result = 0; 609cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj 610cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj /* Hopefully we have it already. */ 611cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj if (cached_result != 0) { 612cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj assert(cached_result == 10 || cached_result == 16 || cached_result == 8); 613cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj return cached_result; 614cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj } 615cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj 616cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj /* No? Then we'll have to compute it. This isn't thread-safe but 617cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj it doesn't really matter since all races to compute it should 618cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj produce the same answer. */ 619cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj p = malloc(64); 620cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj assert(p); 621cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj for (i = 0; i < 64; i++) 622cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj p[i] = 0x55; 623cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj 624cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj /* Write a value which isn't known at compile time and therefore 625cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj must come out of a register. If we just store a constant here, 626cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj some compilers write more data than a store from a machine 627cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj register would. Therefore we have to force a store from a 628cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj machine register by storing a value which isn't known at compile 629cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj time. Since getpid() will return a value < 1 million, turn it 630cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj into a zero by dividing by 1e+30. */ 631cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj *(long double*)(&p[16]) = (long double)(1.0e-30 * (double)getpid()); 632cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj 633cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj for (i = 0; i < 16; i++) { 634cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj assert(p[i] == 0x55); 635cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj assert(p[i+48] == 0x55); 636cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj } 637cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj for (i = 16; i <= 48; i++) { 638cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj if (p[i] == 0x55) 639cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj break; 640cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj } 641cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj 642cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj assert(i < 48); 643cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj assert(i > 16); 644cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj free(p); 645cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj cached_result = i - 16; 646cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj 647cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj if (0) 648cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj printf("sizeof_long_double_image: computed %d\n", (int)cached_result); 649cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj 650cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj assert(cached_result == 10 || cached_result == 16 || cached_result == 8); 651cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj return cached_result; 652cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj} 653cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj 654cb7fa5094bf449a940dc81c85853aa3c6f3a56bdsewardj 655301a50f9bddfaf2c894031d9750282d69bf2103csewardj/*------------------------------------------------------------*/ 656301a50f9bddfaf2c894031d9750282d69bf2103csewardj/*--- Unpicking datatypes ---*/ 657301a50f9bddfaf2c894031d9750282d69bf2103csewardj/*------------------------------------------------------------*/ 658c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 659cf375348308c3b81dca2864898772c4d2ac2ee76sewardjstatic __inline__ 660301a50f9bddfaf2c894031d9750282d69bf2103csewardjvoid walk_type_array ( void(*f)(void*,long), char* base, 661301a50f9bddfaf2c894031d9750282d69bf2103csewardj MPI_Datatype ty, long count ); 662301a50f9bddfaf2c894031d9750282d69bf2103csewardj 663301a50f9bddfaf2c894031d9750282d69bf2103csewardj 664301a50f9bddfaf2c894031d9750282d69bf2103csewardj/* Walk over all fragments of the object of type 'ty' with base 665301a50f9bddfaf2c894031d9750282d69bf2103csewardj address 'base', and apply 'f' to the start/length of each 666301a50f9bddfaf2c894031d9750282d69bf2103csewardj contiguous fragment. */ 667301a50f9bddfaf2c894031d9750282d69bf2103csewardjstatic 668301a50f9bddfaf2c894031d9750282d69bf2103csewardjvoid walk_type ( void(*f)(void*,long), char* base, MPI_Datatype ty ) 669c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 670301a50f9bddfaf2c894031d9750282d69bf2103csewardj int r, n_ints, n_addrs, n_dtys, tycon; 6711646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj long ex, i; 672301a50f9bddfaf2c894031d9750282d69bf2103csewardj int* ints = NULL; 673301a50f9bddfaf2c894031d9750282d69bf2103csewardj MPI_Aint* addrs = NULL; 674301a50f9bddfaf2c894031d9750282d69bf2103csewardj MPI_Datatype* dtys = NULL; 675301a50f9bddfaf2c894031d9750282d69bf2103csewardj 676443aa37437f8637e8842ada083a400c5578a2d8asewardj /* Stuff for limiting how much complaining text it spews out */ 677443aa37437f8637e8842ada083a400c5578a2d8asewardj static int complaints = 3; 678443aa37437f8637e8842ada083a400c5578a2d8asewardj static int last_complained_about_tycon = -987654321; /* presumably bogus */ 679443aa37437f8637e8842ada083a400c5578a2d8asewardj 6801646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj if (0) 681abbad834efb4e359020d79961c9214cac817aea5sewardj printf("walk_type %p\n", (void*)(unsigned long)ty); 682301a50f9bddfaf2c894031d9750282d69bf2103csewardj 6839c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj r = PMPI_Type_get_envelope( ty, &n_ints, &n_addrs, &n_dtys, &tycon ); 684301a50f9bddfaf2c894031d9750282d69bf2103csewardj assert(r == MPI_SUCCESS); 685301a50f9bddfaf2c894031d9750282d69bf2103csewardj 686301a50f9bddfaf2c894031d9750282d69bf2103csewardj /* Handle the base cases fast(er/ish). */ 687301a50f9bddfaf2c894031d9750282d69bf2103csewardj if (tycon == MPI_COMBINER_NAMED) { 6888717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj long sz = sizeofOneNamedTy(ty); 689cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj if (sz > 0) { 690cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj f(base, sz); 691cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj return; 692cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj } 693cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj /* Hmm. Perhaps it's a named struct? Unfortunately we can't 694cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj take them to bits so we have to do a really ugly hack, which 695cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj makes assumptions about how the MPI implementation has laid 696558cc22cdc8bf09636d045f56faad79a9f62865bsewardj out these types. At least Open MPI 1.0.1 appears to put 697a7802967336adb950dcfb71f152759e45ea16e4bsewardj the 'val' field first. MPICH2 agrees. 698cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj */ 699443aa37437f8637e8842ada083a400c5578a2d8asewardj if (ty == MPI_2INT) { 700443aa37437f8637e8842ada083a400c5578a2d8asewardj typedef struct { int val; int loc; } Ty; 701443aa37437f8637e8842ada083a400c5578a2d8asewardj f(base + offsetof(Ty,val), sizeof(int)); 702443aa37437f8637e8842ada083a400c5578a2d8asewardj f(base + offsetof(Ty,loc), sizeof(int)); 703443aa37437f8637e8842ada083a400c5578a2d8asewardj return; 704443aa37437f8637e8842ada083a400c5578a2d8asewardj } 705cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj if (ty == MPI_LONG_INT) { 706558cc22cdc8bf09636d045f56faad79a9f62865bsewardj typedef struct { long val; int loc; } Ty; 707558cc22cdc8bf09636d045f56faad79a9f62865bsewardj f(base + offsetof(Ty,val), sizeof(long)); 708558cc22cdc8bf09636d045f56faad79a9f62865bsewardj f(base + offsetof(Ty,loc), sizeof(int)); 709558cc22cdc8bf09636d045f56faad79a9f62865bsewardj return; 710558cc22cdc8bf09636d045f56faad79a9f62865bsewardj } 711558cc22cdc8bf09636d045f56faad79a9f62865bsewardj if (ty == MPI_DOUBLE_INT) { 712558cc22cdc8bf09636d045f56faad79a9f62865bsewardj typedef struct { double val; int loc; } Ty; 713558cc22cdc8bf09636d045f56faad79a9f62865bsewardj f(base + offsetof(Ty,val), sizeof(double)); 714558cc22cdc8bf09636d045f56faad79a9f62865bsewardj f(base + offsetof(Ty,loc), sizeof(int)); 715558cc22cdc8bf09636d045f56faad79a9f62865bsewardj return; 716558cc22cdc8bf09636d045f56faad79a9f62865bsewardj } 717558cc22cdc8bf09636d045f56faad79a9f62865bsewardj if (ty == MPI_SHORT_INT) { 718558cc22cdc8bf09636d045f56faad79a9f62865bsewardj typedef struct { short val; int loc; } Ty; 719558cc22cdc8bf09636d045f56faad79a9f62865bsewardj f(base + offsetof(Ty,val), sizeof(short)); 720cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj f(base + offsetof(Ty,loc), sizeof(int)); 721cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj return; 722cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj } 723a7802967336adb950dcfb71f152759e45ea16e4bsewardj if (ty == MPI_FLOAT_INT) { 724a7802967336adb950dcfb71f152759e45ea16e4bsewardj typedef struct { float val; int loc; } Ty; 725a7802967336adb950dcfb71f152759e45ea16e4bsewardj f(base + offsetof(Ty,val), sizeof(float)); 726a7802967336adb950dcfb71f152759e45ea16e4bsewardj f(base + offsetof(Ty,loc), sizeof(int)); 727a7802967336adb950dcfb71f152759e45ea16e4bsewardj return; 728a7802967336adb950dcfb71f152759e45ea16e4bsewardj } 729a7802967336adb950dcfb71f152759e45ea16e4bsewardj if (ty == MPI_LONG_DOUBLE_INT) { 730a7802967336adb950dcfb71f152759e45ea16e4bsewardj typedef struct { long double val; int loc; } Ty; 731a7802967336adb950dcfb71f152759e45ea16e4bsewardj f(base + offsetof(Ty,val), sizeof_long_double_image()); 732a7802967336adb950dcfb71f152759e45ea16e4bsewardj f(base + offsetof(Ty,loc), sizeof(int)); 733a7802967336adb950dcfb71f152759e45ea16e4bsewardj return; 734a7802967336adb950dcfb71f152759e45ea16e4bsewardj } 735493743fe81c081d1ce3162ee01519fe450fbec8bsewardj if (ty == MPI_LB || ty == MPI_UB) 736493743fe81c081d1ce3162ee01519fe450fbec8bsewardj return; /* have zero size, so nothing needs to be done */ 737cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj goto unhandled; 738301a50f9bddfaf2c894031d9750282d69bf2103csewardj /*NOTREACHED*/ 739c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 740c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 7411646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj if (0) { 742301a50f9bddfaf2c894031d9750282d69bf2103csewardj ex = extentOfTy(ty); 743157a8c40575f4ce99c36a91434a43afd4db13717sewardj printf("tycon 0x%llx %d %d %d (ext %d)\n", 744157a8c40575f4ce99c36a91434a43afd4db13717sewardj (unsigned long long int)tycon, 745157a8c40575f4ce99c36a91434a43afd4db13717sewardj n_ints, n_addrs, n_dtys, (int)ex ); 746301a50f9bddfaf2c894031d9750282d69bf2103csewardj } 747c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 748301a50f9bddfaf2c894031d9750282d69bf2103csewardj /* Now safe to do MPI_Type_get_contents */ 749301a50f9bddfaf2c894031d9750282d69bf2103csewardj assert(n_ints >= 0); 750301a50f9bddfaf2c894031d9750282d69bf2103csewardj assert(n_addrs >= 0); 751301a50f9bddfaf2c894031d9750282d69bf2103csewardj assert(n_dtys >= 0); 752c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 753301a50f9bddfaf2c894031d9750282d69bf2103csewardj if (n_ints > 0) { 754301a50f9bddfaf2c894031d9750282d69bf2103csewardj ints = malloc(n_ints * sizeof(int)); 755301a50f9bddfaf2c894031d9750282d69bf2103csewardj assert(ints); 756301a50f9bddfaf2c894031d9750282d69bf2103csewardj } 757301a50f9bddfaf2c894031d9750282d69bf2103csewardj if (n_addrs > 0) { 758301a50f9bddfaf2c894031d9750282d69bf2103csewardj addrs = malloc(n_addrs * sizeof(MPI_Aint)); 759301a50f9bddfaf2c894031d9750282d69bf2103csewardj assert(addrs); 760301a50f9bddfaf2c894031d9750282d69bf2103csewardj } 761301a50f9bddfaf2c894031d9750282d69bf2103csewardj if (n_dtys > 0) { 762301a50f9bddfaf2c894031d9750282d69bf2103csewardj dtys = malloc(n_dtys * sizeof(MPI_Datatype)); 763301a50f9bddfaf2c894031d9750282d69bf2103csewardj assert(dtys); 764c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 765c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 7669c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj r = PMPI_Type_get_contents( ty, n_ints, n_addrs, n_dtys, 7679c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj ints, addrs, dtys ); 768301a50f9bddfaf2c894031d9750282d69bf2103csewardj assert(r == MPI_SUCCESS); 769c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 770301a50f9bddfaf2c894031d9750282d69bf2103csewardj switch (tycon) { 771c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 772301a50f9bddfaf2c894031d9750282d69bf2103csewardj case MPI_COMBINER_CONTIGUOUS: 773301a50f9bddfaf2c894031d9750282d69bf2103csewardj assert(n_ints == 1 && n_addrs == 0 && n_dtys == 1); 774301a50f9bddfaf2c894031d9750282d69bf2103csewardj walk_type_array( f, base, dtys[0], ints[0] ); 775301a50f9bddfaf2c894031d9750282d69bf2103csewardj maybeFreeTy( &dtys[0] ); 776301a50f9bddfaf2c894031d9750282d69bf2103csewardj break; 777301a50f9bddfaf2c894031d9750282d69bf2103csewardj 778c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj case MPI_COMBINER_VECTOR: 779c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj assert(n_ints == 3 && n_addrs == 0 && n_dtys == 1); 780c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj ex = extentOfTy(dtys[0]); 781c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj if (0) 782c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj printf("vector count %d x (bl %d stride %d)\n", 783c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj (int)ints[0], (int)ints[1], (int)ints[2]); 784c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj for (i = 0; i < ints[0]; i++) { 785c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj walk_type_array( f, base + i * ints[2]/*stride*/ * ex, 786c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj dtys[0], ints[1]/*blocklength*/ ); 787c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj } 788c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj maybeFreeTy( &dtys[0] ); 789c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj break; 790c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj 791c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj case MPI_COMBINER_HVECTOR: 792c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj assert(n_ints == 2 && n_addrs == 1 && n_dtys == 1); 793c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj ex = extentOfTy(dtys[0]); 794c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj if (0) 795c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj printf("hvector count %d x (bl %d hstride %d)\n", 796c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj (int)ints[0], (int)ints[1], (int)addrs[0]); 797c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj for (i = 0; i < ints[0]; i++) { 798c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj walk_type_array( f, base + i * addrs[0]/*hstride*/, 799c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj dtys[0], ints[1]/*blocklength*/ ); 800c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj } 801c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj maybeFreeTy( &dtys[0] ); 802c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj break; 803c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj 804c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj case MPI_COMBINER_INDEXED: 805c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj assert(n_addrs == 0 && n_dtys == 1); 806c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj assert(n_ints > 0); 807c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj assert(n_ints == 2 * ints[0] + 1); 808c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj ex = extentOfTy(dtys[0]); 809c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj for (i = 0; i < ints[0]; i++) { 810c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj if (0) 811c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj printf("indexed (elem %d) off %d copies %d\n", 812c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj (int)i, ints[i+1+ints[0]], ints[i+1] ); 813c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj walk_type_array( f, base + ex * ints[i+1+ints[0]], 814c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj dtys[0], ints[i+1] ); 815c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj } 816c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj maybeFreeTy( &dtys[0] ); 817c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj break; 818c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj 819c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj case MPI_COMBINER_HINDEXED: 820c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj assert(n_ints > 0); 821c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj assert(n_ints == ints[0] + 1); 822c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj assert(n_addrs == ints[0] && n_dtys == 1); 823c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj ex = extentOfTy(dtys[0]); 824c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj for (i = 0; i < ints[0]; i++) { 825c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj if (0) 826c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj printf("hindexed (elem %d) hoff %d copies %d\n", 827c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj (int)i, (int)addrs[i], ints[i+1] ); 828c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj walk_type_array( f, base + addrs[i], 829c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj dtys[0], ints[i+1] ); 830c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj } 831c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj maybeFreeTy( &dtys[0] ); 832c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj break; 833c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj 834301a50f9bddfaf2c894031d9750282d69bf2103csewardj case MPI_COMBINER_STRUCT: 835301a50f9bddfaf2c894031d9750282d69bf2103csewardj assert(n_addrs == n_ints-1); 836301a50f9bddfaf2c894031d9750282d69bf2103csewardj assert(n_dtys == n_ints-1); 837c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj assert(n_ints > 0); 838c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj assert(n_ints == ints[0] + 1); 839301a50f9bddfaf2c894031d9750282d69bf2103csewardj for (i = 0; i < ints[0]; i++) { 8401646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj if (0) 841c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj printf("struct (elem %d limit %d) hoff %d copies %d\n", 842301a50f9bddfaf2c894031d9750282d69bf2103csewardj (int)i, (int)ints[0], (int)addrs[i], (int)ints[i+1]); 843301a50f9bddfaf2c894031d9750282d69bf2103csewardj walk_type_array( f, base + addrs[i], dtys[i], (long)ints[i+1] ); 844301a50f9bddfaf2c894031d9750282d69bf2103csewardj maybeFreeTy( &dtys[i] ); 845301a50f9bddfaf2c894031d9750282d69bf2103csewardj } 846301a50f9bddfaf2c894031d9750282d69bf2103csewardj break; 847301a50f9bddfaf2c894031d9750282d69bf2103csewardj 848301a50f9bddfaf2c894031d9750282d69bf2103csewardj default: 849301a50f9bddfaf2c894031d9750282d69bf2103csewardj goto unhandled; 850301a50f9bddfaf2c894031d9750282d69bf2103csewardj 851301a50f9bddfaf2c894031d9750282d69bf2103csewardj } 852301a50f9bddfaf2c894031d9750282d69bf2103csewardj 853301a50f9bddfaf2c894031d9750282d69bf2103csewardj /* normal exit */ 854301a50f9bddfaf2c894031d9750282d69bf2103csewardj if (ints) free(ints); 855301a50f9bddfaf2c894031d9750282d69bf2103csewardj if (addrs) free(addrs); 856301a50f9bddfaf2c894031d9750282d69bf2103csewardj if (dtys) free(dtys); 857301a50f9bddfaf2c894031d9750282d69bf2103csewardj return; 858301a50f9bddfaf2c894031d9750282d69bf2103csewardj 859301a50f9bddfaf2c894031d9750282d69bf2103csewardj unhandled: 860443aa37437f8637e8842ada083a400c5578a2d8asewardj /* Complain, but limit the amount of complaining that can happen to 861443aa37437f8637e8842ada083a400c5578a2d8asewardj the first 3 different unhandled tycons that show up, so as to 862443aa37437f8637e8842ada083a400c5578a2d8asewardj avoid swamping users with thousands of duplicate messages. */ 863443aa37437f8637e8842ada083a400c5578a2d8asewardj if (complaints > 0 && tycon != last_complained_about_tycon) { 864443aa37437f8637e8842ada083a400c5578a2d8asewardj complaints--; 865443aa37437f8637e8842ada083a400c5578a2d8asewardj last_complained_about_tycon = tycon; 866443aa37437f8637e8842ada083a400c5578a2d8asewardj if (tycon == MPI_COMBINER_NAMED) { 867443aa37437f8637e8842ada083a400c5578a2d8asewardj fprintf(stderr, "%s %5d: walk_type: unhandled base type 0x%lx ", 868443aa37437f8637e8842ada083a400c5578a2d8asewardj preamble, my_pid, (long)ty); 869443aa37437f8637e8842ada083a400c5578a2d8asewardj showTy(stderr, ty); 870443aa37437f8637e8842ada083a400c5578a2d8asewardj fprintf(stderr, "\n"); 871443aa37437f8637e8842ada083a400c5578a2d8asewardj } else { 872443aa37437f8637e8842ada083a400c5578a2d8asewardj fprintf(stderr, "%s %5d: walk_type: unhandled combiner 0x%lx\n", 873443aa37437f8637e8842ada083a400c5578a2d8asewardj preamble, my_pid, (long)tycon); 874443aa37437f8637e8842ada083a400c5578a2d8asewardj } 875c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 876301a50f9bddfaf2c894031d9750282d69bf2103csewardj if (ints) free(ints); 877301a50f9bddfaf2c894031d9750282d69bf2103csewardj if (addrs) free(addrs); 878301a50f9bddfaf2c894031d9750282d69bf2103csewardj if (dtys) free(dtys); 879cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj if (opt_missing >= 2) 880cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj barf("walk_type: unhandled combiner, strict checking selected"); 881c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 882c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 883301a50f9bddfaf2c894031d9750282d69bf2103csewardj 884cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj/* Same as walk_type but apply 'f' to every element in an array of 885cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj 'count' items starting at 'base'. The only purpose of pushing this 886cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj into a different routine is so it can attempt to optimise the case 887cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj where the array elements are contiguous and packed together without 888cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj holes. */ 889cf375348308c3b81dca2864898772c4d2ac2ee76sewardjstatic __inline__ 890301a50f9bddfaf2c894031d9750282d69bf2103csewardjvoid walk_type_array ( void(*f)(void*,long), char* base, 891301a50f9bddfaf2c894031d9750282d69bf2103csewardj MPI_Datatype elemTy, long count ) 892c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 893301a50f9bddfaf2c894031d9750282d69bf2103csewardj long i, ex; 8941646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj 8951646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj assert(sizeof(unsigned long) == sizeof(char*)); 8961646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj 8971646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj /* First see if we can do this the fast way. */ 8988717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj ex = sizeofOneNamedTy(elemTy); 8991646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj 9001646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj if ( /* ty is a primitive type with power-of-2 size */ 9011646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj (ex == 8 || ex == 4 || ex == 2 || ex == 1) 9021646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj && /* base is suitably aligned for ty */ 9031646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj ( ((unsigned long)base) & (ex-1)) == 0) { 9041646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj 9051646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj /* We're sure it's contiguous, so just paint/check it in one 9061646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj go. */ 9071646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj if (0) printf("walk_type_array fast %ld of size %ld\n", count, ex ); 9081646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj f ( base, count * ex ); 9091646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj 9101646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj } else { 9111646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj 9121646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj /* Bad news. We have to futz with each element individually. 9138717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj This could be very expensive. 9148717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj 9158717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj Note: subtle. If ty is LONG_DOUBLE then the extent will be 9168717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj 12, so the following loop will jump along in steps of 12, but 9178717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj the size painted by walk_type will be 10 since it uses 9188717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj sizeofOneNamedTy to establish the size of base types. Which 9198717d1a523a9e64ce934d83833a4c55e2bcf737dsewardj is what we need to happen. */ 9201646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj ex = extentOfTy(elemTy); 9211646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj if (0) printf("walk_type_array SLOW %ld of size %ld\n", count, ex ); 9221646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj for (i = 0; i < count; i++) 9231646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj walk_type( f, base + i * ex, elemTy ); 9241646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj 9251646f75f1dbe7b4217b9f711b7432d43533ccf6bsewardj } 926c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 927c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 928c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 929558cc22cdc8bf09636d045f56faad79a9f62865bsewardj/* Hook so it's visible from outside (can be handy to dlopen/dlsym 930558cc22cdc8bf09636d045f56faad79a9f62865bsewardj it) */ 931558cc22cdc8bf09636d045f56faad79a9f62865bsewardjvoid mpiwrap_walk_type_EXTERNALLY_VISIBLE 932c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj ( void(*f)(void*,long), char* base, MPI_Datatype ty ) 933c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj{ 934d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj walk_type(f, base, ty); 935c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj} 936c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj 937c0526f756d1b0cf7dc16fdf31a4fb25f8b3fba6dsewardj 938301a50f9bddfaf2c894031d9750282d69bf2103csewardj/*------------------------------------------------------------*/ 939301a50f9bddfaf2c894031d9750282d69bf2103csewardj/*--- Address-range helpers ---*/ 940301a50f9bddfaf2c894031d9750282d69bf2103csewardj/*------------------------------------------------------------*/ 941301a50f9bddfaf2c894031d9750282d69bf2103csewardj 942c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* ---------------- 943c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj Do corresponding checks on memory areas defined using a 944cf375348308c3b81dca2864898772c4d2ac2ee76sewardj straightforward (start, length) description. 945c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj ---------------- 946c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj*/ 947c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 948cf375348308c3b81dca2864898772c4d2ac2ee76sewardjstatic __inline__ 949dbf7ca71128c6787ba8a99cbd03c3773ff572d96njnvoid check_mem_is_defined_untyped ( void* buffer, long nbytes ) 950c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 951c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (nbytes > 0) { 952dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn VALGRIND_CHECK_MEM_IS_DEFINED(buffer, nbytes); 953c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 954c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 955c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 956cf375348308c3b81dca2864898772c4d2ac2ee76sewardjstatic __inline__ 957dbf7ca71128c6787ba8a99cbd03c3773ff572d96njnvoid check_mem_is_addressable_untyped ( void* buffer, long nbytes ) 958c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 959c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (nbytes > 0) { 960dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn VALGRIND_CHECK_MEM_IS_ADDRESSABLE(buffer, nbytes); 961c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 962c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 963c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 964cf375348308c3b81dca2864898772c4d2ac2ee76sewardjstatic __inline__ 965dbf7ca71128c6787ba8a99cbd03c3773ff572d96njnvoid make_mem_defined_if_addressable_untyped ( void* buffer, long nbytes ) 966c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 967c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (nbytes > 0) { 968dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn VALGRIND_MAKE_MEM_DEFINED_IF_ADDRESSABLE(buffer, nbytes); 969c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 970c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 971c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 972cf375348308c3b81dca2864898772c4d2ac2ee76sewardjstatic __inline__ 973dbf7ca71128c6787ba8a99cbd03c3773ff572d96njnvoid make_mem_defined_if_addressable_if_success_untyped ( int err, 974cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj void* buffer, long nbytes ) 975c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 976c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (err == MPI_SUCCESS && nbytes > 0) { 977dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn VALGRIND_MAKE_MEM_DEFINED_IF_ADDRESSABLE(buffer, nbytes); 978c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 979c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 980c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 981c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 982301a50f9bddfaf2c894031d9750282d69bf2103csewardj/* ---------------- 983301a50f9bddfaf2c894031d9750282d69bf2103csewardj Do checks on memory areas defined using the MPI (buffer, count, 984301a50f9bddfaf2c894031d9750282d69bf2103csewardj type) convention. 985301a50f9bddfaf2c894031d9750282d69bf2103csewardj ---------------- 986301a50f9bddfaf2c894031d9750282d69bf2103csewardj*/ 987301a50f9bddfaf2c894031d9750282d69bf2103csewardj 988301a50f9bddfaf2c894031d9750282d69bf2103csewardj/* Check that the specified area is both addressible and contains 989301a50f9bddfaf2c894031d9750282d69bf2103csewardj initialised data, and cause V to complain if not. */ 990301a50f9bddfaf2c894031d9750282d69bf2103csewardj 991cf375348308c3b81dca2864898772c4d2ac2ee76sewardjstatic __inline__ 992dbf7ca71128c6787ba8a99cbd03c3773ff572d96njnvoid check_mem_is_defined ( char* buffer, long count, MPI_Datatype datatype ) 993301a50f9bddfaf2c894031d9750282d69bf2103csewardj{ 994dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn walk_type_array( check_mem_is_defined_untyped, buffer, datatype, count ); 995301a50f9bddfaf2c894031d9750282d69bf2103csewardj} 996301a50f9bddfaf2c894031d9750282d69bf2103csewardj 997301a50f9bddfaf2c894031d9750282d69bf2103csewardj 998301a50f9bddfaf2c894031d9750282d69bf2103csewardj/* Check that the specified area is addressible, and cause V to 999301a50f9bddfaf2c894031d9750282d69bf2103csewardj complain if not. Doesn't matter whether the data there is 1000301a50f9bddfaf2c894031d9750282d69bf2103csewardj initialised or not. */ 1001301a50f9bddfaf2c894031d9750282d69bf2103csewardj 1002cf375348308c3b81dca2864898772c4d2ac2ee76sewardjstatic __inline__ 1003dbf7ca71128c6787ba8a99cbd03c3773ff572d96njnvoid check_mem_is_addressable ( void *buffer, long count, MPI_Datatype datatype ) 1004301a50f9bddfaf2c894031d9750282d69bf2103csewardj{ 1005dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn walk_type_array( check_mem_is_addressable_untyped, buffer, datatype, count ); 1006301a50f9bddfaf2c894031d9750282d69bf2103csewardj} 1007301a50f9bddfaf2c894031d9750282d69bf2103csewardj 1008301a50f9bddfaf2c894031d9750282d69bf2103csewardj 1009cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj/* Set the specified area to 'defined for each byte which is 1010cd8aaef45293e87bb7acfc7c018d357d606cca28sewardj addressible' state. */ 1011301a50f9bddfaf2c894031d9750282d69bf2103csewardj 1012cf375348308c3b81dca2864898772c4d2ac2ee76sewardjstatic __inline__ 1013dbf7ca71128c6787ba8a99cbd03c3773ff572d96njnvoid make_mem_defined_if_addressable ( void *buffer, int count, MPI_Datatype datatype ) 1014301a50f9bddfaf2c894031d9750282d69bf2103csewardj{ 1015dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn walk_type_array( make_mem_defined_if_addressable_untyped, 1016dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn buffer, datatype, count ); 1017301a50f9bddfaf2c894031d9750282d69bf2103csewardj} 1018301a50f9bddfaf2c894031d9750282d69bf2103csewardj 1019cf375348308c3b81dca2864898772c4d2ac2ee76sewardjstatic __inline__ 1020301a50f9bddfaf2c894031d9750282d69bf2103csewardjvoid 1021dbf7ca71128c6787ba8a99cbd03c3773ff572d96njnmake_mem_defined_if_addressable_if_success ( int err, void *buffer, int count, 1022dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn MPI_Datatype datatype ) 1023301a50f9bddfaf2c894031d9750282d69bf2103csewardj{ 1024301a50f9bddfaf2c894031d9750282d69bf2103csewardj if (err == MPI_SUCCESS) 1025dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn make_mem_defined_if_addressable(buffer, count, datatype); 1026301a50f9bddfaf2c894031d9750282d69bf2103csewardj} 1027301a50f9bddfaf2c894031d9750282d69bf2103csewardj 1028301a50f9bddfaf2c894031d9750282d69bf2103csewardj 1029c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 1030c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- ---*/ 1031c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- The wrappers proper. They are listed in the order ---*/ 1032c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- in which they appear in "MPI: A Message-Passing ---*/ 1033c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Interface Standard, MPIF, Nov 15 2003" (the MPI 1.1 ---*/ 1034c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- spec. All unimplemented wrappers are listed at the ---*/ 1035c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- end of the file. The list of function names is ---*/ 10369c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/*--- taken from the headers of Open MPI svn r9191. ---*/ 10379c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/*--- Hopefully it is a complete list of all the MPI 2 ---*/ 10389c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/*--- functions. ---*/ 1039c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- ---*/ 1040c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 1041c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1042c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* Handy abbreviation */ 1043c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj#define WRAPPER_FOR(name) I_WRAP_FNNAME_U(name) 1044c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1045c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* Generates (conceptually) a wrapper which does nothing. In 1046c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj fact just generate no wrapper at all. */ 10479c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj#define HAS_NO_WRAPPER(basename) /* */ 1048c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1049c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1050c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 1051c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- ---*/ 1052c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Sec 3.2, Blocking Send and Receive Operations ---*/ 1053c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- ---*/ 1054c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 1055c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 10569c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* --- {,B,S,R}Send --- */ 1057c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* pre: rd: (buf,count,datatype) */ 10589c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjstatic 10599c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint generic_Send(void *buf, int count, MPI_Datatype datatype, 10609c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj int dest, int tag, MPI_Comm comm) 1061c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 1062c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj OrigFn fn; 1063c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int err; 1064c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj VALGRIND_GET_ORIG_FN(fn); 10659c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj before("{,B,S,R}Send"); 1066dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_defined(buf, count, datatype); 1067dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 1068c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj CALL_FN_W_6W(err, fn, buf,count,datatype,dest,tag,comm); 1069dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 10709c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj after("{,B,S,R}Send", err); 1071c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj return err; 1072c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 10739c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Send)(void *buf, int count, MPI_Datatype datatype, 10749c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj int dest, int tag, MPI_Comm comm) { 10759c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj return generic_Send(buf,count,datatype, dest,tag,comm); 10769c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj} 10779c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Bsend)(void *buf, int count, MPI_Datatype datatype, 10789c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj int dest, int tag, MPI_Comm comm) { 10799c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj return generic_Send(buf,count,datatype, dest,tag,comm); 10809c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj} 10819c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Ssend)(void *buf, int count, MPI_Datatype datatype, 10829c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj int dest, int tag, MPI_Comm comm) { 10839c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj return generic_Send(buf,count,datatype, dest,tag,comm); 10849c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj} 10859c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Rsend)(void *buf, int count, MPI_Datatype datatype, 10869c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj int dest, int tag, MPI_Comm comm) { 10879c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj return generic_Send(buf,count,datatype, dest,tag,comm); 10889c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj} 1089c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1090c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Recv --- */ 1091c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* pre: must be writable: (buf,count,datatype) 1092c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj must be writable: status 1093c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj post: make readable: (buf,recv_count,datatype) 1094c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj where recv_count is determined from *status 1095c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj*/ 1096c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Recv)(void *buf, int count, MPI_Datatype datatype, 1097c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int source, int tag, 1098c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj MPI_Comm comm, MPI_Status *status) 1099c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 1100753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj OrigFn fn; 1101753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj int err, recv_count = 0; 1102753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj MPI_Status fake_status; 1103c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj VALGRIND_GET_ORIG_FN(fn); 1104c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj before("Recv"); 1105753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj if (isMSI(status)) 1106753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj status = &fake_status; 1107dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable(buf, count, datatype); 1108dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable_untyped(status, sizeof(*status)); 1109dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 1110c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj CALL_FN_W_7W(err, fn, buf,count,datatype,source,tag,comm,status); 1111dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 111226c60a8706eb45cbf303437adc87e313e104d4efsewardj make_mem_defined_if_addressable_if_success_untyped(err, status, sizeof(*status)); 1113c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (err == MPI_SUCCESS && count_from_Status(&recv_count,datatype,status)) { 1114dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn make_mem_defined_if_addressable(buf, recv_count, datatype); 1115c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 1116c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj after("Recv", err); 1117c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj return err; 1118c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 1119c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 11209c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* --- Get_count --- */ 11219c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* pre: must be readable: *status 11229c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj post: make defined: *count -- don't bother, libmpi will surely do this 11239c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj*/ 11249c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Get_count)(MPI_Status* status, 11259c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj MPI_Datatype ty, int* count ) 11269c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj{ 11279c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj OrigFn fn; 11289c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj int err; 11299c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj VALGRIND_GET_ORIG_FN(fn); 11309c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj before("Get_count"); 1131dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_defined_untyped(status, sizeof(*status)); 1132dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 11339c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj CALL_FN_W_WWW(err, fn, status,ty,count); 1134dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 11359c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj after("Get_count", err); 11369c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj return err; 11379c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj} 11389c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj 1139c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1140c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 1141c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- ---*/ 1142c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Sec 3.7, Nonblocking communication ---*/ 1143c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- ---*/ 1144c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 1145c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 11469c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* Maintain a table that makes it possible for the wrappers to 11479c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj complete MPI_Irecv successfully. 11489c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj 11499c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj The issue is that MPI_Irecv states the recv buffer and returns 11509c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj immediately, giving a handle (MPI_Request) for the transaction. 11519c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj Later the user will have to poll for completion with MPI_Wait etc, 11529c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj and at that point these wrappers have to paint the recv buffer. 11539c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj But the recv buffer details are not presented to MPI_Wait - only 11549c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj the handle is. We therefore have to use a shadow table 11559c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj (sReqs{,_size,_used,_lock}) which associates uncompleted 11569c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj MPI_Requests with the corresponding buffer address/count/type. 11579c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj 11589c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj Only read requests are placed in the table, since there is no need 11599c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj to do any buffer painting following completion of an Isend - all 11609c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj the checks for that are done at the time Isend is called. 11619c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj 11629c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj Care has to be take to remove completed requests from the table. 11639c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj 11649c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj Access to the table is guarded by sReqs_lock so as to make it 11659c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj thread-safe. 11669c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj*/ 11679c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj 1168c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjtypedef 1169c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj struct { 1170c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj Bool inUse; 1171c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj MPI_Request key; 1172c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj void* buf; 1173c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int count; 1174c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj MPI_Datatype datatype; 1175c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 1176c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj ShadowRequest; 1177c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1178c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjstatic ShadowRequest* sReqs = NULL; 1179c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjstatic int sReqs_size = 0; 1180c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjstatic int sReqs_used = 0; 1181558cc22cdc8bf09636d045f56faad79a9f62865bsewardjstatic pthread_mutex_t sReqs_lock = PTHREAD_MUTEX_INITIALIZER; 1182558cc22cdc8bf09636d045f56faad79a9f62865bsewardj 1183558cc22cdc8bf09636d045f56faad79a9f62865bsewardj#define LOCK_SREQS \ 1184558cc22cdc8bf09636d045f56faad79a9f62865bsewardj do { int pr = pthread_mutex_lock(&sReqs_lock); \ 1185558cc22cdc8bf09636d045f56faad79a9f62865bsewardj assert(pr == 0); \ 1186558cc22cdc8bf09636d045f56faad79a9f62865bsewardj } while (0) 1187558cc22cdc8bf09636d045f56faad79a9f62865bsewardj 1188558cc22cdc8bf09636d045f56faad79a9f62865bsewardj#define UNLOCK_SREQS \ 1189558cc22cdc8bf09636d045f56faad79a9f62865bsewardj do { int pr = pthread_mutex_unlock(&sReqs_lock); \ 1190558cc22cdc8bf09636d045f56faad79a9f62865bsewardj assert(pr == 0); \ 1191558cc22cdc8bf09636d045f56faad79a9f62865bsewardj } while (0) 1192c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1193c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1194c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* Ensure the sReqs expandable array has at least one free slot, by 1195c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj copying it into a larger one if necessary. NOTE: sReqs_lock is 1196c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj held throughout this procedure.*/ 1197c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjstatic void ensure_sReq_space ( void ) 1198c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 1199c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int i; 1200c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj ShadowRequest* sReqs2; 1201c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (sReqs_used == sReqs_size) { 1202c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj sReqs_size = sReqs_size==0 ? 2 : 2*sReqs_size; 1203c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj sReqs2 = malloc( sReqs_size * sizeof(ShadowRequest) ); 1204c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (sReqs2 == NULL) { 1205558cc22cdc8bf09636d045f56faad79a9f62865bsewardj UNLOCK_SREQS; 1206c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj barf("add_shadow_Request: malloc failed.\n"); 1207c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 1208c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj for (i = 0; i < sReqs_used; i++) 1209c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj sReqs2[i] = sReqs[i]; 1210c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (sReqs) 1211c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj free(sReqs); 1212c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj sReqs = sReqs2; 1213c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 1214c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj assert(sReqs_used < sReqs_size); 1215c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 1216c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1217c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1218c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* Find shadow info for 'request', or NULL if none. */ 1219c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1220c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjstatic 1221c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjShadowRequest* find_shadow_Request ( MPI_Request request ) 1222c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 1223c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj ShadowRequest* ret = NULL; 1224c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int i; 1225558cc22cdc8bf09636d045f56faad79a9f62865bsewardj LOCK_SREQS; 1226c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj for (i = 0; i < sReqs_used; i++) { 1227c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (sReqs[i].inUse && eq_MPI_Request(sReqs[i].key,request)) { 1228c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj ret = &sReqs[i]; 1229c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj break; 1230c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 1231c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 1232558cc22cdc8bf09636d045f56faad79a9f62865bsewardj UNLOCK_SREQS; 1233c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj return ret; 1234c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 1235c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1236c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1237c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* Delete shadow info for 'request', if any. */ 1238c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1239c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjstatic void delete_shadow_Request ( MPI_Request request ) 1240c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 1241c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int i; 1242558cc22cdc8bf09636d045f56faad79a9f62865bsewardj LOCK_SREQS; 1243c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj for (i = 0; i < sReqs_used; i++) { 1244c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (sReqs[i].inUse && eq_MPI_Request(sReqs[i].key,request)) { 1245c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj sReqs[i].inUse = False; 1246c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj break; 1247c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 1248c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 1249558cc22cdc8bf09636d045f56faad79a9f62865bsewardj UNLOCK_SREQS; 1250c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 1251c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1252c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1253c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* Add a shadow for 'request', overwriting any old binding for it. */ 1254c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1255c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjstatic 1256c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjvoid add_shadow_Request( MPI_Request request, 1257c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj void* buf, int count, 1258c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj MPI_Datatype datatype ) 1259c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 1260c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int i, ix = -1; 1261558cc22cdc8bf09636d045f56faad79a9f62865bsewardj LOCK_SREQS; 1262c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj assert(sReqs_used >= 0); 1263c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj assert(sReqs_size >= 0); 1264c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj assert(sReqs_used <= sReqs_size); 1265c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (sReqs == NULL) assert(sReqs_size == 0); 1266c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1267c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj /* First of all see if we already have a binding for this key; if 1268c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj so just replace it, and have done. */ 1269c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj for (i = 0; i < sReqs_used; i++) { 1270c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (sReqs[i].inUse && eq_MPI_Request(sReqs[i].key,request)) { 1271c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj ix = i; 1272c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj break; 1273c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 1274c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 1275c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1276c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (ix < 0) { 1277c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj /* Ok, we don't have it, so will have to add it. First search 1278c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj to see if there is an existing empty slot. */ 1279c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj for (i = 0; i < sReqs_used; i++) { 1280c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (!sReqs[i].inUse) { 1281c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj ix = i; 1282c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj break; 1283c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 1284c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 1285c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 1286c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1287c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj /* No empty slots. Allocate a new one. */ 1288c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (ix < 0) { 1289c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj ensure_sReq_space(); 1290c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj assert(sReqs_used < sReqs_size); 1291c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj ix = sReqs_used; 1292c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj sReqs_used++; 1293c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 1294c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1295c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj assert(ix >= 0 && ix < sReqs_used); 1296c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj assert(sReqs_used <= sReqs_size); 1297c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1298c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj sReqs[ix].inUse = True; 1299c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj sReqs[ix].key = request; 1300c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj sReqs[ix].buf = buf; 1301c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj sReqs[ix].count = count; 1302c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj sReqs[ix].datatype = datatype; 1303c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1304558cc22cdc8bf09636d045f56faad79a9f62865bsewardj UNLOCK_SREQS; 1305ec8b614219f9746385ee7d0bc20e209302713f68sewardj if (opt_verbosity > 1) 1306c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj fprintf(stderr, "%s %5d: sReq+ 0x%lx -> b/c/d %p/%d/0x%lx [slot %d]\n", 1307c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj preamble, my_pid, (unsigned long)request, 1308c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj buf, count, (long)datatype, ix); 1309c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 1310c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 13119c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjstatic 13129c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjMPI_Request* clone_Request_array ( int count, MPI_Request* orig ) 13139c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj{ 13149c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj MPI_Request* copy; 13159c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj int i; 13169c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj LOCK_SREQS; 13179c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj if (count < 0) 13189c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj count = 0; /* Hmm. Call Mulder and Scully. */ 13199c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj copy = malloc( count * sizeof(MPI_Request) ); 1320d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj if (copy == NULL && count > 0) { 13219c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj UNLOCK_SREQS; 13229c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj barf("clone_Request_array: malloc failed"); 13239c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj } 13249c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj for (i = 0; i < count; i++) 13259c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj copy[i] = orig[i]; 13269c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj UNLOCK_SREQS; 13279c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj return copy; 13289c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj} 13299c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj 1330558cc22cdc8bf09636d045f56faad79a9f62865bsewardj#undef LOCK_SREQS 1331558cc22cdc8bf09636d045f56faad79a9f62865bsewardj#undef UNLOCK_SREQS 1332c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 13339c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj 1334c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjstatic void maybe_complete ( Bool error_in_status, 1335c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj MPI_Request request_before, 1336c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj MPI_Request request_after, 1337c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj MPI_Status* status ) 1338c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 1339c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int recv_count = 0; 1340c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj ShadowRequest* shadow; 1341c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj /* How do we know if this is an Irecv request that has now 1342c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj finished successfully? 1343c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1344c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj request_before isn't MPI_REQUEST_NULL 1345c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj and request_before is found in the shadow table 1346c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj and request_after *is* MPI_REQUEST_NULL 1347c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj and (if error_in_status then status.MPI_ERROR is MPI_SUCCESS) 1348c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1349c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj (when error_in_status == False, then we expect not to get 1350c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj called at all if there was an error.) 1351c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj */ 1352c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (request_before != MPI_REQUEST_NULL 1353c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj && request_after == MPI_REQUEST_NULL 1354c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj && (error_in_status ? status->MPI_ERROR == MPI_SUCCESS : True) 1355c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj && ( (shadow=find_shadow_Request(request_before)) != NULL) ) { 1356b727b54c51af958caadd4ef1736b22ce59607eebsewardj /* The Irecv detailed in 'shadow' completed. Paint the result 1357b727b54c51af958caadd4ef1736b22ce59607eebsewardj buffer, and delete the entry. */ 1358c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (count_from_Status(&recv_count, shadow->datatype, status)) { 1359dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn make_mem_defined_if_addressable(shadow->buf, recv_count, shadow->datatype); 1360ec8b614219f9746385ee7d0bc20e209302713f68sewardj if (opt_verbosity > 1) 1361c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj fprintf(stderr, "%s %5d: sReq- %p (completed)\n", 1362c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj preamble, my_pid, request_before); 1363c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 1364c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj delete_shadow_Request(request_before); 1365c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 1366c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 1367c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1368c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1369c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Isend --- */ 1370c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* rd: (buf,count,datatype) */ 1371c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* wr: *request */ 1372cf375348308c3b81dca2864898772c4d2ac2ee76sewardjstatic __inline__ 13739c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint generic_Isend(void *buf, int count, MPI_Datatype datatype, 13749c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj int dest, int tag, MPI_Comm comm, 13759c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj MPI_Request* request) 1376c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 1377c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj OrigFn fn; 1378c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int err; 1379c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj VALGRIND_GET_ORIG_FN(fn); 13809c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj before("{,B,S,R}Isend"); 1381dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_defined(buf, count, datatype); 1382dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable_untyped(request, sizeof(*request)); 1383dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 1384c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj CALL_FN_W_7W(err, fn, buf,count,datatype,dest,tag,comm,request); 1385dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 1386dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn make_mem_defined_if_addressable_if_success_untyped(err, request, sizeof(*request)); 13879c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj after("{,B,S,R}Isend", err); 1388c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj return err; 1389c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 13909c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Isend)(void *buf, int count, MPI_Datatype datatype, 13919c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj int dest, int tag, MPI_Comm comm, 13929c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj MPI_Request* request) { 13939c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj return generic_Isend(buf,count,datatype, dest,tag,comm, request); 13949c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj} 13959c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Ibsend)(void *buf, int count, MPI_Datatype datatype, 13969c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj int dest, int tag, MPI_Comm comm, 13979c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj MPI_Request* request) { 13989c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj return generic_Isend(buf,count,datatype, dest,tag,comm, request); 13999c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj} 14009c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Issend)(void *buf, int count, MPI_Datatype datatype, 14019c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj int dest, int tag, MPI_Comm comm, 14029c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj MPI_Request* request) { 14039c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj return generic_Isend(buf,count,datatype, dest,tag,comm, request); 14049c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj} 14059c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Irsend)(void *buf, int count, MPI_Datatype datatype, 14069c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj int dest, int tag, MPI_Comm comm, 14079c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj MPI_Request* request) { 14089c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj return generic_Isend(buf,count,datatype, dest,tag,comm, request); 14099c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj} 14109c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj 1411c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1412c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Irecv --- */ 1413c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* pre: must be writable: (buf,count,datatype), *request 1414c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj post: make readable *request 1415c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj add a request->(buf,count,ty) binding to the 1416c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj shadow request table. 1417c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj*/ 1418c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Irecv)( void* buf, int count, MPI_Datatype datatype, 1419c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int source, int tag, MPI_Comm comm, 1420c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj MPI_Request* request ) 1421c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 1422c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj OrigFn fn; 1423c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int err; 1424c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj VALGRIND_GET_ORIG_FN(fn); 1425c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj before("Irecv"); 1426dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable(buf, count, datatype); 1427dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable_untyped(request, sizeof(*request)); 1428dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 1429c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj CALL_FN_W_7W(err, fn, buf,count,datatype,source,tag,comm,request); 1430dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 1431c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (err == MPI_SUCCESS) { 1432dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn make_mem_defined_if_addressable_untyped(request, sizeof(*request)); 1433c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj add_shadow_Request( *request, buf,count,datatype ); 1434c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 1435c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj after("Irecv", err); 1436c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj return err; 1437c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 1438c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1439c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Wait --- */ 1440b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* The MPI1 spec (imprecisely) defines 3 request states: 1441b727b54c51af958caadd4ef1736b22ce59607eebsewardj - "null" if the request is MPI_REQUEST_NULL 1442b727b54c51af958caadd4ef1736b22ce59607eebsewardj - "inactive" if not "null" and not associated with ongoing comms 1443b727b54c51af958caadd4ef1736b22ce59607eebsewardj - "active" if not "null" and is associated with ongoing comms 1444b727b54c51af958caadd4ef1736b22ce59607eebsewardj*/ 1445c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Wait)( MPI_Request* request, 1446c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj MPI_Status* status ) 1447c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 1448c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj MPI_Request request_before; 1449753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj MPI_Status fake_status; 1450c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj OrigFn fn; 1451c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int err; 1452c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj VALGRIND_GET_ORIG_FN(fn); 1453c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj before("Wait"); 1454753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj if (isMSI(status)) 1455753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj status = &fake_status; 1456dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable_untyped(status, sizeof(MPI_Status)); 1457dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_defined_untyped(request, sizeof(MPI_Request)); 1458c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj request_before = *request; 1459dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 1460c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj CALL_FN_W_WW(err, fn, request,status); 1461dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 1462c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (err == MPI_SUCCESS) { 1463c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj maybe_complete(False/*err in status?*/, 1464c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj request_before, *request, status); 1465dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn make_mem_defined_if_addressable_untyped(status, sizeof(MPI_Status)); 1466c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 1467c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj after("Wait", err); 1468c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj return err; 1469c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 1470c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1471982751b29b4fe1623a8ce3504004b567f27a2b5csewardj/* --- Waitany --- */ 1472982751b29b4fe1623a8ce3504004b567f27a2b5csewardjint WRAPPER_FOR(PMPI_Waitany)( int count, 1473982751b29b4fe1623a8ce3504004b567f27a2b5csewardj MPI_Request* requests, 1474982751b29b4fe1623a8ce3504004b567f27a2b5csewardj int* index, 1475982751b29b4fe1623a8ce3504004b567f27a2b5csewardj MPI_Status* status ) 1476982751b29b4fe1623a8ce3504004b567f27a2b5csewardj{ 1477982751b29b4fe1623a8ce3504004b567f27a2b5csewardj MPI_Request* requests_before = NULL; 1478753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj MPI_Status fake_status; 1479982751b29b4fe1623a8ce3504004b567f27a2b5csewardj OrigFn fn; 1480982751b29b4fe1623a8ce3504004b567f27a2b5csewardj int err, i; 1481982751b29b4fe1623a8ce3504004b567f27a2b5csewardj VALGRIND_GET_ORIG_FN(fn); 1482982751b29b4fe1623a8ce3504004b567f27a2b5csewardj before("Waitany"); 1483753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj if (isMSI(status)) 1484753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj status = &fake_status; 1485982751b29b4fe1623a8ce3504004b567f27a2b5csewardj if (0) fprintf(stderr, "Waitany: %d\n", count); 1486982751b29b4fe1623a8ce3504004b567f27a2b5csewardj check_mem_is_addressable_untyped(index, sizeof(int)); 1487982751b29b4fe1623a8ce3504004b567f27a2b5csewardj check_mem_is_addressable_untyped(status, sizeof(MPI_Status)); 1488982751b29b4fe1623a8ce3504004b567f27a2b5csewardj for (i = 0; i < count; i++) { 1489982751b29b4fe1623a8ce3504004b567f27a2b5csewardj check_mem_is_defined_untyped(&requests[i], sizeof(MPI_Request)); 1490982751b29b4fe1623a8ce3504004b567f27a2b5csewardj } 1491982751b29b4fe1623a8ce3504004b567f27a2b5csewardj requests_before = clone_Request_array( count, requests ); 1492dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 1493982751b29b4fe1623a8ce3504004b567f27a2b5csewardj CALL_FN_W_WWWW(err, fn, count,requests,index,status); 1494dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 1495982751b29b4fe1623a8ce3504004b567f27a2b5csewardj if (err == MPI_SUCCESS && *index >= 0 && *index < count) { 1496982751b29b4fe1623a8ce3504004b567f27a2b5csewardj maybe_complete(False/*err in status?*/, 1497982751b29b4fe1623a8ce3504004b567f27a2b5csewardj requests_before[*index], requests[*index], status); 1498982751b29b4fe1623a8ce3504004b567f27a2b5csewardj make_mem_defined_if_addressable_untyped(status, sizeof(MPI_Status)); 1499982751b29b4fe1623a8ce3504004b567f27a2b5csewardj } 1500982751b29b4fe1623a8ce3504004b567f27a2b5csewardj if (requests_before) 1501982751b29b4fe1623a8ce3504004b567f27a2b5csewardj free(requests_before); 1502982751b29b4fe1623a8ce3504004b567f27a2b5csewardj after("Waitany", err); 1503982751b29b4fe1623a8ce3504004b567f27a2b5csewardj return err; 1504982751b29b4fe1623a8ce3504004b567f27a2b5csewardj} 1505982751b29b4fe1623a8ce3504004b567f27a2b5csewardj 1506c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Waitall --- */ 1507c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Waitall)( int count, 1508c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj MPI_Request* requests, 1509c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj MPI_Status* statuses ) 1510c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 1511c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj MPI_Request* requests_before = NULL; 1512c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj OrigFn fn; 1513c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int err, i; 1514753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj Bool free_sta = False; 1515c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj VALGRIND_GET_ORIG_FN(fn); 1516c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj before("Waitall"); 1517c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (0) fprintf(stderr, "Waitall: %d\n", count); 1518753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj if (isMSI(statuses)) { 1519753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj free_sta = True; 1520753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj statuses = malloc( (count < 0 ? 0 : count) * sizeof(MPI_Status) ); 1521753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj } 1522c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj for (i = 0; i < count; i++) { 1523dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable_untyped(&statuses[i], sizeof(MPI_Status)); 1524dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_defined_untyped(&requests[i], sizeof(MPI_Request)); 1525c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 1526c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj requests_before = clone_Request_array( count, requests ); 1527dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 1528c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj CALL_FN_W_WWW(err, fn, count,requests,statuses); 1529dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 1530c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (err == MPI_SUCCESS /*complete success*/ 1531c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj || err == MPI_ERR_IN_STATUS /* partial success */) { 1532c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj Bool e_i_s = err == MPI_ERR_IN_STATUS; 1533c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj for (i = 0; i < count; i++) { 1534c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj maybe_complete(e_i_s, requests_before[i], requests[i], 1535c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj &statuses[i]); 1536dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn make_mem_defined_if_addressable_untyped(&statuses[i], 1537dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn sizeof(MPI_Status)); 1538c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 1539c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 1540c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (requests_before) 1541c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj free(requests_before); 1542753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj if (free_sta) 1543753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj free(statuses); 1544c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj after("Waitall", err); 1545c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj return err; 1546c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 1547c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1548b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* --- Test --- */ 1549b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* nonblocking version of Wait */ 1550b727b54c51af958caadd4ef1736b22ce59607eebsewardjint WRAPPER_FOR(PMPI_Test)( MPI_Request* request, int* flag, 1551b727b54c51af958caadd4ef1736b22ce59607eebsewardj MPI_Status* status ) 1552b727b54c51af958caadd4ef1736b22ce59607eebsewardj{ 1553b727b54c51af958caadd4ef1736b22ce59607eebsewardj MPI_Request request_before; 1554753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj MPI_Status fake_status; 1555b727b54c51af958caadd4ef1736b22ce59607eebsewardj OrigFn fn; 1556b727b54c51af958caadd4ef1736b22ce59607eebsewardj int err; 1557b727b54c51af958caadd4ef1736b22ce59607eebsewardj VALGRIND_GET_ORIG_FN(fn); 1558b727b54c51af958caadd4ef1736b22ce59607eebsewardj before("Test"); 1559753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj if (isMSI(status)) 1560753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj status = &fake_status; 1561dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable_untyped(status, sizeof(MPI_Status)); 1562dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable_untyped(flag, sizeof(int)); 1563dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_defined_untyped(request, sizeof(MPI_Request)); 1564b727b54c51af958caadd4ef1736b22ce59607eebsewardj request_before = *request; 1565dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 1566b727b54c51af958caadd4ef1736b22ce59607eebsewardj CALL_FN_W_WWW(err, fn, request,flag,status); 1567dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 1568b727b54c51af958caadd4ef1736b22ce59607eebsewardj if (err == MPI_SUCCESS && *flag) { 1569b727b54c51af958caadd4ef1736b22ce59607eebsewardj maybe_complete(False/*err in status?*/, 1570b727b54c51af958caadd4ef1736b22ce59607eebsewardj request_before, *request, status); 1571dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn make_mem_defined_if_addressable_untyped(status, sizeof(MPI_Status)); 1572b727b54c51af958caadd4ef1736b22ce59607eebsewardj } 1573b727b54c51af958caadd4ef1736b22ce59607eebsewardj after("Test", err); 1574b727b54c51af958caadd4ef1736b22ce59607eebsewardj return err; 1575b727b54c51af958caadd4ef1736b22ce59607eebsewardj} 1576b727b54c51af958caadd4ef1736b22ce59607eebsewardj 1577b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* --- Testall --- */ 1578b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* nonblocking version of Waitall */ 1579b727b54c51af958caadd4ef1736b22ce59607eebsewardjint WRAPPER_FOR(PMPI_Testall)( int count, MPI_Request* requests, 1580b727b54c51af958caadd4ef1736b22ce59607eebsewardj int* flag, MPI_Status* statuses ) 1581b727b54c51af958caadd4ef1736b22ce59607eebsewardj{ 1582b727b54c51af958caadd4ef1736b22ce59607eebsewardj MPI_Request* requests_before = NULL; 1583b727b54c51af958caadd4ef1736b22ce59607eebsewardj OrigFn fn; 1584b727b54c51af958caadd4ef1736b22ce59607eebsewardj int err, i; 1585753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj Bool free_sta = False; 1586b727b54c51af958caadd4ef1736b22ce59607eebsewardj VALGRIND_GET_ORIG_FN(fn); 1587b727b54c51af958caadd4ef1736b22ce59607eebsewardj before("Testall"); 1588b727b54c51af958caadd4ef1736b22ce59607eebsewardj if (0) fprintf(stderr, "Testall: %d\n", count); 1589753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj if (isMSI(statuses)) { 1590753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj free_sta = True; 1591753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj statuses = malloc( (count < 0 ? 0 : count) * sizeof(MPI_Status) ); 1592753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj } 1593dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable_untyped(flag, sizeof(int)); 1594b727b54c51af958caadd4ef1736b22ce59607eebsewardj for (i = 0; i < count; i++) { 1595dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable_untyped(&statuses[i], sizeof(MPI_Status)); 1596dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_defined_untyped(&requests[i], sizeof(MPI_Request)); 1597b727b54c51af958caadd4ef1736b22ce59607eebsewardj } 1598b727b54c51af958caadd4ef1736b22ce59607eebsewardj requests_before = clone_Request_array( count, requests ); 1599dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 1600b727b54c51af958caadd4ef1736b22ce59607eebsewardj CALL_FN_W_WWWW(err, fn, count,requests,flag,statuses); 1601dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 1602b727b54c51af958caadd4ef1736b22ce59607eebsewardj /* Urk. Is the following "if (...)" really right? I don't know. */ 1603b727b54c51af958caadd4ef1736b22ce59607eebsewardj if (*flag 1604b727b54c51af958caadd4ef1736b22ce59607eebsewardj && (err == MPI_SUCCESS /*complete success*/ 1605b727b54c51af958caadd4ef1736b22ce59607eebsewardj || err == MPI_ERR_IN_STATUS /* partial success */)) { 1606b727b54c51af958caadd4ef1736b22ce59607eebsewardj Bool e_i_s = err == MPI_ERR_IN_STATUS; 1607b727b54c51af958caadd4ef1736b22ce59607eebsewardj for (i = 0; i < count; i++) { 1608b727b54c51af958caadd4ef1736b22ce59607eebsewardj maybe_complete(e_i_s, requests_before[i], requests[i], 1609b727b54c51af958caadd4ef1736b22ce59607eebsewardj &statuses[i]); 1610753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj make_mem_defined_if_addressable_untyped(&statuses[i], 1611753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj sizeof(MPI_Status)); 1612b727b54c51af958caadd4ef1736b22ce59607eebsewardj } 1613b727b54c51af958caadd4ef1736b22ce59607eebsewardj } 1614b727b54c51af958caadd4ef1736b22ce59607eebsewardj if (requests_before) 1615b727b54c51af958caadd4ef1736b22ce59607eebsewardj free(requests_before); 1616753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj if (free_sta) 1617753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj free(statuses); 1618b727b54c51af958caadd4ef1736b22ce59607eebsewardj after("Testall", err); 1619b727b54c51af958caadd4ef1736b22ce59607eebsewardj return err; 1620b727b54c51af958caadd4ef1736b22ce59607eebsewardj} 1621b727b54c51af958caadd4ef1736b22ce59607eebsewardj 1622c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Iprobe --- */ 1623c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* pre: must-be-writable: *flag, *status */ 1624c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* post: make-readable *flag 1625b727b54c51af958caadd4ef1736b22ce59607eebsewardj if *flag==True make-defined *status */ 1626c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Iprobe)(int source, int tag, 1627c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj MPI_Comm comm, 1628c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int* flag, MPI_Status* status) 1629c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 1630753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj MPI_Status fake_status; 1631753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj OrigFn fn; 1632753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj int err; 1633c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj VALGRIND_GET_ORIG_FN(fn); 1634c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj before("Iprobe"); 1635753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj if (isMSI(status)) 1636753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj status = &fake_status; 1637dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable_untyped(flag, sizeof(*flag)); 1638dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable_untyped(status, sizeof(*status)); 1639dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 1640c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj CALL_FN_W_5W(err, fn, source,tag,comm,flag,status); 1641dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 1642c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (err == MPI_SUCCESS) { 1643dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn make_mem_defined_if_addressable_untyped(flag, sizeof(*flag)); 1644c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (*flag) 1645dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn make_mem_defined_if_addressable_untyped(status, sizeof(*status)); 1646c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 1647c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj after("Iprobe", err); 1648c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj return err; 1649c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 1650c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1651b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* --- Probe --- */ 1652b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* pre: must-be-writable *status */ 1653b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* post: make-defined *status */ 1654b727b54c51af958caadd4ef1736b22ce59607eebsewardjint WRAPPER_FOR(PMPI_Probe)(int source, int tag, 1655b727b54c51af958caadd4ef1736b22ce59607eebsewardj MPI_Comm comm, MPI_Status* status) 1656b727b54c51af958caadd4ef1736b22ce59607eebsewardj{ 1657753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj MPI_Status fake_status; 1658753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj OrigFn fn; 1659753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj int err; 1660b727b54c51af958caadd4ef1736b22ce59607eebsewardj VALGRIND_GET_ORIG_FN(fn); 1661b727b54c51af958caadd4ef1736b22ce59607eebsewardj before("Probe"); 1662753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj if (isMSI(status)) 1663753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj status = &fake_status; 1664dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable_untyped(status, sizeof(*status)); 1665dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 1666b727b54c51af958caadd4ef1736b22ce59607eebsewardj CALL_FN_W_WWWW(err, fn, source,tag,comm,status); 1667dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 1668dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn make_mem_defined_if_addressable_if_success_untyped(err, status, sizeof(*status)); 1669b727b54c51af958caadd4ef1736b22ce59607eebsewardj after("Probe", err); 1670b727b54c51af958caadd4ef1736b22ce59607eebsewardj return err; 1671b727b54c51af958caadd4ef1736b22ce59607eebsewardj} 1672b727b54c51af958caadd4ef1736b22ce59607eebsewardj 1673b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* --- Cancel --- */ 1674b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* Wrapping PMPI_Cancel is interesting only to the extent that we need 1675b727b54c51af958caadd4ef1736b22ce59607eebsewardj to be able to detect when a request should be removed from our 1676b727b54c51af958caadd4ef1736b22ce59607eebsewardj shadow table due to cancellation. */ 1677b727b54c51af958caadd4ef1736b22ce59607eebsewardjint WRAPPER_FOR(PMPI_Cancel)(MPI_Request* request) 1678b727b54c51af958caadd4ef1736b22ce59607eebsewardj{ 1679b727b54c51af958caadd4ef1736b22ce59607eebsewardj OrigFn fn; 1680b727b54c51af958caadd4ef1736b22ce59607eebsewardj int err; 1681b727b54c51af958caadd4ef1736b22ce59607eebsewardj MPI_Request tmp; 1682b727b54c51af958caadd4ef1736b22ce59607eebsewardj VALGRIND_GET_ORIG_FN(fn); 1683b727b54c51af958caadd4ef1736b22ce59607eebsewardj before("Cancel"); 1684dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable_untyped(request, sizeof(*request)); 1685b727b54c51af958caadd4ef1736b22ce59607eebsewardj tmp = *request; 1686dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 1687b727b54c51af958caadd4ef1736b22ce59607eebsewardj CALL_FN_W_W(err, fn, request); 1688dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 1689b727b54c51af958caadd4ef1736b22ce59607eebsewardj if (err == MPI_SUCCESS) 1690b727b54c51af958caadd4ef1736b22ce59607eebsewardj delete_shadow_Request(tmp); 1691b727b54c51af958caadd4ef1736b22ce59607eebsewardj after("Cancel", err); 1692b727b54c51af958caadd4ef1736b22ce59607eebsewardj return err; 1693b727b54c51af958caadd4ef1736b22ce59607eebsewardj} 1694b727b54c51af958caadd4ef1736b22ce59607eebsewardj 1695c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1696c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 1697c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- ---*/ 1698c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Sec 3.10, Send-receive ---*/ 1699c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- ---*/ 1700c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 1701c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1702c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Sendrecv --- */ 1703c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* pre: must be readable: (sendbuf,sendcount,sendtype) 1704c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj must be writable: (recvbuf,recvcount,recvtype) 1705c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj post: make readable: (recvbuf,recvcount_actual,datatype) 1706c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj where recvcount_actual is determined from *status 1707c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj*/ 1708c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Sendrecv)( 1709c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj void *sendbuf, int sendcount, MPI_Datatype sendtype, 1710c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int dest, int sendtag, 1711c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj void *recvbuf, int recvcount, MPI_Datatype recvtype, 1712c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int source, int recvtag, 1713c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj MPI_Comm comm, MPI_Status *status) 1714c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 1715753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj MPI_Status fake_status; 1716753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj OrigFn fn; 1717753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj int err, recvcount_actual = 0; 1718c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj VALGRIND_GET_ORIG_FN(fn); 1719c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj before("Sendrecv"); 1720753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj if (isMSI(status)) 1721753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj status = &fake_status; 1722dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_defined(sendbuf, sendcount, sendtype); 1723dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable(recvbuf, recvcount, recvtype); 1724753ab9ddc9605773accb060f2762c0eb063a0fc2sewardj check_mem_is_addressable_untyped(status, sizeof(*status)); 1725dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 1726c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj CALL_FN_W_12W(err, fn, sendbuf,sendcount,sendtype,dest,sendtag, 1727c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj recvbuf,recvcount,recvtype,source,recvtag, 1728c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj comm,status); 1729dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 173026c60a8706eb45cbf303437adc87e313e104d4efsewardj make_mem_defined_if_addressable_if_success_untyped(err, status, sizeof(*status)); 1731c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (err == MPI_SUCCESS 1732c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj && count_from_Status(&recvcount_actual,recvtype,status)) { 1733dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn make_mem_defined_if_addressable(recvbuf, recvcount_actual, recvtype); 1734c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 1735c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj after("Sendrecv", err); 1736c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj return err; 1737c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 1738c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1739c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1740c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 1741c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- ---*/ 1742c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Sec 3.12, Derived datatypes ---*/ 1743c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- ---*/ 1744c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 1745c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1746c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Address --- */ 1747c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* Does this have anything worth checking? */ 17489c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjHAS_NO_WRAPPER(Address) 17499c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj 17509c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* --- MPI 2 stuff --- */ 17519c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* Type_extent, Type_get_contents and Type_get_envelope sometimes get 17529c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj used intensively by the type walker (walk_type). There's no reason 17539c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj why they couldn't be properly wrapped if needed, but doing so slows 17549c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj everything down, so don't bother until needed. */ 17559c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjHAS_NO_WRAPPER(Type_extent) 17569c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjHAS_NO_WRAPPER(Type_get_contents) 17579c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjHAS_NO_WRAPPER(Type_get_envelope) 17589c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj 17599c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* --- Type_commit --- */ 17609c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Type_commit)( MPI_Datatype* ty ) 17619c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj{ 17629c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj OrigFn fn; 17639c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj int err; 17649c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj VALGRIND_GET_ORIG_FN(fn); 17659c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj before("Type_commit"); 1766dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_defined_untyped(ty, sizeof(*ty)); 1767dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 17689c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj CALL_FN_W_W(err, fn, ty); 1769dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 17709c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj after("Type_commit", err); 17719c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj return err; 17729c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj} 17739c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj 17749c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* --- Type_free --- */ 17759c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Type_free)( MPI_Datatype* ty ) 17769c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj{ 17779c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj OrigFn fn; 17789c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj int err; 17799c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj VALGRIND_GET_ORIG_FN(fn); 17809c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj before("Type_free"); 1781dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_defined_untyped(ty, sizeof(*ty)); 1782dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 17839c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj CALL_FN_W_W(err, fn, ty); 1784dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 17859c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj after("Type_free", err); 17869c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj return err; 17879c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj} 1788c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1789c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1790c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 1791c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- ---*/ 1792ee3465927d146e6b632dc550e1f6f41867bb5321sewardj/*--- Sec 3.13, Pack and unpack ---*/ 1793ee3465927d146e6b632dc550e1f6f41867bb5321sewardj/*--- ---*/ 1794ee3465927d146e6b632dc550e1f6f41867bb5321sewardj/*------------------------------------------------------------*/ 1795ee3465927d146e6b632dc550e1f6f41867bb5321sewardj 1796ee3465927d146e6b632dc550e1f6f41867bb5321sewardj/* --- Pack --- */ 1797ee3465927d146e6b632dc550e1f6f41867bb5321sewardj/* pre: must be readable: position 1798ee3465927d146e6b632dc550e1f6f41867bb5321sewardj must be readable: (inbuf,incount,datatype) 1799ee3465927d146e6b632dc550e1f6f41867bb5321sewardj must be writable: outbuf[0 .. outsize-1] 1800ee3465927d146e6b632dc550e1f6f41867bb5321sewardj must be writable: outbuf[*position .. 1801ee3465927d146e6b632dc550e1f6f41867bb5321sewardj *position - 1 1802ee3465927d146e6b632dc550e1f6f41867bb5321sewardj + however much space PMPI_Pack_size 1803ee3465927d146e6b632dc550e1f6f41867bb5321sewardj says we will need] 1804ee3465927d146e6b632dc550e1f6f41867bb5321sewardj post: make readable: outbuf[old *position .. new *position] 1805ee3465927d146e6b632dc550e1f6f41867bb5321sewardj*/ 1806ee3465927d146e6b632dc550e1f6f41867bb5321sewardjint WRAPPER_FOR(PMPI_Pack)( void* inbuf, int incount, MPI_Datatype datatype, 1807ee3465927d146e6b632dc550e1f6f41867bb5321sewardj void* outbuf, int outsize, 1808ee3465927d146e6b632dc550e1f6f41867bb5321sewardj int* position, MPI_Comm comm ) 1809ee3465927d146e6b632dc550e1f6f41867bb5321sewardj{ 1810ee3465927d146e6b632dc550e1f6f41867bb5321sewardj OrigFn fn; 1811ee3465927d146e6b632dc550e1f6f41867bb5321sewardj int err, szB = 0; 1812ee3465927d146e6b632dc550e1f6f41867bb5321sewardj int position_ORIG = *position; 1813ee3465927d146e6b632dc550e1f6f41867bb5321sewardj VALGRIND_GET_ORIG_FN(fn); 1814ee3465927d146e6b632dc550e1f6f41867bb5321sewardj before("Pack"); 1815ee3465927d146e6b632dc550e1f6f41867bb5321sewardj /* stay sane */ 1816ee3465927d146e6b632dc550e1f6f41867bb5321sewardj check_mem_is_defined_untyped(position, sizeof(*position)); 1817ee3465927d146e6b632dc550e1f6f41867bb5321sewardj /* check input */ 1818ee3465927d146e6b632dc550e1f6f41867bb5321sewardj check_mem_is_defined(inbuf, incount, datatype); 1819ee3465927d146e6b632dc550e1f6f41867bb5321sewardj /* check output area's stated bounds make sense */ 1820ee3465927d146e6b632dc550e1f6f41867bb5321sewardj check_mem_is_addressable_untyped(outbuf, outsize); 1821ee3465927d146e6b632dc550e1f6f41867bb5321sewardj /* check output area's actual used size properly */ 1822ee3465927d146e6b632dc550e1f6f41867bb5321sewardj err = PMPI_Pack_size( incount, datatype, comm, &szB ); 1823ee3465927d146e6b632dc550e1f6f41867bb5321sewardj if (err == MPI_SUCCESS && szB > 0) { 1824ee3465927d146e6b632dc550e1f6f41867bb5321sewardj check_mem_is_addressable_untyped( 1825ee3465927d146e6b632dc550e1f6f41867bb5321sewardj ((char*)outbuf) + position_ORIG, szB 1826ee3465927d146e6b632dc550e1f6f41867bb5321sewardj ); 1827ee3465927d146e6b632dc550e1f6f41867bb5321sewardj } 1828ee3465927d146e6b632dc550e1f6f41867bb5321sewardj 1829dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 1830ee3465927d146e6b632dc550e1f6f41867bb5321sewardj CALL_FN_W_7W(err, fn, inbuf,incount,datatype, outbuf,outsize,position, comm); 1831dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 1832ee3465927d146e6b632dc550e1f6f41867bb5321sewardj 1833ee3465927d146e6b632dc550e1f6f41867bb5321sewardj if (err == MPI_SUCCESS && (*position) > position_ORIG) { 1834ee3465927d146e6b632dc550e1f6f41867bb5321sewardj /* paint output */ 1835ee3465927d146e6b632dc550e1f6f41867bb5321sewardj make_mem_defined_if_addressable_untyped( 1836ee3465927d146e6b632dc550e1f6f41867bb5321sewardj ((char*)outbuf) + position_ORIG, *position - position_ORIG 1837ee3465927d146e6b632dc550e1f6f41867bb5321sewardj ); 1838ee3465927d146e6b632dc550e1f6f41867bb5321sewardj } 1839ee3465927d146e6b632dc550e1f6f41867bb5321sewardj after("Pack", err); 1840ee3465927d146e6b632dc550e1f6f41867bb5321sewardj return err; 1841ee3465927d146e6b632dc550e1f6f41867bb5321sewardj} 1842ee3465927d146e6b632dc550e1f6f41867bb5321sewardj 1843ee3465927d146e6b632dc550e1f6f41867bb5321sewardj/* --- Unpack --- */ 1844ee3465927d146e6b632dc550e1f6f41867bb5321sewardj/* pre: must be readable: position 1845ee3465927d146e6b632dc550e1f6f41867bb5321sewardj must be writable: (outbuf,outcount,datatype) 1846ee3465927d146e6b632dc550e1f6f41867bb5321sewardj must be writable: outbuf[0 .. outsize-1] 1847ee3465927d146e6b632dc550e1f6f41867bb5321sewardj must be writable: outbuf[*position .. 1848ee3465927d146e6b632dc550e1f6f41867bb5321sewardj *position - 1 1849ee3465927d146e6b632dc550e1f6f41867bb5321sewardj + however much space PMPI_Pack_size 1850ee3465927d146e6b632dc550e1f6f41867bb5321sewardj says we will need] 1851ee3465927d146e6b632dc550e1f6f41867bb5321sewardj post: make readable: (outbuf,outcount,datatype) 1852ee3465927d146e6b632dc550e1f6f41867bb5321sewardj and also do a readability check of 1853ee3465927d146e6b632dc550e1f6f41867bb5321sewardj inbuf[old *position .. new *position] 1854ee3465927d146e6b632dc550e1f6f41867bb5321sewardj*/ 1855ee3465927d146e6b632dc550e1f6f41867bb5321sewardjint WRAPPER_FOR(PMPI_Unpack)( void* inbuf, int insize, int* position, 1856ee3465927d146e6b632dc550e1f6f41867bb5321sewardj void* outbuf, int outcount, MPI_Datatype datatype, 1857ee3465927d146e6b632dc550e1f6f41867bb5321sewardj MPI_Comm comm ) 1858ee3465927d146e6b632dc550e1f6f41867bb5321sewardj{ 1859ee3465927d146e6b632dc550e1f6f41867bb5321sewardj OrigFn fn; 1860ee3465927d146e6b632dc550e1f6f41867bb5321sewardj int err, szB = 0; 1861ee3465927d146e6b632dc550e1f6f41867bb5321sewardj int position_ORIG = *position; 1862ee3465927d146e6b632dc550e1f6f41867bb5321sewardj VALGRIND_GET_ORIG_FN(fn); 1863ee3465927d146e6b632dc550e1f6f41867bb5321sewardj before("Unpack"); 1864ee3465927d146e6b632dc550e1f6f41867bb5321sewardj /* stay sane */ 1865ee3465927d146e6b632dc550e1f6f41867bb5321sewardj check_mem_is_defined_untyped(position, sizeof(*position)); 1866ee3465927d146e6b632dc550e1f6f41867bb5321sewardj /* check output area is accessible */ 1867ee3465927d146e6b632dc550e1f6f41867bb5321sewardj check_mem_is_addressable(outbuf, outcount, datatype); 1868ee3465927d146e6b632dc550e1f6f41867bb5321sewardj /* check input area's stated bounds make sense */ 1869ee3465927d146e6b632dc550e1f6f41867bb5321sewardj check_mem_is_addressable_untyped(inbuf, insize); 1870ee3465927d146e6b632dc550e1f6f41867bb5321sewardj /* check input area's actual used size properly */ 1871ee3465927d146e6b632dc550e1f6f41867bb5321sewardj err = PMPI_Pack_size( outcount, datatype, comm, &szB ); 1872ee3465927d146e6b632dc550e1f6f41867bb5321sewardj if (err == MPI_SUCCESS && szB > 0) { 1873ee3465927d146e6b632dc550e1f6f41867bb5321sewardj check_mem_is_addressable_untyped( 1874ee3465927d146e6b632dc550e1f6f41867bb5321sewardj ((char*)inbuf) + position_ORIG, szB 1875ee3465927d146e6b632dc550e1f6f41867bb5321sewardj ); 1876ee3465927d146e6b632dc550e1f6f41867bb5321sewardj } 1877ee3465927d146e6b632dc550e1f6f41867bb5321sewardj 1878dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 1879ee3465927d146e6b632dc550e1f6f41867bb5321sewardj CALL_FN_W_7W(err, fn, inbuf,insize,position, outbuf,outcount,datatype, comm); 1880dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 1881ee3465927d146e6b632dc550e1f6f41867bb5321sewardj 1882ee3465927d146e6b632dc550e1f6f41867bb5321sewardj if (err == MPI_SUCCESS && (*position) > position_ORIG) { 1883ee3465927d146e6b632dc550e1f6f41867bb5321sewardj /* recheck input more carefully */ 1884ee3465927d146e6b632dc550e1f6f41867bb5321sewardj check_mem_is_defined_untyped( 1885ee3465927d146e6b632dc550e1f6f41867bb5321sewardj ((char*)inbuf) + position_ORIG, *position - position_ORIG 1886ee3465927d146e6b632dc550e1f6f41867bb5321sewardj ); 1887ee3465927d146e6b632dc550e1f6f41867bb5321sewardj /* paint output */ 1888ee3465927d146e6b632dc550e1f6f41867bb5321sewardj make_mem_defined_if_addressable( outbuf, outcount, datatype ); 1889ee3465927d146e6b632dc550e1f6f41867bb5321sewardj } 1890ee3465927d146e6b632dc550e1f6f41867bb5321sewardj after("Unpack", err); 1891ee3465927d146e6b632dc550e1f6f41867bb5321sewardj return err; 1892ee3465927d146e6b632dc550e1f6f41867bb5321sewardj} 1893ee3465927d146e6b632dc550e1f6f41867bb5321sewardj 1894ee3465927d146e6b632dc550e1f6f41867bb5321sewardj 1895ee3465927d146e6b632dc550e1f6f41867bb5321sewardj/*------------------------------------------------------------*/ 1896ee3465927d146e6b632dc550e1f6f41867bb5321sewardj/*--- ---*/ 1897c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Sec 4.4, Broadcast ---*/ 1898c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- ---*/ 1899c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 1900c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1901c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Bcast --- */ 1902c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* pre: must-be-readable (buffer,count,datatype) for rank==root 1903c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj must-be-writable (buffer,count,datatype) for rank!=root 1904c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj post: make-readable (buffer,count,datatype) for all 1905c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1906c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj Resulting behaviour is: if root sends uninitialised stuff, then 1907c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj V complains, but then all ranks, including itself, see the buffer 1908c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj as initialised after that. 1909c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj*/ 1910c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Bcast)(void *buffer, int count, 1911c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj MPI_Datatype datatype, 1912c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int root, MPI_Comm comm) 1913c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 1914c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj OrigFn fn; 1915c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int err; 1916c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj Bool i_am_sender; 1917c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj VALGRIND_GET_ORIG_FN(fn); 1918c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj before("Bcast"); 1919c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj i_am_sender = root == comm_rank(comm); 1920c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (i_am_sender) { 1921dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_defined(buffer, count, datatype); 1922c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } else { 1923dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable(buffer, count, datatype); 1924c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj } 1925dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 1926c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj CALL_FN_W_5W(err, fn, buffer,count,datatype,root,comm); 1927dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 1928dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn make_mem_defined_if_addressable_if_success(err, buffer, count, datatype); 1929c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj after("Bcast", err); 1930c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj return err; 1931c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 1932c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1933c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1934c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 1935c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- ---*/ 1936c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Sec 4.5, Gather ---*/ 1937c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- ---*/ 1938c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 1939c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1940c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Gather --- */ 1941c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* JRS 20060217: I don't really understand this. Each process is 1942c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj going to send sendcount items of type sendtype to the root. So 1943c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj the root is going to receive comm_size*sendcount items of type 1944c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj sendtype (right?) So why specify recvcount and recvtype? 1945c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1946c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj Anyway, assuming the MPI Spec is correct (seems likely :-) we have: 1947c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1948c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj pre: (all) must be readable: (sendbuf,sendcount,sendtype) 1949c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj (root only): must be writable: (recvbuf,recvcount * comm_size,recvtype) 1950c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj post: (root only): make readable: (recvbuf,recvcount * comm_size,recvtype) 1951c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj*/ 1952c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Gather)( 1953c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj void *sendbuf, int sendcount, MPI_Datatype sendtype, 1954c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj void *recvbuf, int recvcount, MPI_Datatype recvtype, 1955c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int root, MPI_Comm comm) 1956c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 1957c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj OrigFn fn; 1958c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int err, me, sz; 1959c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj VALGRIND_GET_ORIG_FN(fn); 1960c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj before("Gather"); 1961c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj me = comm_rank(comm); 1962c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj sz = comm_size(comm); 1963dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_defined(sendbuf, sendcount, sendtype); 1964c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (me == root) 1965dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable(recvbuf, recvcount * sz, recvtype); 1966dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 1967c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj CALL_FN_W_8W(err, fn, sendbuf,sendcount,sendtype, 1968c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj recvbuf,recvcount,recvtype, 1969c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj root,comm); 1970dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 1971b727b54c51af958caadd4ef1736b22ce59607eebsewardj if (me == root) 1972dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn make_mem_defined_if_addressable_if_success(err, recvbuf, recvcount * sz, recvtype); 1973c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj after("Gather", err); 1974c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj return err; 1975c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 1976c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1977c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 1978c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 1979c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- ---*/ 1980b727b54c51af958caadd4ef1736b22ce59607eebsewardj/*--- Sec 4.6, Scatter ---*/ 1981b727b54c51af958caadd4ef1736b22ce59607eebsewardj/*--- ---*/ 1982b727b54c51af958caadd4ef1736b22ce59607eebsewardj/*------------------------------------------------------------*/ 1983b727b54c51af958caadd4ef1736b22ce59607eebsewardj 1984b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* pre: (root only): must be readable: (sendbuf,sendcount * comm_size,sendtype) 1985b727b54c51af958caadd4ef1736b22ce59607eebsewardj (all): must be writable: (recvbuf,recvbuf,recvtype) 1986b727b54c51af958caadd4ef1736b22ce59607eebsewardj post: (all): make defined: (recvbuf,recvbuf,recvtype) 1987b727b54c51af958caadd4ef1736b22ce59607eebsewardj*/ 1988b727b54c51af958caadd4ef1736b22ce59607eebsewardjint WRAPPER_FOR(PMPI_Scatter)( 1989b727b54c51af958caadd4ef1736b22ce59607eebsewardj void* sendbuf, int sendcount, MPI_Datatype sendtype, 1990b727b54c51af958caadd4ef1736b22ce59607eebsewardj void* recvbuf, int recvcount, MPI_Datatype recvtype, 1991b727b54c51af958caadd4ef1736b22ce59607eebsewardj int root, MPI_Comm comm) 1992b727b54c51af958caadd4ef1736b22ce59607eebsewardj{ 1993b727b54c51af958caadd4ef1736b22ce59607eebsewardj OrigFn fn; 1994b727b54c51af958caadd4ef1736b22ce59607eebsewardj int err, me, sz; 1995b727b54c51af958caadd4ef1736b22ce59607eebsewardj VALGRIND_GET_ORIG_FN(fn); 1996b727b54c51af958caadd4ef1736b22ce59607eebsewardj before("Scatter"); 1997b727b54c51af958caadd4ef1736b22ce59607eebsewardj me = comm_rank(comm); 1998b727b54c51af958caadd4ef1736b22ce59607eebsewardj sz = comm_size(comm); 1999dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable(recvbuf, recvcount, recvtype); 2000b727b54c51af958caadd4ef1736b22ce59607eebsewardj if (me == root) 2001dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_defined(sendbuf, sendcount * sz, sendtype); 2002dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 2003b727b54c51af958caadd4ef1736b22ce59607eebsewardj CALL_FN_W_8W(err, fn, sendbuf,sendcount,sendtype, 2004b727b54c51af958caadd4ef1736b22ce59607eebsewardj recvbuf,recvcount,recvtype, 2005b727b54c51af958caadd4ef1736b22ce59607eebsewardj root,comm); 2006dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 2007dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn make_mem_defined_if_addressable_if_success(err, recvbuf, recvcount, recvtype); 2008b727b54c51af958caadd4ef1736b22ce59607eebsewardj after("Scatter", err); 2009b727b54c51af958caadd4ef1736b22ce59607eebsewardj return err; 2010b727b54c51af958caadd4ef1736b22ce59607eebsewardj} 2011b727b54c51af958caadd4ef1736b22ce59607eebsewardj 2012b727b54c51af958caadd4ef1736b22ce59607eebsewardj 2013b727b54c51af958caadd4ef1736b22ce59607eebsewardj/*------------------------------------------------------------*/ 2014b727b54c51af958caadd4ef1736b22ce59607eebsewardj/*--- ---*/ 2015b727b54c51af958caadd4ef1736b22ce59607eebsewardj/*--- Sec 4.8, All-to-All Scatter/Gather ---*/ 2016b727b54c51af958caadd4ef1736b22ce59607eebsewardj/*--- ---*/ 2017b727b54c51af958caadd4ef1736b22ce59607eebsewardj/*------------------------------------------------------------*/ 2018b727b54c51af958caadd4ef1736b22ce59607eebsewardj 2019b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* pre: (all) must be readable: (sendbuf,sendcount * comm_size,sendtype) 2020b727b54c51af958caadd4ef1736b22ce59607eebsewardj (all) must be writable: (recvbuf,recvcount * comm_size,recvtype) 2021b727b54c51af958caadd4ef1736b22ce59607eebsewardj post: (all) make defined: (recvbuf,recvcount * comm_size,recvtype) 2022b727b54c51af958caadd4ef1736b22ce59607eebsewardj*/ 2023b727b54c51af958caadd4ef1736b22ce59607eebsewardjint WRAPPER_FOR(PMPI_Alltoall)( 2024b727b54c51af958caadd4ef1736b22ce59607eebsewardj void* sendbuf, int sendcount, MPI_Datatype sendtype, 2025b727b54c51af958caadd4ef1736b22ce59607eebsewardj void* recvbuf, int recvcount, MPI_Datatype recvtype, 2026b727b54c51af958caadd4ef1736b22ce59607eebsewardj MPI_Comm comm) 2027b727b54c51af958caadd4ef1736b22ce59607eebsewardj{ 2028b727b54c51af958caadd4ef1736b22ce59607eebsewardj OrigFn fn; 2029b727b54c51af958caadd4ef1736b22ce59607eebsewardj int err, sz; 2030b727b54c51af958caadd4ef1736b22ce59607eebsewardj VALGRIND_GET_ORIG_FN(fn); 2031b727b54c51af958caadd4ef1736b22ce59607eebsewardj before("Alltoall"); 2032b727b54c51af958caadd4ef1736b22ce59607eebsewardj sz = comm_size(comm); 2033dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_defined(sendbuf, sendcount * sz, sendtype); 2034dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable(recvbuf, recvcount * sz, recvtype); 2035dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 2036b727b54c51af958caadd4ef1736b22ce59607eebsewardj CALL_FN_W_7W(err, fn, sendbuf,sendcount,sendtype, 2037b727b54c51af958caadd4ef1736b22ce59607eebsewardj recvbuf,recvcount,recvtype, 2038b727b54c51af958caadd4ef1736b22ce59607eebsewardj comm); 2039dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 2040dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn make_mem_defined_if_addressable_if_success(err, recvbuf, recvcount * sz, recvtype); 2041b727b54c51af958caadd4ef1736b22ce59607eebsewardj after("Alltoall", err); 2042b727b54c51af958caadd4ef1736b22ce59607eebsewardj return err; 2043b727b54c51af958caadd4ef1736b22ce59607eebsewardj} 2044b727b54c51af958caadd4ef1736b22ce59607eebsewardj 2045b727b54c51af958caadd4ef1736b22ce59607eebsewardj 2046b727b54c51af958caadd4ef1736b22ce59607eebsewardj/*------------------------------------------------------------*/ 2047b727b54c51af958caadd4ef1736b22ce59607eebsewardj/*--- ---*/ 2048c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Sec 4.9, Global Reduction Operations ---*/ 2049c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- ---*/ 2050c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 2051c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 2052c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Reduce --- */ 2053c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* rd: (sendbuf,count,datatype) for all 2054c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj wr: (recvbuf,count,datatype) but only for rank == root 2055c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj*/ 2056c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Reduce)(void *sendbuf, void *recvbuf, 2057c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int count, 2058c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj MPI_Datatype datatype, MPI_Op op, 2059c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int root, MPI_Comm comm) 2060c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 2061c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj OrigFn fn; 2062c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int err; 2063c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj Bool i_am_root; 2064c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj VALGRIND_GET_ORIG_FN(fn); 2065c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj before("Reduce"); 2066c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj i_am_root = root == comm_rank(comm); 2067dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_defined(sendbuf, count, datatype); 2068c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (i_am_root) 2069dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable(recvbuf, count, datatype); 2070dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 2071c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj CALL_FN_W_7W(err, fn, sendbuf,recvbuf,count,datatype,op,root,comm); 2072dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 2073c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj if (i_am_root) 2074dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn make_mem_defined_if_addressable_if_success(err, recvbuf, count, datatype); 2075c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj after("Reduce", err); 2076c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj return err; 2077c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 2078c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 2079c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 2080c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Allreduce --- */ 2081c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* rd: (sendbuf,count,datatype) for all 2082c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj wr: (recvbuf,count,datatype) for all 2083c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj*/ 2084c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Allreduce)(void *sendbuf, void *recvbuf, 2085c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int count, 2086c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj MPI_Datatype datatype, MPI_Op op, 2087c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj MPI_Comm comm) 2088c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 2089c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj OrigFn fn; 2090c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int err; 2091c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj VALGRIND_GET_ORIG_FN(fn); 2092c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj before("Allreduce"); 2093dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_defined(sendbuf, count, datatype); 2094dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable(recvbuf, count, datatype); 2095dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 2096c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj CALL_FN_W_6W(err, fn, sendbuf,recvbuf,count,datatype,op,comm); 2097dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 2098dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn make_mem_defined_if_addressable_if_success(err, recvbuf, count, datatype); 2099c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj after("Allreduce", err); 2100c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj return err; 2101c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 2102c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 2103c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 2104c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Op_create --- */ 2105c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* This is a bit dubious. I suppose it takes 'function' and 2106c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj writes something at *op, but who knows what an MPI_Op is? 2107c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj Can we safely do 'sizeof' on it? */ 2108c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Op_create)( MPI_User_function* function, 2109c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int commute, 2110c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj MPI_Op* op ) 2111c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 2112c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj OrigFn fn; 2113c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int err; 2114c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj VALGRIND_GET_ORIG_FN(fn); 2115c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj before("Op_create"); 2116dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable_untyped(op, sizeof(*op)); 2117dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 2118c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj CALL_FN_W_WWW(err, fn, function,commute,op); 2119dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 2120dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn make_mem_defined_if_addressable_if_success_untyped(err, op, sizeof(*op)); 2121c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj after("Op_create", err); 2122c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj return err; 2123c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 2124c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 2125c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 2126c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 2127c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- ---*/ 2128c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Sec 5.4, Communicator management ---*/ 2129c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- ---*/ 2130c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 2131c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 2132c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* Hardly seems worth wrapping Comm_rank and Comm_size, but 2133c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj since it's done now .. */ 2134c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 21359c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* --- Comm_create --- */ 21369c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* Let normal memcheck tracking handle this. */ 21379c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Comm_create)(MPI_Comm comm, MPI_Group group, 21389c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj MPI_Comm* newcomm) 21399c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj{ 21409c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj OrigFn fn; 21419c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj int err; 21429c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj VALGRIND_GET_ORIG_FN(fn); 21439c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj before("Comm_create"); 2144dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 21459c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj CALL_FN_W_WWW(err, fn, comm,group,newcomm); 2146dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 21479c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj after("Comm_create", err); 21489c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj return err; 21499c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj} 21509c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj 21519c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* --- Comm_dup --- */ 21529c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* Let normal memcheck tracking handle this. */ 21539c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Comm_dup)(MPI_Comm comm, MPI_Comm* newcomm) 21549c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj{ 21559c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj OrigFn fn; 21569c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj int err; 21579c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj VALGRIND_GET_ORIG_FN(fn); 21589c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj before("Comm_dup"); 2159dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 21609c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj CALL_FN_W_WW(err, fn, comm,newcomm); 2161dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 21629c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj after("Comm_dup", err); 21639c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj return err; 21649c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj} 21659c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj 21669c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* --- Comm_free --- */ 21679c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* Let normal memcheck tracking handle this. */ 21689c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Comm_free)(MPI_Comm* comm) 21699c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj{ 21709c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj OrigFn fn; 21719c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj int err; 21729c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj VALGRIND_GET_ORIG_FN(fn); 21739c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj before("Comm_free"); 2174dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 21759c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj CALL_FN_W_W(err, fn, comm); 2176dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 21779c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj after("Comm_free", err); 21789c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj return err; 21799c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj} 21809c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj 2181c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Comm_rank --- */ 2182c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* wr: (rank, sizeof(*rank)) */ 2183c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Comm_rank)(MPI_Comm comm, int *rank) 2184c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 2185c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj OrigFn fn; 2186c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int err; 2187c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj VALGRIND_GET_ORIG_FN(fn); 2188c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj before("Comm_rank"); 2189dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable_untyped(rank, sizeof(*rank)); 2190dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 2191c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj CALL_FN_W_WW(err, fn, comm,rank); 2192dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 2193dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn make_mem_defined_if_addressable_if_success_untyped(err, rank, sizeof(*rank)); 2194c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj after("Comm_rank", err); 2195c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj return err; 2196c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 2197c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 2198c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Comm_size --- */ 2199c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* wr: (size, sizeof(*size)) */ 2200c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Comm_size)(MPI_Comm comm, int *size) 2201c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 2202c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj OrigFn fn; 2203c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int err; 2204c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj VALGRIND_GET_ORIG_FN(fn); 2205c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj before("Comm_size"); 2206dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable_untyped(size, sizeof(*size)); 2207dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 2208c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj CALL_FN_W_WW(err, fn, comm,size); 2209dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 2210dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn make_mem_defined_if_addressable_if_success_untyped(err, size, sizeof(*size)); 2211c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj after("Comm_size", err); 2212c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj return err; 2213c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 2214c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 2215c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 2216c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 2217c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- ---*/ 2218c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Sec 5.7, Caching ---*/ 2219c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- ---*/ 2220c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 2221c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 2222c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 2223c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 2224c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- ---*/ 22257d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj/*--- Sec 7.3, Error codes and classes ---*/ 22267d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj/*--- ---*/ 22277d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj/*------------------------------------------------------------*/ 22287d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj 22297d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj/* --- Error_string --- */ 22309c969c39e657ca1c67ab90cbda5744e1ec33d975sewardjint WRAPPER_FOR(PMPI_Error_string)( int errorcode, char* string, 22319c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj int* resultlen ) 22327d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj{ 22337d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj OrigFn fn; 22347d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj int err; 22357d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj VALGRIND_GET_ORIG_FN(fn); 22367d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj before("Error_string"); 2237dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable_untyped(resultlen, sizeof(int)); 2238dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable_untyped(string, MPI_MAX_ERROR_STRING); 2239dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 22407d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj CALL_FN_W_WWW(err, fn, errorcode,string,resultlen); 2241dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 22427d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj /* Don't bother to paint the result; we assume the real function 22437d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj will have filled it with defined characters :-) */ 22447d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj after("Error_string", err); 22457d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj return err; 22467d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj} 22477d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj 22487d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj 22497d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj/*------------------------------------------------------------*/ 22507d3f4bb37f10850607c6a4a8cd62e0ee46d9c7f5sewardj/*--- ---*/ 2251c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- Sec 7.5, Startup ---*/ 2252c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- ---*/ 2253c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 2254c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 2255c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Init --- */ 2256c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* rd: *argc, *argv[0 .. *argc-1] */ 2257d465d99e1db7ab81b09446a7b47688ef14c4f124sewardjlong WRAPPER_FOR(PMPI_Init)(int *argc, char ***argv) 2258c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 2259c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj OrigFn fn; 2260c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int err; 2261c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj VALGRIND_GET_ORIG_FN(fn); 2262c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj before("Init"); 22631ba0e9bb7676fb5f7c2d79a266bf80992f512b0dsewardj if (argc) { 22641ba0e9bb7676fb5f7c2d79a266bf80992f512b0dsewardj check_mem_is_defined_untyped(argc, sizeof(int)); 22651ba0e9bb7676fb5f7c2d79a266bf80992f512b0dsewardj } 22661ba0e9bb7676fb5f7c2d79a266bf80992f512b0dsewardj if (argc && argv) { 22671ba0e9bb7676fb5f7c2d79a266bf80992f512b0dsewardj check_mem_is_defined_untyped(*argv, *argc * sizeof(char**)); 22681ba0e9bb7676fb5f7c2d79a266bf80992f512b0dsewardj } 2269dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 2270c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj CALL_FN_W_WW(err, fn, argc,argv); 2271dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 2272c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj after("Init", err); 2273d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj if (opt_initkludge) 2274d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj return (long)(void*)&mpiwrap_walk_type_EXTERNALLY_VISIBLE; 2275d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj else 2276d465d99e1db7ab81b09446a7b47688ef14c4f124sewardj return (long)err; 2277c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 2278c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 2279c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Initialized --- */ 2280c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Initialized)(int* flag) 2281c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 2282c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj OrigFn fn; 2283c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int err; 2284c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj VALGRIND_GET_ORIG_FN(fn); 2285c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj before("Initialized"); 2286dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn check_mem_is_addressable_untyped(flag, sizeof(int)); 2287dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 2288c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj CALL_FN_W_W(err, fn, flag); 2289dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 2290dbf7ca71128c6787ba8a99cbd03c3773ff572d96njn make_mem_defined_if_addressable_if_success_untyped(err, flag, sizeof(int)); 2291c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj after("Initialized", err); 2292c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj return err; 2293c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 2294c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 2295c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/* --- Finalize --- */ 2296c3a470981dbfd054c68a4192efe3cd756edb93d7sewardjint WRAPPER_FOR(PMPI_Finalize)(void) 2297c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj{ 2298c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj OrigFn fn; 2299c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj int err; 2300c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj VALGRIND_GET_ORIG_FN(fn); 2301c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj before("Finalize"); 2302dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; 2303c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj CALL_FN_W_v(err, fn); 2304dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; 2305c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj after("Finalize", err); 2306c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj return err; 2307c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj} 2308c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 2309c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 2310c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 2311c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- ---*/ 231263daa8afee0bf09c5527975d14f884d98ee77f9esewardj/*--- Default wrappers for all remaining functions ---*/ 2313c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- ---*/ 2314c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*------------------------------------------------------------*/ 2315c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 23169c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* Boilerplate for default wrappers. */ 231763daa8afee0bf09c5527975d14f884d98ee77f9esewardj#define DEFAULT_WRAPPER_PREAMBLE(basename) \ 231863daa8afee0bf09c5527975d14f884d98ee77f9esewardj OrigFn fn; \ 231963daa8afee0bf09c5527975d14f884d98ee77f9esewardj UWord res; \ 23200d17f240576b3a42d203259391c0822385a22273sewardj static int complaints = 1; \ 232163daa8afee0bf09c5527975d14f884d98ee77f9esewardj VALGRIND_GET_ORIG_FN(fn); \ 232263daa8afee0bf09c5527975d14f884d98ee77f9esewardj before(#basename); \ 232363daa8afee0bf09c5527975d14f884d98ee77f9esewardj if (opt_missing >= 2) { \ 232463daa8afee0bf09c5527975d14f884d98ee77f9esewardj barf("no wrapper for PMPI_" #basename \ 232563daa8afee0bf09c5527975d14f884d98ee77f9esewardj ",\n\t\t\t and you have " \ 232663daa8afee0bf09c5527975d14f884d98ee77f9esewardj "requested strict checking"); \ 232763daa8afee0bf09c5527975d14f884d98ee77f9esewardj } \ 232863daa8afee0bf09c5527975d14f884d98ee77f9esewardj if (opt_missing == 1 && complaints > 0) { \ 232963daa8afee0bf09c5527975d14f884d98ee77f9esewardj fprintf(stderr, "%s %5d: warning: no wrapper " \ 233063daa8afee0bf09c5527975d14f884d98ee77f9esewardj "for PMPI_" #basename "\n", \ 233163daa8afee0bf09c5527975d14f884d98ee77f9esewardj preamble, my_pid); \ 233263daa8afee0bf09c5527975d14f884d98ee77f9esewardj complaints--; \ 233363daa8afee0bf09c5527975d14f884d98ee77f9esewardj } \ 233463daa8afee0bf09c5527975d14f884d98ee77f9esewardj 233563daa8afee0bf09c5527975d14f884d98ee77f9esewardj#define DEFAULT_WRAPPER_W_0W(basename) \ 233663daa8afee0bf09c5527975d14f884d98ee77f9esewardj UWord WRAPPER_FOR(PMPI_##basename)( void ) \ 233763daa8afee0bf09c5527975d14f884d98ee77f9esewardj { \ 233863daa8afee0bf09c5527975d14f884d98ee77f9esewardj DEFAULT_WRAPPER_PREAMBLE(basename) \ 2339dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; \ 234063daa8afee0bf09c5527975d14f884d98ee77f9esewardj CALL_FN_W_v(res, fn); \ 2341dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; \ 234263daa8afee0bf09c5527975d14f884d98ee77f9esewardj return res; \ 234363daa8afee0bf09c5527975d14f884d98ee77f9esewardj } 2344c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 234563daa8afee0bf09c5527975d14f884d98ee77f9esewardj#define DEFAULT_WRAPPER_W_1W(basename) \ 234663daa8afee0bf09c5527975d14f884d98ee77f9esewardj UWord WRAPPER_FOR(PMPI_##basename)( UWord a1 ) \ 234763daa8afee0bf09c5527975d14f884d98ee77f9esewardj { \ 234863daa8afee0bf09c5527975d14f884d98ee77f9esewardj DEFAULT_WRAPPER_PREAMBLE(basename) \ 2349dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; \ 235063daa8afee0bf09c5527975d14f884d98ee77f9esewardj CALL_FN_W_W(res, fn, a1); \ 2351dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; \ 235263daa8afee0bf09c5527975d14f884d98ee77f9esewardj return res; \ 235363daa8afee0bf09c5527975d14f884d98ee77f9esewardj } 2354c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 235563daa8afee0bf09c5527975d14f884d98ee77f9esewardj#define DEFAULT_WRAPPER_W_2W(basename) \ 235663daa8afee0bf09c5527975d14f884d98ee77f9esewardj UWord WRAPPER_FOR(PMPI_##basename)( UWord a1, UWord a2 ) \ 235763daa8afee0bf09c5527975d14f884d98ee77f9esewardj { \ 235863daa8afee0bf09c5527975d14f884d98ee77f9esewardj DEFAULT_WRAPPER_PREAMBLE(basename) \ 2359dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; \ 236063daa8afee0bf09c5527975d14f884d98ee77f9esewardj CALL_FN_W_WW(res, fn, a1,a2); \ 2361dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; \ 236263daa8afee0bf09c5527975d14f884d98ee77f9esewardj return res; \ 236363daa8afee0bf09c5527975d14f884d98ee77f9esewardj } 2364c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 236563daa8afee0bf09c5527975d14f884d98ee77f9esewardj#define DEFAULT_WRAPPER_W_3W(basename) \ 236663daa8afee0bf09c5527975d14f884d98ee77f9esewardj UWord WRAPPER_FOR(PMPI_##basename) \ 236763daa8afee0bf09c5527975d14f884d98ee77f9esewardj ( UWord a1, UWord a2, UWord a3 ) \ 236863daa8afee0bf09c5527975d14f884d98ee77f9esewardj { \ 236963daa8afee0bf09c5527975d14f884d98ee77f9esewardj DEFAULT_WRAPPER_PREAMBLE(basename) \ 2370dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; \ 237163daa8afee0bf09c5527975d14f884d98ee77f9esewardj CALL_FN_W_WWW(res, fn, a1,a2,a3); \ 2372dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; \ 237363daa8afee0bf09c5527975d14f884d98ee77f9esewardj return res; \ 237463daa8afee0bf09c5527975d14f884d98ee77f9esewardj } 2375c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 237663daa8afee0bf09c5527975d14f884d98ee77f9esewardj#define DEFAULT_WRAPPER_W_4W(basename) \ 237763daa8afee0bf09c5527975d14f884d98ee77f9esewardj UWord WRAPPER_FOR(PMPI_##basename) \ 237863daa8afee0bf09c5527975d14f884d98ee77f9esewardj ( UWord a1, UWord a2, UWord a3, UWord a4 ) \ 237963daa8afee0bf09c5527975d14f884d98ee77f9esewardj { \ 238063daa8afee0bf09c5527975d14f884d98ee77f9esewardj DEFAULT_WRAPPER_PREAMBLE(basename) \ 2381dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; \ 238263daa8afee0bf09c5527975d14f884d98ee77f9esewardj CALL_FN_W_WWWW(res, fn, a1,a2,a3,a4); \ 2383dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; \ 238463daa8afee0bf09c5527975d14f884d98ee77f9esewardj return res; \ 238563daa8afee0bf09c5527975d14f884d98ee77f9esewardj } 2386c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 238763daa8afee0bf09c5527975d14f884d98ee77f9esewardj#define DEFAULT_WRAPPER_W_5W(basename) \ 238863daa8afee0bf09c5527975d14f884d98ee77f9esewardj UWord WRAPPER_FOR(PMPI_##basename) \ 238963daa8afee0bf09c5527975d14f884d98ee77f9esewardj ( UWord a1, UWord a2, UWord a3, UWord a4, UWord a5 ) \ 239063daa8afee0bf09c5527975d14f884d98ee77f9esewardj { \ 239163daa8afee0bf09c5527975d14f884d98ee77f9esewardj DEFAULT_WRAPPER_PREAMBLE(basename) \ 2392dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; \ 239363daa8afee0bf09c5527975d14f884d98ee77f9esewardj CALL_FN_W_5W(res, fn, a1,a2,a3,a4,a5); \ 2394dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; \ 239563daa8afee0bf09c5527975d14f884d98ee77f9esewardj return res; \ 239663daa8afee0bf09c5527975d14f884d98ee77f9esewardj } 2397c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 239863daa8afee0bf09c5527975d14f884d98ee77f9esewardj#define DEFAULT_WRAPPER_W_6W(basename) \ 239963daa8afee0bf09c5527975d14f884d98ee77f9esewardj UWord WRAPPER_FOR(PMPI_##basename) \ 240063daa8afee0bf09c5527975d14f884d98ee77f9esewardj ( UWord a1, UWord a2, UWord a3, UWord a4, UWord a5, \ 240163daa8afee0bf09c5527975d14f884d98ee77f9esewardj UWord a6 ) \ 240263daa8afee0bf09c5527975d14f884d98ee77f9esewardj { \ 240363daa8afee0bf09c5527975d14f884d98ee77f9esewardj DEFAULT_WRAPPER_PREAMBLE(basename) \ 2404dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; \ 240563daa8afee0bf09c5527975d14f884d98ee77f9esewardj CALL_FN_W_6W(res, fn, a1,a2,a3,a4,a5,a6); \ 2406dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; \ 240763daa8afee0bf09c5527975d14f884d98ee77f9esewardj return res; \ 240863daa8afee0bf09c5527975d14f884d98ee77f9esewardj } 2409c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 241063daa8afee0bf09c5527975d14f884d98ee77f9esewardj#define DEFAULT_WRAPPER_W_7W(basename) \ 241163daa8afee0bf09c5527975d14f884d98ee77f9esewardj UWord WRAPPER_FOR(PMPI_##basename) \ 241263daa8afee0bf09c5527975d14f884d98ee77f9esewardj ( UWord a1, UWord a2, UWord a3, UWord a4, UWord a5, \ 241363daa8afee0bf09c5527975d14f884d98ee77f9esewardj UWord a6, UWord a7 ) \ 241463daa8afee0bf09c5527975d14f884d98ee77f9esewardj { \ 241563daa8afee0bf09c5527975d14f884d98ee77f9esewardj DEFAULT_WRAPPER_PREAMBLE(basename) \ 2416dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; \ 241763daa8afee0bf09c5527975d14f884d98ee77f9esewardj CALL_FN_W_7W(res, fn, a1,a2,a3,a4,a5,a6,a7); \ 2418dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; \ 241963daa8afee0bf09c5527975d14f884d98ee77f9esewardj return res; \ 242063daa8afee0bf09c5527975d14f884d98ee77f9esewardj } 2421c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 242263daa8afee0bf09c5527975d14f884d98ee77f9esewardj#define DEFAULT_WRAPPER_W_8W(basename) \ 242363daa8afee0bf09c5527975d14f884d98ee77f9esewardj UWord WRAPPER_FOR(PMPI_##basename) \ 242463daa8afee0bf09c5527975d14f884d98ee77f9esewardj ( UWord a1, UWord a2, UWord a3, UWord a4, UWord a5, \ 242563daa8afee0bf09c5527975d14f884d98ee77f9esewardj UWord a6, UWord a7, UWord a8 ) \ 242663daa8afee0bf09c5527975d14f884d98ee77f9esewardj { \ 242763daa8afee0bf09c5527975d14f884d98ee77f9esewardj DEFAULT_WRAPPER_PREAMBLE(basename) \ 2428dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; \ 242963daa8afee0bf09c5527975d14f884d98ee77f9esewardj CALL_FN_W_8W(res, fn, a1,a2,a3,a4,a5,a6,a7,a8); \ 2430dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; \ 243163daa8afee0bf09c5527975d14f884d98ee77f9esewardj return res; \ 243263daa8afee0bf09c5527975d14f884d98ee77f9esewardj } 2433c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 243463daa8afee0bf09c5527975d14f884d98ee77f9esewardj#define DEFAULT_WRAPPER_W_9W(basename) \ 243563daa8afee0bf09c5527975d14f884d98ee77f9esewardj UWord WRAPPER_FOR(PMPI_##basename) \ 243663daa8afee0bf09c5527975d14f884d98ee77f9esewardj ( UWord a1, UWord a2, UWord a3, UWord a4, UWord a5, \ 243763daa8afee0bf09c5527975d14f884d98ee77f9esewardj UWord a6, UWord a7, UWord a8, UWord a9 ) \ 243863daa8afee0bf09c5527975d14f884d98ee77f9esewardj { \ 243963daa8afee0bf09c5527975d14f884d98ee77f9esewardj DEFAULT_WRAPPER_PREAMBLE(basename) \ 2440dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; \ 244163daa8afee0bf09c5527975d14f884d98ee77f9esewardj CALL_FN_W_9W(res, fn, a1,a2,a3,a4,a5,a6,a7,a8,a9); \ 2442dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; \ 244363daa8afee0bf09c5527975d14f884d98ee77f9esewardj return res; \ 244463daa8afee0bf09c5527975d14f884d98ee77f9esewardj } 2445c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 244663daa8afee0bf09c5527975d14f884d98ee77f9esewardj#define DEFAULT_WRAPPER_W_10W(basename) \ 244763daa8afee0bf09c5527975d14f884d98ee77f9esewardj UWord WRAPPER_FOR(PMPI_##basename) \ 244863daa8afee0bf09c5527975d14f884d98ee77f9esewardj ( UWord a1, UWord a2, UWord a3, UWord a4, UWord a5, \ 244963daa8afee0bf09c5527975d14f884d98ee77f9esewardj UWord a6, UWord a7, UWord a8, UWord a9, UWord a10 ) \ 245063daa8afee0bf09c5527975d14f884d98ee77f9esewardj { \ 245163daa8afee0bf09c5527975d14f884d98ee77f9esewardj DEFAULT_WRAPPER_PREAMBLE(basename) \ 2452dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; \ 245363daa8afee0bf09c5527975d14f884d98ee77f9esewardj CALL_FN_W_10W(res, fn, a1,a2,a3,a4,a5,a6,a7,a8,a9,a10); \ 2454dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; \ 245563daa8afee0bf09c5527975d14f884d98ee77f9esewardj return res; \ 245663daa8afee0bf09c5527975d14f884d98ee77f9esewardj } 2457c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 245863daa8afee0bf09c5527975d14f884d98ee77f9esewardj#define DEFAULT_WRAPPER_W_12W(basename) \ 245963daa8afee0bf09c5527975d14f884d98ee77f9esewardj UWord WRAPPER_FOR(PMPI_##basename) \ 246063daa8afee0bf09c5527975d14f884d98ee77f9esewardj ( UWord a1, UWord a2, UWord a3, UWord a4, UWord a5, \ 246163daa8afee0bf09c5527975d14f884d98ee77f9esewardj UWord a6, UWord a7, UWord a8, UWord a9, UWord a10, \ 246263daa8afee0bf09c5527975d14f884d98ee77f9esewardj UWord a11, UWord a12 ) \ 246363daa8afee0bf09c5527975d14f884d98ee77f9esewardj { \ 246463daa8afee0bf09c5527975d14f884d98ee77f9esewardj DEFAULT_WRAPPER_PREAMBLE(basename) \ 2465dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_DISABLE_ERROR_REPORTING; \ 246663daa8afee0bf09c5527975d14f884d98ee77f9esewardj CALL_FN_W_12W(res, fn, a1,a2,a3,a4,a5,a6, \ 246763daa8afee0bf09c5527975d14f884d98ee77f9esewardj a7,a8,a9,a10,a11,a12); \ 2468dc873c08cc51930ecd35a976c1d03285f9a53b94sewardj if (cONFIG_DER) VALGRIND_ENABLE_ERROR_REPORTING; \ 246963daa8afee0bf09c5527975d14f884d98ee77f9esewardj return res; \ 247063daa8afee0bf09c5527975d14f884d98ee77f9esewardj } 2471c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 2472c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 247363daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* Canned summary of MPI-1.1/MPI-2 entry points, as derived from mpi.h 247463daa8afee0bf09c5527975d14f884d98ee77f9esewardj from Open MPI svn rev 9191 (somewhere between Open MPI versions 247563daa8afee0bf09c5527975d14f884d98ee77f9esewardj 1.0.1 and 1.1.0). */ 247663daa8afee0bf09c5527975d14f884d98ee77f9esewardj 247763daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* If a function is commented out in this list, it's because it has a 247863daa8afee0bf09c5527975d14f884d98ee77f9esewardj proper wrapper written elsewhere (above here). */ 247963daa8afee0bf09c5527975d14f884d98ee77f9esewardj 248063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Abort) 248163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_9W(Accumulate) 248263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Add_error_class) 248363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Add_error_code) 248463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Add_error_string) 24859c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_2W(Address) */ 248663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_7W(Allgather) 248763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_8W(Allgatherv) 248863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Alloc_mem) 248963daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_6W(Allreduce) */ 2490b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* DEFAULT_WRAPPER_W_7W(Alltoall) */ 249163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_9W(Alltoallv) 249263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_9W(Alltoallw) 249363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Attr_delete) 249463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Attr_get) 249563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Attr_put) 249663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Barrier) 249763daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_5W(Bcast) */ 24989c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_6W(Bsend) */ 249963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_7W(Bsend_init) 250063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Buffer_attach) 250163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Buffer_detach) 2502b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* DEFAULT_WRAPPER_W_1W(Cancel) */ 250363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Cart_coords) 250463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(Cart_create) 250563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Cart_get) 250663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Cart_map) 250763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Cart_rank) 250863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Cart_shift) 250963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Cart_sub) 251063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Cartdim_get) 251163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Close_port) 251263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Comm_accept) 251363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Comm_c2f) 251463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Comm_call_errhandler) 251563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Comm_compare) 251663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Comm_connect) 251763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Comm_create_errhandler) 251863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Comm_create_keyval) 25199c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_3W(Comm_create) */ 252063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Comm_delete_attr) 252163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Comm_disconnect) 25229c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_2W(Comm_dup) */ 252363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Comm_f2c) 252463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Comm_free_keyval) 25259c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_1W(Comm_free) */ 252663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Comm_get_attr) 252763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Comm_get_errhandler) 252863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Comm_get_name) 252963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Comm_get_parent) 253063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Comm_group) 253163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Comm_join) 253263daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_2W(Comm_rank) */ 253363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Comm_remote_group) 253463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Comm_remote_size) 253563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Comm_set_attr) 253663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Comm_set_errhandler) 253763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Comm_set_name) 253863daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_2W(Comm_size) */ 253963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_8W(Comm_spawn) 254063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_9W(Comm_spawn_multiple) 254163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Comm_split) 254263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Comm_test_inter) 254363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Dims_create) 254463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Errhandler_c2f) 254563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Errhandler_create) 254663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Errhandler_f2c) 254763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Errhandler_free) 254863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Errhandler_get) 254963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Errhandler_set) 255063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Error_class) 255163daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_3W(Error_string) */ 255263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(Exscan) 255363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(File_c2f) 255463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(File_f2c) 255563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_call_errhandler) 255663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_create_errhandler) 255763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_set_errhandler) 255863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_get_errhandler) 255963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_open) 256063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(File_close) 256163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_delete) 256263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_set_size) 256363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_preallocate) 256463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_get_size) 256563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_get_group) 256663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_get_amode) 256763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_set_info) 256863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_get_info) 256963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(File_set_view) 257063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_get_view) 257163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(File_read_at) 257263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(File_read_at_all) 257363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(File_write_at) 257463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(File_write_at_all) 257563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(File_iread_at) 257663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(File_iwrite_at) 257763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_read) 257863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_read_all) 257963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_write) 258063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_write_all) 258163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_iread) 258263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_iwrite) 258363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(File_seek) 258463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_get_position) 258563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(File_get_byte_offset) 258663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_read_shared) 258763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_write_shared) 258863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_iread_shared) 258963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_iwrite_shared) 259063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_read_ordered) 259163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_write_ordered) 259263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(File_seek_shared) 259363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_get_position_shared) 259463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_read_at_all_begin) 259563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(File_read_at_all_end) 259663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(File_write_at_all_begin) 259763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(File_write_at_all_end) 259863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(File_read_all_begin) 259963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(File_read_all_end) 260063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(File_write_all_begin) 260163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(File_write_all_end) 260263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(File_read_ordered_begin) 260363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(File_read_ordered_end) 260463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(File_write_ordered_begin) 260563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(File_write_ordered_end) 260663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(File_get_type_extent) 260763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_set_atomicity) 260863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(File_get_atomicity) 260963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(File_sync) 261063daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_0W(Finalize) */ 261163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Finalized) 261263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Free_mem) 261363daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_8W(Gather) */ 261463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_9W(Gatherv) 261563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Get_address) 26169c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_3W(Get_count) */ 261763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Get_elements) 261863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_8W(Get) 261963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Get_processor_name) 262063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Get_version) 262163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(Graph_create) 262263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Graph_get) 262363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Graph_map) 262463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Graph_neighbors_count) 262563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Graph_neighbors) 262663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Graphdims_get) 262763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Grequest_complete) 262863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Grequest_start) 262963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Group_c2f) 263063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Group_compare) 263163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Group_difference) 263263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Group_excl) 263363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Group_f2c) 263463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Group_free) 263563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Group_incl) 263663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Group_intersection) 263763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Group_range_excl) 263863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Group_range_incl) 263963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Group_rank) 264063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Group_size) 264163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Group_translate_ranks) 264263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Group_union) 26439c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_7W(Ibsend) */ 264463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Info_c2f) 264563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Info_create) 264663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Info_delete) 264763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Info_dup) 264863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Info_f2c) 264963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Info_free) 265063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Info_get) 265163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Info_get_nkeys) 265263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Info_get_nthkey) 265363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Info_get_valuelen) 265463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Info_set) 265563daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_2W(Init) */ 265663daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_1W(Initialized) */ 265763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Init_thread) 265863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(Intercomm_create) 265963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Intercomm_merge) 266063daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_5W(Iprobe) */ 266163daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_7W(Irecv) */ 26629c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_7W(Irsend) */ 266363daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_7W(Isend) */ 26649c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_7W(Issend) */ 266563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Is_thread_main) 266663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Keyval_create) 266763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Keyval_free) 266863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Lookup_name) 266963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Op_c2f) 267063daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_3W(Op_create) */ 267163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Open_port) 267263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Op_f2c) 267363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Op_free) 267463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_7W(Pack_external) 267563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Pack_external_size) 2676ee3465927d146e6b632dc550e1f6f41867bb5321sewardj/* DEFAULT_WRAPPER_W_7W(Pack) */ 267763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Pack_size) 267863daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* int MPI_Pcontrol(const int level, ...) */ 2679b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* DEFAULT_WRAPPER_W_4W(Probe) */ 268063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Publish_name) 268163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_8W(Put) 268263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Query_thread) 268363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_7W(Recv_init) 268463daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_7W(Recv) */ 268563daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_7W(Reduce) */ 268663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(Reduce_scatter) 268763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Register_datarep) 268863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Request_c2f) 268963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Request_f2c) 269063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Request_free) 269163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Request_get_status) 26929c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_6W(Rsend) */ 269363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_7W(Rsend_init) 269463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(Scan) 2695b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* DEFAULT_WRAPPER_W_8W(Scatter) */ 269663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_9W(Scatterv) 269763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_7W(Send_init) 269863daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_6W(Send) */ 269963daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_12W(Sendrecv) */ 270063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_9W(Sendrecv_replace) 270163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_7W(Ssend_init) 27029c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_6W(Ssend) */ 270363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Start) 270463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Startall) 270563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Status_c2f) 270663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Status_f2c) 270763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Status_set_cancelled) 270863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Status_set_elements) 2709b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* DEFAULT_WRAPPER_W_4W(Testall) */ 271063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Testany) 2711b727b54c51af958caadd4ef1736b22ce59607eebsewardj/* DEFAULT_WRAPPER_W_3W(Test) */ 271263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Test_cancelled) 271363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Testsome) 271463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Topo_test) 271563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Type_c2f) 27169c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_1W(Type_commit) */ 271763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Type_contiguous) 271863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_10W(Type_create_darray) 271963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Type_create_f90_complex) 272063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Type_create_f90_integer) 272163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Type_create_f90_real) 272263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Type_create_hindexed) 272363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Type_create_hvector) 272463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Type_create_keyval) 272563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Type_create_indexed_block) 272663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Type_create_struct) 272763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_7W(Type_create_subarray) 272863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Type_create_resized) 272963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Type_delete_attr) 273063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Type_dup) 27319c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_2W(Type_extent) */ 27329c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_1W(Type_free) */ 273363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Type_free_keyval) 273463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Type_f2c) 273563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Type_get_attr) 27369c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_7W(Type_get_contents) */ 27379c969c39e657ca1c67ab90cbda5744e1ec33d975sewardj/* DEFAULT_WRAPPER_W_5W(Type_get_envelope) */ 273863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Type_get_extent) 273963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Type_get_name) 274063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Type_get_true_extent) 274163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Type_hindexed) 274263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Type_hvector) 274363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Type_indexed) 274463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Type_lb) 274563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Type_match_size) 274663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Type_set_attr) 274763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Type_set_name) 274863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Type_size) 274963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Type_struct) 275063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Type_ub) 275163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Type_vector) 2752ee3465927d146e6b632dc550e1f6f41867bb5321sewardj/* DEFAULT_WRAPPER_W_7W(Unpack) */ 275363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Unpublish_name) 275463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_7W(Unpack_external) 275563daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_3W(Waitall) */ 2756982751b29b4fe1623a8ce3504004b567f27a2b5csewardj/* DEFAULT_WRAPPER_W_4W(Waitany) */ 275763daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* DEFAULT_WRAPPER_W_2W(Wait) */ 275863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_5W(Waitsome) 275963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Win_c2f) 276063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Win_call_errhandler) 276163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Win_complete) 276263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_6W(Win_create) 276363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Win_create_errhandler) 276463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Win_create_keyval) 276563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Win_delete_attr) 276663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Win_f2c) 276763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Win_fence) 276863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Win_free) 276963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Win_free_keyval) 277063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Win_get_attr) 277163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Win_get_errhandler) 277263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Win_get_group) 277363daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Win_get_name) 277463daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_4W(Win_lock) 277563daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Win_post) 277663daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Win_set_attr) 277763daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Win_set_errhandler) 277863daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Win_set_name) 277963daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_3W(Win_start) 278063daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Win_test) 278163daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_2W(Win_unlock) 278263daa8afee0bf09c5527975d14f884d98ee77f9esewardjDEFAULT_WRAPPER_W_1W(Win_wait) 278363daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* double MPI_Wtick(void) */ 278463daa8afee0bf09c5527975d14f884d98ee77f9esewardj/* double MPI_Wtime(void) */ 2785c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 2786c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 278763daa8afee0bf09c5527975d14f884d98ee77f9esewardj/*------------------------------------------------------------*/ 278863daa8afee0bf09c5527975d14f884d98ee77f9esewardj/*--- ---*/ 278963daa8afee0bf09c5527975d14f884d98ee77f9esewardj/*--- ---*/ 279063daa8afee0bf09c5527975d14f884d98ee77f9esewardj/*--- ---*/ 279163daa8afee0bf09c5527975d14f884d98ee77f9esewardj/*------------------------------------------------------------*/ 2792c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj 2793c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---------------------------------------------------------------*/ 2794c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*--- end mpiwrap.c ---*/ 2795c3a470981dbfd054c68a4192efe3cd756edb93d7sewardj/*---------------------------------------------------------------*/ 2796