1 //****************************************************************************** 2 // 3 // File: ParallelSection.java 4 // Package: edu.rit.pj 5 // Unit: Class edu.rit.pj.ParallelSection 6 // 7 // This Java source file is copyright (C) 2007 by Alan Kaminsky. All rights 8 // reserved. For further information, contact the author, Alan Kaminsky, at 9 // ark@cs.rit.edu. 10 // 11 // This Java source file is part of the Parallel Java Library ("PJ"). PJ is free 12 // software; you can redistribute it and/or modify it under the terms of the GNU 13 // General Public License as published by the Free Software Foundation; either 14 // version 3 of the License, or (at your option) any later version. 15 // 16 // PJ is distributed in the hope that it will be useful, but WITHOUT ANY 17 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR 18 // A PARTICULAR PURPOSE. See the GNU General Public License for more details. 19 // 20 // Linking this library statically or dynamically with other modules is making a 21 // combined work based on this library. Thus, the terms and conditions of the GNU 22 // General Public License cover the whole combination. 23 // 24 // As a special exception, the copyright holders of this library give you 25 // permission to link this library with independent modules to produce an 26 // executable, regardless of the license terms of these independent modules, and 27 // to copy and distribute the resulting executable under terms of your choice, 28 // provided that you also meet, for each linked independent module, the terms 29 // and conditions of the license of that module. An independent module is a module 30 // which is not derived from or based on this library. If you modify this library, 31 // you may extend this exception to your version of the library, but you are not 32 // obligated to do so. If you do not wish to do so, delete this exception 33 // statement from your version. 34 // 35 // A copy of the GNU General Public License is provided in the file gpl.txt. You 36 // may also obtain a copy of the GNU General Public License on the World Wide 37 // Web at http://www.gnu.org/licenses/gpl.html. 38 // 39 //****************************************************************************** 40 package edu.rit.pj; 41 42 /** 43 * Class ParallelSection is the abstract base class for a section of code to be 44 * executed in parallel. 45 * <P> 46 * A group of parallel sections may be executed concurrently by calling a 47 * {@linkplain ParallelRegion}'s <code>execute()</code> method. Each section in the 48 * group is executed by a different thread in the parallel thread team. Here is 49 * one way to code a parallel section group with two parallel sections: 50 * <PRE> 51 * new ParallelTeam(2).execute (new ParallelRegion() 52 * { 53 * public void run() throws Exception 54 * { 55 * execute 56 * (new ParallelSection() 57 * { 58 * public void run() 59 * { 60 * // Code for first concurrent parallel section 61 * . . . 62 * } 63 * }, 64 * new ParallelSection() 65 * { 66 * public void run() 67 * { 68 * // Code for second concurrent parallel section 69 * . . . 70 * } 71 * }); 72 * } 73 * }); 74 * </PRE> Here is another way to code a parallel section group with two parallel 75 * sections: 76 * <PRE> 77 * ParallelSection section_1 = new ParallelSection() 78 * { 79 * public void run() 80 * { 81 * // Code for first concurrent parallel section 82 * . . . 83 * } 84 * }; 85 * ParallelSection section_2 = new ParallelSection() 86 * { 87 * public void run() 88 * { 89 * // Code for second concurrent parallel section 90 * . . . 91 * } 92 * }; 93 * new ParallelTeam(2).execute (new ParallelRegion() 94 * { 95 * public void run() throws Exception 96 * { 97 * execute (section_1, section_2); 98 * } 99 * }); 100 * </PRE> A parallel section group may contain any number of parallel sections. 101 * There are overloaded <code>execute()</code> methods that take one, two, or three 102 * parallel section arguments. If there are four or more parallel sections, put 103 * them in an array (type <code>ParallelSection[]</code>) and pass the array to the 104 * <code>execute()</code> method. 105 * <P> 106 * Normally, at the end of the parallel section group, the parallel team threads 107 * wait for each other at a barrier. To eliminate this barrier wait, include 108 * {@link edu.rit.pj.BarrierAction#NO_WAIT BarrierAction.NO_WAIT} in the <code>execute()</code> 109 * method call: 110 * <PRE> 111 * new ParallelTeam(2).execute (new ParallelRegion() 112 * { 113 * public void run() throws Exception 114 * { 115 * execute (section_1, section_2, BarrierAction.NO_WAIT); 116 * } 117 * }); 118 * </PRE> To execute a section of code in a single thread as part of the barrier 119 * synchronization, include an instance of class {@linkplain BarrierAction} in 120 * the <code>execute()</code> method call. The barrier action object's 121 * <code>run()</code> method contains the code to be executed in a single thread 122 * while the other threads wait: 123 * <PRE> 124 * new ParallelTeam(2).execute (new ParallelRegion() 125 * { 126 * public void run() throws Exception 127 * { 128 * execute (section_1, section_2, new BarrierAction() 129 * { 130 * public void run() 131 * { 132 * // Single-threaded code goes here 133 * . . . 134 * } 135 * }); 136 * } 137 * }); 138 * </PRE> For further information, see class {@linkplain BarrierAction}. 139 * <P> 140 * A parallel section may be executed by one thread in the parallel thread team 141 * by executing a parallel section group consisting of the one parallel section, 142 * as shown above: 143 * <PRE> 144 * new ParallelTeam().execute (new ParallelRegion() 145 * { 146 * public void run() throws Exception 147 * { 148 * . . . 149 * execute (new ParallelSection() 150 * { 151 * public void run() 152 * { 153 * // Code to be executed by one parallel team thread 154 * . . . 155 * } 156 * }); 157 * . . . 158 * } 159 * }); 160 * </PRE> 161 * <P> 162 * A parallel section may be executed in a mutually exclusive fashion by calling 163 * a {@linkplain ParallelRegion}'s <code>critical()</code> or 164 * <code>criticalNonexclusive()</code> method. For example: 165 * <PRE> 166 * new ParallelTeam().execute (new ParallelRegion() 167 * { 168 * public void run() throws Exception 169 * { 170 * . . . 171 * critical (new ParallelSection() 172 * { 173 * public void run() 174 * { 175 * // Mutually exclusive code 176 * . . . 177 * } 178 * }); 179 * . . . 180 * } 181 * }); 182 * </PRE> 183 * <P> 184 * By calling a {@linkplain ParallelForLoop}'s <code>ordered()</code> method, a 185 * parallel section may be executed in the order of the loop indexes within a 186 * parallel for loop body, while the rest of the parallel for loop body executes 187 * concurrently. See classes {@linkplain IntegerForLoop}, {@linkplain 188 * IntegerStrideForLoop}, {@linkplain LongForLoop}, and {@linkplain 189 * LongStrideForLoop} for further information. 190 * <P> 191 * By calling a {@linkplain ParallelIteration}'s <code>ordered()</code> method, a 192 * parallel section may be executed in the order of the items within a parallel 193 * iteration body, while the rest of the parallel iteration body executes 194 * concurrently. See class {@linkplain ParallelIteration} for further 195 * information. 196 * 197 * @author Alan Kaminsky 198 * @version 11-Nov-2007 199 */ 200 public abstract class ParallelSection 201 extends ParallelConstruct { 202 203 // Exported constructors. 204 /** 205 * Construct a new parallel section. 206 */ 207 public ParallelSection() { 208 super(); 209 } 210 211 // Exported operations. 212 /** 213 * Execute this parallel section. 214 * <P> 215 * The <code>run()</code> method must be implemented in a subclass. 216 * 217 * @exception Exception The <code>run()</code> method may throw any exception. 218 * @throws java.lang.Exception if any. 219 */ 220 public abstract void run() 221 throws Exception; 222 223 }