00001 00002 // This file is part of SPart, Spatially Located Workload Partitioner. 00003 00004 // Copyright (C) 2011, The Ohio State University 00005 // SPart developed by Erdeniz O. Bas, Erik Saule and Umit V. Catalyurek 00006 00007 // For questions, comments, suggestions, bugs please send e-mail to: 00008 // Umit V. Catalyurek catalyurek.1@osu.edu 00009 00010 // SPart is free software; you can redistribute it and/or modify it under 00011 // the terms of the GNU General Public License as published by the Free 00012 // Software Foundation; either version 2 or (at your option) any later 00013 // version. 00014 00015 // SPart is distributed in the hope that it will be useful, but WITHOUT 00016 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 00017 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 00018 // for more details. 00019 00020 // You should have received a copy of the GNU General Public License 00021 // along with SPart; if not, write to the Free Software Foundation, Inc., 00022 // 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 00023 00024 // As a special exception, if other files instantiate templates or use 00025 // macros or inline functions from this file, or you compile this file 00026 // and link it with other works to produce a work based on this file, 00027 // this file does not by itself cause the resulting work to be covered by 00028 // the GNU General Public License. However the source code for this file 00029 // must still be made available in accordance with section (3) of the GNU 00030 // General Public License. 00031 00032 // This exception does not invalidate any other reasons why a work based 00033 // on this file might be covered by the GNU General Public License. 00034 00035 // The full text of the GPL license version 2 is available in "gpl.txt". 00036 00048 #ifndef __NICOL_2D_H__ 00049 #define __NICOL_2D_H__ 00050 00051 #include <util/prefix_sum_tools.hpp> 00052 #include <util/rect_list.hpp> 00053 #include <twod/part_base.hpp> 00054 00055 namespace twod 00056 { 00068 template <typename T, typename Pr, bool DEBUG = false> 00069 class RectNicol : public PartBase<T,Pr> 00070 { 00071 private: 00072 static T nicol_2d_internal(int procX, int procY, const Pr& prefixSumArray, util::RectList<T,Pr> &parts); 00073 static T fix_x_dimension(util::AggregMax2Dto1D<T,Pr,true>& array, int length, int procX, int *x_cuts); 00074 static T fix_y_dimension(util::AggregMax2Dto1D<T,Pr,false>& array, int length, int procY, int *y_cuts); 00075 00077 static void convertToRectList(int lengthX, int lengthY, int *x_cuts, int *y_cuts, int procX, int procY, util::RectList<T,Pr> &parts); 00078 00079 int P;//number of parts in the first dimension. if 0 automatic. 00080 public: 00081 RectNicol ():P(0){} 00082 00090 void setP(int P){this->P = P;} 00103 virtual T part(int procCount, const Pr& prefixSumArray, util::RectList<T,Pr> &parts); 00104 virtual ~RectNicol(){} 00105 }; 00106 00107 } 00108 #include <twod/nicol_2d_impl.hpp> 00109 00110 #endif 00111