/*****************************************************************************/ /* */ /* 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 */ /* */ /*****************************************************************************/ // Collectives exerciser // // This moves data through a sequence of collective operations and // verifies that they come out OK on the other side. All of the // basic forms of the collective functions are used at least once. #include #include #include #include #include #ifndef MIN #define MIN(x,y) ((x)<(y)?(x):(y)) #endif #define NELEMS ((int)MIN(17,UPC_MAX_BLOCK_SIZE)) #define TYPE int #define SYNC_MODE UPC_IN_ALLSYNC | UPC_OUT_ALLSYNC // shared [NELEMS] TYPE A[NELEMS]; shared [NELEMS] TYPE *A; shared [NELEMS] TYPE B[NELEMS*THREADS]; // shared [NELEMS*THREADS] TYPE C[THREADS][NELEMS*THREADS]; shared TYPE *Cdata; shared [] TYPE * shared C[THREADS]; // shared [NELEMS*THREADS] TYPE D[THREADS][NELEMS*THREADS]; shared TYPE *Ddata; shared [] TYPE * shared D[THREADS]; shared [NELEMS] TYPE E[NELEMS*THREADS]; shared [NELEMS] TYPE F[NELEMS*THREADS]; // rand_perm is used to generate a permutation of integers 0..THREADS-1. // Generate a sequence of random integers and label them with // consecutive indices. Sort the random integers and carry // the indices along to create a permutation of indices. // upc_all_sort() is used to sort the random integers. The // resulting permutation is used to test upc_all_perm(). typedef struct { int randm; int indx; }rand_perm; shared rand_perm scram[THREADS]; shared int perm[THREADS]; // Comparison function used in call to upc_all_sort(). int scram_comp( shared void *x, shared void *y ) { int x_val = (*((shared rand_perm *)x)).randm; int y_val = (*((shared rand_perm *)y)).randm; return x_val > y_val ? 1 : x_val < y_val ? -1 : 0; } int main(void) { int nbytes = sizeof(TYPE); int i, j, k, n; TYPE sum; A = upc_all_alloc(NELEMS, sizeof(TYPE)*NELEMS); // 1) Initialize A[i]=123321+i and B[i] = THREADS+i if ( MYTHREAD==0 ) for (i=0; i 0 ) if ( scram[MYTHREAD-1].randm > scram[MYTHREAD].randm ) printf("Thread %d: sort failure: %d > %d\n", MYTHREAD, scram[MYTHREAD-1].randm, scram[MYTHREAD].randm ); // 18) The scrambled indices are a permutation of 0..THREADS-1. if ( MYTHREAD == 0 ) for (i=0; i