| GENERAL INFORMATION: |
| |
| This code computes the equilibrium distribution of light in a scene |
| using the hierarchical diffuse radiosity method. A description of the |
| sequential hierarchical radiosity method can be found in |
| |
| Pat Hanrahan, David Salzman and Larry Aupperle, "A Rapid Hierarchical |
| Radiosity Algorithm", Proc. SIGGRAPH 1991. |
| |
| Descriptions of the parallel algorithm can be found in |
| |
| Jaswinder Pal Singh, Anoop Gupta and Marc Levoy, "Parallel |
| Visualization Algorithms: Performance and Architectural Implications", |
| IEEE Computer, July 1994. |
| |
| or in |
| |
| Jaswinder Pal Singh, et al, "Load Balancing and Data Locality in |
| Hierarchical N-body Methods", Stanford Univ. Tech Report CSL-TR-92-505 |
| (to appear in JPDC). |
| |
| A detailed description will also be in the SPLASH-2 report. |
| |
| The parallelism is managed with distributed task queues and task |
| stealing, and there is one task queue per processor. |
| |
| RUNNING THE PROGRAM: |
| |
| To see how to run the program, please see the comment at the top |
| of the main.C file or run it as "RADIOSITY -h". Many of the |
| command-line options control the accuracy of the program's computation |
| and have default values set in the program (which can be overridden by |
| command-line specifications). These are indicated as such in the |
| comments or usage statement, and we recommend that they be left at |
| their default values for base SPLASH-2 runs. |
| |
| The program runs in different modes, either interactive (using the SGI |
| GL library) or batch. The batch mode does not attempt to display the |
| rendered image, while the interactive mode brings up a GL window with |
| knobs and dials to set parameters and run the program. If you are |
| running on a system that does not support GL or you do not want to |
| display the resulting scene, please use the -batch option on the |
| command line. The makefile shows you how to link the GL libraries. |
| This sample makefile is for a machine on which we do not want to |
| display, in which case we use the glibdumb and glibps libraries, which |
| do not support displaying and are provided with the code. The only |
| real way to verify the correctness of the program is to view the |
| result using GL. The commented lines in the print_statistics routine |
| can be uncommented to print several runtime statistics, but these are |
| nondeterministic in parallel since the program does not follow a |
| deterministic execution path and does not arrive at exactly the same |
| result in different parallel runs (the radiosity algorithm is |
| iterative to convergence, and even the path is nondeterministic). |
| |
| The way the program is written, it compiles in the input description |
| of the scene in polygon coordinates. This is in the file room_model.C, |
| which contains the descriptions of two scenes. One is the room scene |
| originally used by Hanrahan et al in their SIGGRAPH paper, and the |
| other is an artificial extension of this scene (removing a wall of the |
| room and introducing some of the features of this room in the |
| neighboring room thus created). To use the former, use the -room |
| command line option; for the latter, use -largeroom. -room is what we |
| call the base SPLASH problem. If you don't specify -room or |
| -largeroom, the program will default to a small dummy test scene which |
| is useful only for debugging the program and verifying that it works. |
| |
| There are two types of compile-time flags that can be set in the code. |
| One controls the manner in which patches are assigned to processors at |
| the beginning of each time-step in the radiosity iteration. The simple |
| case is to assign the same statically chosen set of patches to the |
| same processor in every iteration (and rely completely on task |
| stealing for load balancing); this is what happens by default, or if |
| -DPATCH_ASSIGNMENT_STATIC is used as a compile-time flag. The more |
| sophisticated case is to do an assignment at the beginning of a time |
| step based on the costs of patches profiled in the previous time step; |
| this is what happens if the -DPATCH_ASSIGNMENT_COSTBASED flag is used |
| at compile-time. The latter can yield less stealing, but uses more |
| synchronization to keep track of costs and hence has more overhead. |
| We recommend using the default (not defining anything, so static is |
| used) in the base SPLASH runs. |
| |
| The other type of compile-time flag special cases some machines in |
| terms of maximum number of processors etc. (grep for #if in *.C and |
| *.H to find these) and even memory consistency model in one instance. |
| |
| BASE PROBLEM SIZE: |
| |
| The base problem size we recommend is to use the program as follows: |
| |
| RADIOSITY -p ? -batch -room |
| |
| where ? is the number of processors. This sets the ae, bf etc flags |
| (see comment at top of rad_main.C or run "RADIOSITY -h" to see what |
| these are) to their default values. The default values can be found |
| by looking at the comment at the top of rad_main.C or running |
| "RADIOSITY -h". |
| |
| DATA DISTRIBUTION: |
| |
| Data distribution is very difficult in this code, except for some |
| per-process data structures (typically arrays of structures indexed by |
| process_id; grep for MAX_PROCESSORS to find them). |
| General data distribution of other (scene, e.g.), however, does not |
| make much difference to performance on the Stanford DASH |
| multiprocessor. |
| |
| |