/*****************************************************************************/ /* */ /* Copyright (c) 2004, Michigan Technological University */ /* All rights reserved. */ /* */ /* Redistribution and use in source and binary forms, with or without */ /* modification, are permitted provided that the following conditions */ /* are met: */ /* */ /* * Redistributions of source code must retain the above copyright */ /* notice, this list of conditions and the following disclaimer. */ /* * Redistributions in binary form must reproduce the above */ /* copyright notice, this list of conditions and the following */ /* disclaimer in the documentation and/or other materials provided */ /* with the distribution. */ /* * Neither the name of the Michigan Technological University */ /* nor the names of its contributors may be used to endorse or promote */ /* products derived from this software without specific prior written */ /* permission. */ /* */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */ /* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A */ /* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER */ /* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, */ /* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, */ /* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR */ /* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF */ /* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */ /* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */ /* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* */ /*****************************************************************************/ /*****************************************************************************/ /* */ /* UPC collective function library, reference implementation */ /* */ /* Steve Seidel, Dept. of Computer Science, Michigan Technological Univ. */ /* steve@mtu.edu March 1, 2004 */ /* */ /*****************************************************************************/ /* upc_coll_err.c is included if _UPC_COLL_CHECK_ARGS is defined. This code checks for the single-valuedness of collective function arguments as well as checking that all threads have called the same function. Range checking of size_t arguments is done, and the perm array is checked to be a true permutation of 0..THREADS-1. However, (prefix) reduce functions of different types cannot be distinguished. Overlapping src and dst arguments are not detected. When each thread reaches its collective call it fills in corresponding entries of the coll_arg_list defined below. This list has affinity to thread 0. After a barrier, thread 0 does all the argument checking locally on this list. If no errors are found, all threads are released to continue execution after a final barrier. */ #include typedef struct { shared void *dst; shared const void *src; shared const int *perm; size_t nbytes; upc_flag_t sync_mode; size_t blk_size; size_t nelems; upc_op_t op; upc_flag_t upc_coll_op; } coll_arg_list_type; shared coll_arg_list_type *coll_arg_list; const char *func_name ( upc_flag_t upc_coll_op ) { switch ( upc_coll_op ) { case UPC_BRDCST: return "upc_all_broadcast"; break; case UPC_SCAT: return "upc_all_scatter"; break; case UPC_GATH: return "upc_all_gather"; break; case UPC_GATH_ALL: return "upc_all_gather_all"; break; case UPC_EXCH: return "upc_all_exchange"; break; case UPC_PERM: return "upc_all_permute"; break; case UPC_RED: return "upc_all_reduce"; break; case UPC_PRED: return "upc_all_prefix_reduce"; break; case UPC_SORT: return "upc_all_sort"; break; } return NULL; } void upc_chk_nbytes() { int i; for (i=1; i 10) { printf("%s: Illegal operation specified in thread %d.\n", func_name(coll_arg_list[i].upc_coll_op), i); upc_global_exit(1); } #endif } void upc_chk_sync_mode() { int i; // Check for nonsensical combinations of synchronization modes // and for meaningless values of sync_mode. for (i=0; i