/*****************************************************************************/ /* */ /* 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 */ /* */ /*****************************************************************************/ #include #include #include #include #ifndef MIN #define MIN(x,y) ((x)<(y)?(x):(y)) #endif #define SIZE 9 #define FULLSIZE SIZE*THREADS #define _UPC_RED_T double #ifdef TEST_BLK_SIZE #define blk_size MIN(TEST_BLK_SIZE,UPC_MAX_BLOCK_SIZE) #else #define blk_size MIN(4,UPC_MAX_BLOCK_SIZE) #endif shared [blk_size] _UPC_RED_T A[FULLSIZE]; shared [blk_size] _UPC_RED_T B[FULLSIZE]; shared [blk_size] _UPC_RED_T PermA[FULLSIZE]; // #define blk_size (sizeof(A)/upc_elemsizeof(A)+THREADS-1)/THREADS _UPC_RED_T addneg( _UPC_RED_T i, _UPC_RED_T j) { if ( i > 0 ) if ( j > 0 ) return -i - j; else return -i + j; else if ( j > 0 ) return i - j; else return i + j; } int main(void) { int i, j, nelems; int offsetA, offsetB, offsetL; _UPC_RED_T sum; int failure; if ( MYTHREAD == 0 ) { // Throw away first random number. srand(42); PermA[0] = (_UPC_RED_T)(int)rand(); for(i=0; i FULLSIZE ) { offsetA = 0; ++nelems; } } // A loop if ( MYTHREAD == 0 ) { for (i=0; i