Steve MacDonald - Selected Publications by Date

Return to home page

UW logo

2008
  • J. Chen and S. MacDonald, "Towards a Better Collaboration of Static and Dynamic Analyses for Testing Concurrent Programs", in Proceedings of the 2008 Workshop on Parallel and Distributed Systems: Testing, Analysis, and Debugging (PADTAD 2008), Seattle, WA, July 2008. 9 ms.
    (Abstract, .ps.gz, .pdf)
  • A. Stevenson and S. MacDonald, "Dynamic Aspect-Oriented Load Balancing in Java RMI", in Proceedings of the 2008 International Conference on Parallel and Distributed Processing Techniques and Applications (PDPTA 2008), Las Vegas, NV, July 2008, pages 485-491.
    (Abstract, .ps.gz, .pdf)
  • W. van Heiningen, S. MacDonald, and T. Brecht, "Babylon: Middleware for Distributed, Parallel, and Mobile Java Applications", Concurrency and Computation: Practice and Experience 20(10):1195-1224, 2008.
    (Abstract, .ps.gz, .pdf)
  • A. Stevenson and S. MacDonald, "Smart Proxies in Java RMI with Dynamic Aspect-Oriented Programming", in Proceedings of the 10th International Workshop on Java and Components for Parallelism, Distribution, and Concurrency (IWJPDC 2008), Miama, FL, April 2008. 6 ms.
    (Abstract, .ps.gz, .pdf)
2007
  • J. Chen and S. MacDonald, "Testing Concurrent Programs using Value Schedules", in Proceedings of the 22nd IEEE/ACM International Conference on Automated Software Engineering (ASE 2007), Atlanta, GA, November 2007, pages 313-322.
    (Abstract, .ps.gz, .pdf)
  • S. MacDonald, K. Tan, J. Schaeffer, and D. Szafron, "Deferring Design Pattern Decisions and Automating Structural Pattern Changes using a Design-Pattern-Based Programming System", accepted to ACM Transactions on Programming Languages and Systems, June 2007. 45 ms.
    (Abstract, .ps.gz, .pdf)
2006
  • S. MacDonald, J. Chen, and D. Novillo, "Deterministically Executing a Concurrent Program for Testing and Debugging", in Proceedings of the 2006 International Conference on Programming Languages and Compilers (PLC 2006), Las Vegas, NV, June 2006, pages 844-850.
    (Abstract, .ps.gz, .pdf)
  • J. Chen and S. MacDonald, "Exploiting Roles and Responsibilities to Generate Code in a Distributed Design-Pattern-Based Programming System", in Proceedings of the 2006 International Conference on Parallel and Distributed Processing Techniques and Applications (PDPTA 2006), Las Vegas, NV, June 2006, pages 17-23.
    (Abstract, .ps.gz, .pdf)
  • W. van Heiningen, T. Brecht, and S. MacDonald, "Exploiting Dynamic Proxies in Middleware for Distributed, Parallel, and Mobile Java Applications", in Proceedings of the 8th International Workshop on Java for Parallel and Distributed Computing (JAVAPDC 2006), Rhodes Island, Greece, April 2006. 8 ms.
    (Abstract, .ps.gz, .pdf)
  • W. van Heiningen, T. Brecht, and S. MacDonald, "Babylon v2.0: Middleware for Distributed, Parallel, and Mobile Java Applications", in Proceedings of the 11th International Workshop on High-Level Parallel Programming Models and Supportive Environments (HIPS 2006), Rhodes Island, Greece, April 2006. 8ms.
    (Abstract, .ps.gz, .pdf)
2005
  • S. MacDonald, J. Chen, and D. Novillo, "Choosing Among Alternative Futures", in Proceedings of First International Haifa Verification Conference, Haifa, Israel, November 2005, Volume 3875 of Lecture Notes in Computer Science, pages 247-264.
    (Abstract, .ps.gz, .pdf)
  • J. Chen and S. MacDonald, "RoadMapAssembler: A New Pattern-Based J2EE Development Tool", in Proceedings of CASCON 2005, Toronto, Ontario, Canada, October 2005, pages 113-127.
    (Abstract, .ps.gz, .pdf)
  • S. MacDonald, "Transforming an Object-Oriented Pipeline to a Master-Worker: The State-Based Pipeline ", Design pattern workshopped at the First Workshop on Patterns in High Performance Computing (patHPC 2005), Urbana-Champaign, IL, May 2005, 9 pp.
    (Description, .ps.gz, .pdf)
2004
  • S. MacDonald, D. Szafron, and J. Schaeffer, "Rethinking the Pipeline as Object-Oriented States with Tranformations", In Proceedings of the 9th International Workshop on High-Level Parallel Programming Models and Supportive Environments (HIPS 2004), Santa Fe, NM, April 2004, pages 12-21.
    (Abstract, .ps.gz, .pdf)

2003

  • K. Tan, D. Szafron, J. Schaeffer, J. Anvik, and S. MacDonald, "Using Generative Design Patterns to Generate Parallel Code for a Distributed Memory Environment", in Proceedings of ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming (PPoPP 2003), San Diego, CA, June 2003, pages 203-215.
    (Abstract, .pdf)
2002
  • S. MacDonald, J. Anvik, S. Bromling, J. Schaeffer, D. Szafron, and K. Tan, "From Patterns to Frameworks to Parallel Programs", Parallel Computing, 28(12):1663-1683, 2002.
    (Abstract, .ps.gz, .pdf)
  • S. MacDonald, D. Szafron, J. Schaeffer, J. Anvik, S. Bromling and K. Tan, "Generative Design Patterns", in Proceedings of the 17th International Conference on Automated Software Engineering (ASE2002), Edinburgh, UK, September 2002, pages 23-34.
    (Abstract, .pdf)
  • S. Bromling, S. MacDonald, J. Anvik, J. Schaeffer, D. Szafron, and K. Tan, "Pattern-based Parallel Programming", in Proceedings of the 2002 International Conference on Parallel Processing (ICPP2002), Vancouver, British Columbia, August 2002, pages 257-265.
    (Abstract, .pdf)
  • J. Anvik, S. MacDonald, D. Szafron, J. Schaeffer, S. Bromling and K. Tan, "Generating Parallel Programs from the Wavefront Design Pattern", in Proceedings of the 7th International Workshop on High-Level Parallel Programming Models and Supportive Environments (HIPS'02) (CD-ROM), Fort Lauderdale, Florida, April 2002, 8 pages. Awarded Best Paper of the workshop.
    (Abstract, .pdf)
2001
  • S. MacDonald, "From Patterns to Frameworks to Parallel Programs", Ph.D. Thesis, Department of Computing Science, University of Alberta, November 2001. Also listed as Technical Report TR02-02, Department of Computing Science, University of Alberta, January 2002.
    (Abstract, .ps.gz, .pdf)
2000
  • W. Hui, S. MacDonald, J. Schaeffer, and D. Szafron, "Visualizing Object and Method Granularity for Program Parallelization", in Proceedings of Parallel and Distributed Computing and Systems (PDCS 2000), Las Vegas, Nevada, November 2000, pages 286-291.
    (Abstract, .pdf)
  • S. MacDonald, "Two-Dimensional Mesh Design Pattern Template for CO2P3S", Research document, October 2000.
    (Abstract, .ps.gz)
  • S. MacDonald, D. Szafron, J. Schaeffer, and S. Bromling, "Generating Parallel Program Frameworks from Parallel Design Patterns", in Proceedings of the 6th International Euro-Par Conference (Euro-Par 2000), Munich, Germany, August 2000, Lecture Notes in Computer Science 1900, Springer-Verlag, pages 95-104.
    (Abstract, .ps.gz)
1999
  • S. MacDonald, D. Szafron, and J. Schaeffer, "Object-Oriented Pattern-Based Parallel Programming with Automatically Generated Frameworks", in Proceedings of the 5th USENIX Conference on Object-Oriented Tools and Systems (COOTS'99), San Diego, CA, May 1999, pages 29-43.
    (Abstract, .ps.gz, HTML)
1998
  • S. MacDonald, "Pattern-based Object-Oriented Parallel Programming", Candidacy document, University of Alberta, January 1998.
    (.ps.gz)
1997
  • S. MacDonald, J. Schaeffer, and D. Szafron, "Pattern-based Object-Oriented Parallel Programming", in Proceedings of the First International Scientific Computing in Object-Oriented Parallel Environments Conference (ISCOPE '97), Marina del Rey, California, USA, December 1997, Lecture Notes in Computer Science 1343, Springer-Verlag, pages 267-274.
    (Abstract, Extended Abstract (.ps.gz), Paper (.ps.gz))
1996
  • S. MacDonald, "Design Patterns in Enterprise", In CASCON '96 CD-ROM Proceedings, Toronto, Ontario, Canada, November 1996.
    (Abstract, .ps.gz)
  • S. MacDonald, D. Szafron, J. Schaeffer, "An Object-Oriented Run-time System for Parallel Applications", In Proceedings of Technology of Object-Oriented Languages and Systems (TOOLS) USA '96, Santa Barbara, CA, USA, August 1996.
    (Abstract, .ps.gz)
  • P. Iglinski, N. Kazouris, S. MacDonald, D. Novillo, I. Parsons, J. Schaeffer, D. Szafron, and D. Woloschuk, "Using a Template-Based Parallel Programming Environment to Eliminate Errors", In Proceedings of the 1996 High Performance Computing Symposium, Ottawa, Ontario, Canada, June 1996.
    (Abstract, .ps.gz)
1995
  • D. Woloschuk, P. Iglinski, S. MacDonald, D. Novillo, I. Parsons, J. Schaeffer, and D. Szafron, "Performance Debugging in the Enterprise Parallel Programming Environment", In CASCON '95 CD-ROM Proceedings, Toronto, Ontario, Canada, November 1995.
    (Abstract, .ps.gz)
  • S. MacDonald, "An Object-Oriented Run-time System for Parallel Programming", Master's Thesis, Department of Computing Science, University of Alberta, October 1995.
    (Abstract, .ps.gz)
  • P. Iglinski, S. MacDonald, C. Morrow, D. Novillo, I. Parsons, J. Schaeffer, D. Szafron, and D. Woloschuk. "Enterprise User's Manual Version 2.4", Technical Report TR95-02, Department of Computing Science, University of Alberta, January 1995.
    (Abstract, .ps.gz)

Abstracts

J. Chen and S. MacDonald, "Towards a Better Collaboration of Static and Dynamic Analyses for Testing Concurrent Programs", in Proceedings of the 2008 Workshop on Parallel and Distributed Systems: Testing, Analysis, and Debugging (PADTAD 2008), Seattle, WA, July 2008. 9 ms.

Testing concurrent programs remains a difficult task due to the non-deterministic nature of concurrent executions. Many approaches have been proposed to combine static and dynamic analysis to reduce the complexity of uncovering potential concurrency bugs. However, the existing collaboration schemes only provide a limited mechanism for exchanging relevant information between the two analyses. For example, alias information only flows from the static analysis module to the dynamic analysis module at the beginning of the dynamic analysis. Therefore, we cannot fully exploit the advantages of each type of analysis. Motivated by this observation, in this paper we present a new testing technique which enables a tighter collaboration between static analysis and dynamic analysis. In this collaboration scheme, static analysis and dynamic analysis interact iteratively throughout the whole testing process. Static analysis uses coarse-grained analysis to guide the dynamic analysis to concentrate on the relevant search space, while dynamic analysis collects concrete runtime information during the guided exploration. The runtime information provided by the dynamic analysis helps the static analysis to refine its coarse-grained analysis and provides better guidance on dynamic analysis. Currently, our implementation consists of a static analysis module based on Soot and a dynamic analysis module based on JPF (Java PathFinder).

A. Stevenson and S. MacDonald, "Dynamic Aspect-Oriented Load Balancing in Java RMI", in Proceedings of the 2008 International Conference on Parallel and Distributed Processing Techniques and Applications (PDPTA 2008), Las Vegas, NV, July 2008, pages 485-491.

Load balancing is the process of distributing client requests over a set of servers, and is a key element of obtaining good performance in a distributed application. Java RMI extends Java with distributed objects whose methods can be called from remote clients. In some Java RMI programs, there may be multiple replicas of a given object that can be the receiver of a remote method invocation. Effectively distributing these requests across these replicas requires either an extra balancer process or additional code on the client for this distribution. In this paper, we demonstrate the use of dynamic aspects in JAC to solve this problem. The client proxy is modified with an aspect to forward requests to a specific server, but the server is also able to shed load by altering or removing this aspect. The overhead of this approach is evaluated using a set of microbenchmarks.

A. Stevenson and S. MacDonald, "Smart Proxies in Java RMI with Dynamic Aspect-Oriented Programming", in Proceedings of the 10th International Workshop on Java and Components for Parallelism, Distribution, and Concurrency (IWJPDC 2008), Miama, FL, April 2008. 6 ms.

Java RMI extends Java with distributed objects whose methods can be called from remote clients. This abstraction is supported using statically-generated proxy objects on the client to hide network communication. One limitation of Java RMI is that these proxies can only forward method calls from client to server. Many applications can benefit from smart proxies that shift some application responsibilities to the client. Normally, developers must manually implement such proxies. This paper describes an aspect-oriented approach to creating smart proxies. This approach allows a server to extend an existing proxy with new capabilities at runtime. This approach is demonstrated with two examples.

J. Chen and S. MacDonald, "Testing Concurrent Programs using Value Schedules", in Proceedings of the 22nd IEEE/ACM International Conference on Automated Software Engineering (ASE 2007), Atlanta, GA, November 2007, pages 313-322.

Concurrent programs are difficult to debug and verify because of the nondeterministic nature of concurrent executions. A particular concurrency-related bug may only show up under certain rarely-executed thread interleavings. Therefore, commonly used debugging methodologies, such as inserting print statements, are no longer sufficient for uncovering concurrency-related bugs. However, many existing bug detection methods, such as dynamic analysis and model checking, have a very high computational cost.

In this paper, we introduce a new technique for uncovering concurrency-related bugs from multithreaded Java programs. Our technique uncovers concurrency-related bugs by generating and testing read-write assignment sequences, referred to as value schedules, of a multithreaded Java program. Our value-schedule-based technique distinguishes itself in its ability to avoid exploring superfluous program state space caused by speculative permutation on transitions. Therefore, our technique can achieve a higher degree of POR (Partial Order Reduction) than existing methods. We demonstrate our technique using some programs, with an implementation built using an explicit state model checker called JPF.

W. van Heiningen, S. MacDonald, and T. Brecht, "Babylon: Middleware for Distributed, Parallel, and Mobile Java Applications", Concurrency and Computation: Practice and Experience 20(10):1195-1224, 2008.

Babylon is a collection of tools and services that provide a 100% Java compatible environment for developing, running and managing parallel, distributed and mobile Java applications. It incorporates features like object migration, asynchronous method invocation and remote class loading while providing an easy-to-use interface. Additionally, Babylon enables Java applications to seamlessly create and interact with remote objects while protecting those objects from other applications by implementing access restrictions and separate namespaces.

The implementation of Babylon centers around dynamic proxies, a feature first available in Java 1.3, that allows proxy objects to be created at runtime. Dynamic proxies play a key role in achieving the goals of Babylon.

The potential cluster computing benefits of the system are demonstrated with experimental results which show that sequential Java applications can achieve significant performance benefits from using Babylon to parallelize their work across a cluster of workstations.

S. MacDonald, K. Tan, J. Schaeffer, and D. Szafron, "Deferring Design Pattern Decisions and Automating Structural Pattern Changes using a Design-Pattern-Based Programming System", accepted to ACM Transactions on Programming Languages and Systems, June 2007. 45 ms.

In the design phase of software development, the designer must make many fundamental design decisions concerning the architecture of the system. Incorrect decisions are relatively easy and inexpensive to fix if caught during the design process, but the difficulty and cost rise significantly if problems are not found until after coding begins. Unfortunately, it is not always possible to find incorrect design decisions during the design phase. To reduce the cost of expensive corrections, it would be useful to have the ability to defer some design decisions as long as possible, even into the coding stage. Failing that, tool support for automating design changes would give more freedom to revisit and change these decisions when needed. This paper shows how a design-pattern-based programming system based on generative design patterns can support the deferral of design decisions where possible, and automate changes where necessary. A generative design pattern is a parameterized pattern form that is capable of generating code for different versions of the underlying design pattern. We demonstrate these ideas in the context of a parallel application written with the CO2P3S pattern-based parallel programming system. We show that CO2P3S can defer the choice of execution architecture (shared-memory or distributed-memory), and can automate several changes to the application structure that would normally be daunting to tackle late in the development cycle. Although we have done this work with a pattern-based parallel programming system, it can be generalized to other domains.

S. MacDonald, J. Chen, and D. Novillo, "Deterministically Executing a Concurrent Program for Testing and Debugging", to appear in Proceedings of the 2006 International Conference on Programming Languages and Compilers (PLC 2006), Las Vegas, NV, June 2006. 7 ms.

Non-determinism is a serious problem in the testing and debugging of concurrent programs. Thread interleavings may be different on each run, changing the order of events. Testing a concurrent program requires many of these orders to be run, either to determine that all orders produce correct results or to identify the presence of timing-dependent errors called race conditions. This paper presents preliminary work in deterministically executing a concurrent program using a combination of an intermediate compiler form and aspect-oriented programming. Specifically, we execute the code generated for the intermediate compiler form using aspects to control the value returned for the read of any shared variable. This allows us to deterministically execute specific test cases. This work is preliminary, with many outstanding issues, but we feel the technique shows promise.

J. Chen and S. MacDonald, "Exploiting Roles and Responsibilities to Generate Code in a Distributed Design-Pattern-Based Programming System", to appear in Proceedings of the 2006 International Conference on Parallel and Distributed Processing Techniques and Applications (PDPTA 2006), Las Vegas, NV, June 2006. 7 ms.

The implementation of a design pattern can be viewed as a process of selecting classes to play the roles needed by the pattern. To ensure that a class can play a role, each role has a set of responsibilities associated with it. When all responsibilities are satisfied, the pattern implementation is complete. Normally a programmer must write code for the responsibilities. However, the implementation of responsibilities can often be derived from information in the application or from user input, and then automatically generated. This paper describes a new approach that uses roles and responsibilities to generate code for an almost-complete application architecture in a pattern-based framework, leaving only application-specific code for the developer. We demonstrate this approach using RMA, an Eclipse plugin for writing Java 2 Enterprise Edition (J2EE) applications based on an existing J2EE framework.

W. van Heiningen, T. Brecht, and S. MacDonald, "Exploiting Dynamic Proxies in Middleware for Distributed, Parallel, and Mobile Java Applications", to appear in Proceedings of the 8th International Workshop on Java for Parallel and Distributed Computing (JAVAPDC 2006), Rhodes Island, Greece, April 2006. 8 ms.

Babylon v2.0 is a collection of tools and services that provide a 100% Java compatible environment for developing, running and managing parallel, distributed and mobile Java applications. It incorporates features like object migration, asynchronous method invocation and remote class loading while providing an easy-to-use interface. The implementation of Babylon v2.0 exploits dynamic proxies, a feature added to Java 1.3 that allows runtime creation of proxy objects. This paper shows how Babylon v2.0 exploits dynamic proxies to implement several key features without the need for special language or virtual machine extensions, preprocessors, or compilers. The resulting Babylon programs are portable across all Java virtual machines, and the development process is simplified by removing the extra steps needed to invoke external stub compilers and incorporate the generated code into an application. This simplification also allows remote objects to be created for any class that supports an interface to its methods, even if source code is not available.

W. van Heiningen, T. Brecht, and S. MacDonald, "Babylon v2.0: Middleware for Distributed, Parallel, and Mobile Java Applications", to appear in Proceedings of the 11th International Workshop on High-Level Parallel Programming Models and Supportive Environments (HIPS 2006), Rhodes Island, Greece, April 2006. 8ms.

Babylon v2.0 is a collection of tools and services that provide a 100% Java compatible environment for developing, running and managing parallel, distributed and mobile Java applications. It incorporates features like object migration, asynchronous method invocation and remote class loading while providing an easy-to-use interface. Additionally, Babylon v2.0 enables Java applications to seamlessly create and interact with remote objects while protecting those objects from other applications by implementing access restrictions and separate name spaces.

This paper describes the most important programming features of the Babylon v2.0 system, using a heat diffusion example to show how they are used in practice. The potential cluster computing benefits of the system are demonstrated with experimental results which show that sequential Java applications can achieve significant performance benefits from using Babylon v2.0 to parallelize their work across a cluster of workstations.

S. MacDonald, J. Chen, and D. Novillo, "Choosing Among Alternative Futures", in Proceedings of First International Haifa Verification Conference, Haifa, Israel, November 2005, Volume 3875 of Lecture Notes in Computer Science, pages 247-264.

Non-determinism is a serious impediment to testing and debugging concurrent programs. Such programs do not execute the same way each time they are run, which can hide the presence of errors. Existing techniques use a variety of mechanisms that attempt to increase the probability of uncovering error conditions by altering the execution sequence of a concurrent program, but do not test for specific errors. This paper presents some preliminary work in deterministically executing a multithreaded program using a combination of an intermediate compiler form that identifies concurrent reaching definitions and aspect-oriented programming to control program execution. Specifically, the aspects allow a read of a shared variable to return any of the reaching definitions, where the desired definition can be selected before the program is run. As a result, we can deterministically run test cases. This work is preliminary and many issues have yet to be resolved, but we believe this idea shows some promise.

J. Chen and S. MacDonald, "RoadMapAssembler: A New Pattern-Based J2EE Development Tool", In Proceedings of CASCON 2005, Toronto, Ontario, Canada, October 2005, pages 113-127.

The quality of a J2EE web application depends on both the correctness of the code as well as the efficiency and flexibility of its architecture. Unfortunately, the design and development process is complex and includes tedious coding details, making it error-prone. Part of the problem lies in the incomplete abstractions provided by the J2EE specification. The artifacts of the distributed system environment are still present in applications and cannot be ignored, notably interfaces for distributed objects, name space information, and deployment information. In this paper, we present the detailed design of our design-pattern-based J2EE development system, RoadMapAssembler. This system shows that a J2EE architectural framework can be generated by assembling a set of design patterns in an incremental fashion, exploiting our knowledge of pattern implementations and inter-pattern relationships. This same knowledge also allows us to generate code for the distributed system artifacts that pollute J2EE applications. We demonstrate these features through the development of an example J2EE application.

S. MacDonald, "Transforming an Object-Oriented Pipeline to a Master-Worker: The State-Based Pipeline", Design pattern workshopped at the First Workshop on Patterns in High Performance Computing (patHPC 2005), Urbana-Champaign, IL, May 2005, 9 pp.
An algorithm takes a sequence of data objects through a series of transformations. Traditionally, the concurrency in such an algorithm is exposed using a pipeline. The pipeline is a conceptually simple parallel structure that can be used to speed up many problems. It is usually taught to novice parallel programmers early in their education.

However, expert parallel programmers typically eschew using the pipeline structure, especially for coarse-grained applications. The pipeline suffers from three serious problems that make an efficient and flexible implementation difficult. First, processors are idle when the pipeline is not full. This happens when the pipeline starts filling up (ramp-up time) and when there are no more input requests and the pipeline is emptying (ramp-down time). Second, traditional pipeline implementations are sensitive to load imbalance. Obtaining the best possible performance requires that the computation for each stage be perfectly balanced. Otherwise, stages that require less computation will be idle, waiting for work from more expensive stages. Third, traditional pipeline implementations tightly couple the concurrency with the computational stages. Each thread is assigned to execute a specific part of the computation. This makes it difficult to incrementally add new processors while still maintaining the balance among stages for good performance.

The problem addressed in this pattern is how to formulate a more efficient pipeline implementation that either reduces or eliminates these problems. In doing so, programmers may be more willing to use pipelines to solve their problems. They can take advantage of conceptual simplicity of this common parallel structure rather than being forced to rethink the problem because of the limitations of pipeline implementations.

S. MacDonald, D. Szafron, and J. Schaeffer, "Rethinking the Pipeline as Object-Oriented States with Tranformations", In Proceedings of the 9th International Workshop on High-Level Parallel Programming Models and Supportive Environments (HIPS 2004) , Santa Fe, NM, April 2004, pages 12-21.
The pipeline is a simple and intuitive structure to speed up many problems. Novice parallel programmers are usually taught this structure early on. However, expert parallel programmers typically eschew using the pipeline in coarse-grained applications because it has three serious problems that make it difficult to implement efficiently. First, processors are idle when the pipeline is not full. Second, load balancing is crucial to obtaining good speedup. Third, it is difficult to incrementally incorporate more processors into an existing pipeline. Instead, experts recast the problem as a master/slave structure which does not suffer from these problems. This paper details a transformation that allows programs written in a pipeline style to execute using the master/slave structure. Parallel programmers can benefit from both the intuitive simplicity of the pipeline and the efficient execution of a master/slave structure. This is demonstrated by performance results from two applications.
K. Tan, D. Szafron, J. Schaeffer, J. Anvik, and S. MacDonald, "Using Generative Design Patterns to Generate Parallel Code for a Distributed Memory Environment", in Proceedings of ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming (PPoPP 2003), San Diego, CA, June 2003, pages 203-215.
A design pattern is a mechanism for encapsulating the knowledge of experienced designers into a re-usable artifact. Parallel design patterns reflect commonly occurring parallel communication and synchronization structures. Our tools, CO2P3S (Correct Object-Oriented Pattern-based Parallel Programming System) and MetaCO2P3S, use generative design patterns. A programmer selects the parallel design patterns that are appropriate for an application, and then adapts the patterns for that specific application by selecting from a small set of code-configuration options. CO2P3S then generates a custom framework for the application that includes all of the structural code necessary for the application to run in parallel. The programmer is only required to write simple code that launches the application and to fill in some application-specific sequential hook routines. We use generative design patterns to take an application specification (parallel design patterns + sequential user code) and use it to generate parallel application code that achieves good performance in shared memory and distributed memory environments. Although our implementations are for Java, the approach we describe is tool and language independent. This paper describes generalizing CO2P3S to generate distributed-memory parallel solutions.
S. MacDonald, J. Anvik, S. Bromling, J. Schaeffer, D. Szafron, and K. Tan, "From Patterns to Frameworks to Parallel Programs", Parallel Computing, 28(12):1663-1683, 2002.
Object oriented programming, design patterns, and frameworks are abstraction techniques that have been used to reduce the complexity of sequential programming. This paper describes our approach of applying these three techniques to the more difficult parallel programming domain. The Parallel Design Patterns (PDP) process, the basis of the CO2P3S parallel programming system, combines these techniques in a layered development model. The result is a new approach to parallel programming that addresses correctness and openness in a unique way. At the topmost development layer, a customized framework is generated from a design pattern specification of the parallel structure of the program. This framework encapsulates all of the structural details of the pattern, including communication and synchronization, to prevent programmer errors and ensure correctness. Lower layers are used only for performance tuning to make the code as efficient as necessary. This paper describes CO2P3S, based on the PDP process, and demonstrates it using an example application. We also provide results from a usability study of CO2P3S.
S. MacDonald, D. Szafron, J. Schaeffer, J. Anvik, S. Bromling and K. Tan, "Generative Design Patterns", in Proceedings of the 17th International Conference on Automated Software Engineering (ASE2002), Edinburgh, UK, September 2002, pages 23-34.
A design pattern encapsulates the knowledge of object-oriented designers into re-usable artifacts. A design pattern is a descriptive device that fosters software design re-use. There are several reasons why design patterns are not used as generative constructs that support code re-use. The first reason is that design patterns describe a set of solutions to a family of related design problems and it is difficult to generate a single body of code that adequately solves each problem in the family. A second reason is that it is difficult to construct and edit generative design patterns. A third major impediment is the lack of a tool-independent representation. A common representation could lead to a shared repository to solve the availability problem. In this paper we describe a new approach to generative design patterns that solves these three difficult problems. We illustrate this approach using tools called CO2P2S and Meta-CO2P2S, but our approach is tool-independent.
S. Bromling, S. MacDonald, J. Anvik, J. Schaeffer, D. Szafron, and K. Tan, "Pattern-based Parallel Programming", in Proceedings of the 2002 International Conference on Parallel Processing (ICPP2002), Vancouver, British Columbia, August 2002, pages 257-265.
The advantages of pattern-based programming have been well-documented in the sequential literature. However patterns have yet to make their way into mainstream parallel computing, even though several research tools support them. There are two critical shortcomings of pattern-(or template)-based systems for parallel programming: lack of extensibility and performance. Patterns are typically limited in number or scope, thereby narrowing the applicability of a given system. As well, patterns usually offer generic solutions, which incur additional runtime overhead that impacts performance. This paper describes our approach for addressing these problems in the CO2P3S parallel programming system. CO2P3S supports multiple levels of abstraction, allowing the user to design an application with high-level patterns, but move to lower levels of abstraction for performance tuning. Patterns are implemented as parameterized templates, allowing the user the ability to customize the pattern to meet their needs. CO2P3S generates code that is specific to the pattern/parameter combination selected by the user. The MetaCO2P3S tool addresses extensibility by giving users the ability to design and add new pattern templates to CO2P3S. Since the patterns are stored in a system-independent format, they are suitable for storing in a repository to be shared throughout the user community. The CO2P3S/MetaCO2P3S combination is unique in the parallel computing world.
J. Anvik, S. MacDonald, D. Szafron, J. Schaeffer, S. Bromling and K. Tan, "Generating Parallel Programs from the Wavefront Design Pattern", in Proceedings of the 7th International Workshop on High-Level Parallel Programming Models and Supportive Environments (HIPS'02) (CD-ROM), Fort Lauderdale, Florida, April 2002, 8 pages. Awarded Best Paper of the workshop.
Object-oriented programming, design patterns, and frameworks are common techniques that have been used to reduce the complexity of sequential programming. We have applied these techniques to the more difficult domain of parallel programming. This paper describes CO2P3S, a pattern-based parallel programming system that generates parallel programs from parallel design patterns. We demonstrate CO2P3S by applying a new design pattern called the Wavefront pattern to three problems. We show that it is quick and easy to use CO2P3S to generate structurally correct parallel programs with good speed-ups on shared-memory computers.
S. MacDonald, "From Patterns to Frameworks to Parallel Programs", Ph.D. Thesis, Department of Computing Science, University of Alberta, November 2001. Also listed as Technical Report TR02-02, Department of Computing Science, University of Alberta, January 2002.

Parallel programming offers potentially large performance benefits for computationally intensive problems. Unfortunately, it is difficult to obtain these benefits because parallel programs are more complex than their sequential counterparts. One way to reduce this complexity is to use a parallel programming system to write parallel programs. This dissertation shows a new approach to writing object-oriented parallel programs based on design patterns, frameworks, and multiple layers of abstraction. This approach is intended as the basis for a new generation of parallel programming systems.

A critical evaluation of existing parallel programming systems is presented. This evaluation is based on a set of 13 characteristics of an ideal pattern-based parallel programming system. Based on the results of this evaluation, the PDP process was created. This process provides multiple layers of abstraction to support the complete application development cycle. The first layer supports pattern-based parallel programming by generating object-oriented frameworks from a design pattern description of the application structure. The generated code is hidden from the user to ensure correctness. Lower layers gradually provide access to the generated structural code and other low-level facilities.

The CO2P3S parallel programming system is an example of a tool that supports the PDP process. It generates multithreaded Java frameworks for a set of supported design pattern templates. The utility of this tool is demonstrated by four example programs which obtain reasonable speedups after being written using CO2P3S. Further, the results of a usability experiment are presented. The experiment compared parallel programming using CO2P3S against programming in non-CO2P3S Java with threads. The results show that CO2P3S users write less application code than their Java counterparts, and that this code is less complex.

W. Hui, S. MacDonald, J. Schaeffer, and D. Szafron, "Visualizing Object and Method Granularity for Program Parallelization Proceedings of Parallel and Distributed Computing and Systems (PDCS 2000), Las Vegas, Nevada, November 2000, pages 286-291.
There are increasing demands for more computing power. Parallel hardware is now commonplace and could be a cost-effective solution. However, to many developers, parallel programming is not a user-friendly task. At the same time, many programmers are turning to object-oriented techniques. Unfortunately, parallel computing with objects introduces many new problems. Tools are needed to help programmers convert their sequential object-oriented programs into parallel ones. This paper introduces Revy, a platform-neutral, easy-to- use, object/method granularity visualization system that assists parallel programmers in transforming their sequential object-oriented programs into parallel ones. Revy allows users to view and inspect the object communication patterns of their sequential applications and it serves as a profiling system that helps them identify the high-granularity objects/methods as candidates for parallel execution. This paper describes the requirements, architecture and implementation of Revy and illustrates the ideas with a case study.
S. MacDonald, "Two-Dimensional Mesh Design Pattern Template for CO2P3S", Research document, October 2000.
This document details the Two-Dimensional Mesh design pattern template support by the CO2P3S parallel programming system. It provides information on what parameters can be specified to specialize the template and how to use the framework code generated for the fully-specified template to implement an application. An example program, based on the Game of Life, is provided. The format of this document is similar to the pattern descriptions in Gamma et al.
S. MacDonald, D. Szafron, J. Schaeffer, and S. Bromling, "Generating Parallel Program Frameworks from Parallel Design Patterns", in Proceedings of the 6th International Euro-Par Conference (Euro-Par 2000), Munich, Germany, August 2000, Lecture Notes in Computer Science 1900, Springer-Verlag, pages 95-104.
Object-oriented programming, design patterns, and frameworks are abstraction techniques that have been used to reduce the complexity of sequential programming. The CO2P3S parallel programming system provides a layered development process that applies these three techniques to the more difficult domain of parallel programming. The system generates correct frameworks from pattern template specifications at the highest layer and provides performance tuning opportunities at lower layers. Each of these features is a solution to a major problem with current parallel programming systems. This paper describes CO2P3S and its highest level of abstraction using an example program to demonstrate the programming model and one of the supported pattern templates. Our results show that a programmer using the system can quickly generate a correct parallel structure. Further, applications built using these structures provide good speedups for a small amount of development effort.
S. MacDonald, D. Szafron, and J. Schaeffer, "Object-Oriented Pattern-Based Parallel Programming with Automatically Generated Frameworks", in Proceedings of the 5th USENIX Conference on Object-Oriented Tools and Systems (COOTS'99), San Diego, CA, May 1999, pages 29-43.
The CO2P3S parallel programming system uses design patterns and object-oriented programming to reduce the complexities of parallel programming. The system generates correct frameworks from pattern template specifications and provides a layered programming model to address both the problems of correctness and openness. This paper describes the highest level of abstraction in CO2P3S, using two example programs to demonstrate the programming model and the supported patterns. Further, we introduce phased parallel design patterns, a new class of patterns that allow temporal phase relationships in a parallel program to be specified, and provide two patterns in this class. Our results show that the frameworks can be used to quickly implement parallel programs, reusing sequential code where possible. The resulting parallel programs provide substantial performance gains over their sequential counterparts.
S. MacDonald, J. Schaeffer, and D. Szafron, "Pattern-based Object-Oriented Parallel Programming", in Proceedings of the First International Scientific Computing in Object-Oriented Parallel Environments Conference (ISCOPE '97), Marina del Rey, California, USA, December 1997, Lecture Notes in Computer Science 1343, Springer-Verlag, pages 267-274.
Over the past five years there have been several attempts to produce template-based or pattern-based parallel programming systems (PPS). These attempts have been characterized by a desire to simplify the production of parallel code and to ensure its correctness, at the possible expense of performance. In this paper we present the CO2P3S system, which addresses many of the shortcomings of earlier systems: the potential for irregularities between the patterns and the code, the lack of pattern extensibility, the lack of system openness and the difficulties involved in incremental performance tuning.
S. MacDonald, "Design Patterns in Enterprise", In CASCON '96 CD-ROM Proceedings, Toronto, Ontario, Canada, November 1996.
The Enterprise parallel programming system allows programmers to create, compile, execute, and debug parallel applications that execute over a network of workstations. The run-time system, which is responsible for the correct execution of user programs, was redesigned and re-implemented using object-oriented technology. This paper details the object-oriented components of the design where the Composite, Adapter, and Strategy design patterns were applied.
S. MacDonald, D. Szafron, J. Schaeffer, "An Object-Oriented Run-time System for Parallel Applications", In Proceedings of Technology of Object-Oriented Languages and Systems (TOOLS) USA '96, Santa Barbara, CA, USA, August 1996.
This paper describes three basic specializations of design patterns that can be used in implementing the runtime systems of parallel applications. These specializations were discovered while re-designing and re-implementing the runtime system for the Enterprise parallel programming system. Enterprise allows programmers to create, compile, execute, and debug programs that execute over a network of workstations. A previous paper in this conference described its object-oriented user interface. The run-time system is responsible for the execution of user programs. It was recently re-designed using objects to rectify problems with the previous version and to provide an extensible base for further research. This papers details the key object-oriented components of the new system. Although these components were developed in the context of the Enterprise system, they are generally applicable to object-oriented run-time systems for general parallel applications.
P. Iglinski, N. Kazouris, S. MacDonald, D. Novillo, I. Parsons, J. Schaeffer, D. Szafron, and D. Woloschuk, "Using a Template-Based Parallel Programming Environment to Eliminate Errors", In Proceedings of the 1996 High Performance Computing Symposium, Ottawa, Ontario, Canada, June 1996.
In this paper we describe how a template-based approach to writing distributed/parallel applications can be used to eliminate parallel programming errors. We take a two phase approach. First, the programming model can be designed to prevent many common parallel errors from occurring. Second, we show how an integrated set of tools that support the common model provided by the templates can be used to quickly detect and fix errors that cannot be prevented. In effect, a high-level view of a parallel program can be used to improve the software engineering properties of a distributed program, and reduce the time required to produce a correct, functional program.
D. Woloschuk, P. Iglinski, S. MacDonald, D. Novillo, I. Parsons, J. Schaeffer, and D. Szafron, "Performance Debugging in the Enterprise Parallel Programming Environment", In CASCON '95 CD-ROM Proceedings, Toronto, Ontario, Canada, November 1995.
Debugging parallel/distributed programs is an iterative process, alternating between correctness debugging and performance debugging. Performance debugging involves identifying bottlenecks in a parallel computation and providing meaningful feedback to the user. The quality of this feedback can play a major role in the quick resolution of performance problems. Many feedback systems provide the user with endless streams of statistics, relying on the user to do the interpretation. This paper discusses the performance debugging facilities in the Enterprise parallel programming system. Through visual and aural cues, performance information is conveyed to the user in an intuitive manner.
S. MacDonald, "An Object-Oriented Run-time System for Parallel Programming", Master's Thesis, Department of Computing Science, University of Alberta, October 1995.

Enterprise is an integrated parallel programming system that provides facilities to create, compile, execute, tune, and debug parallel programs on a network of workstations. Enterprise uses two models to completely specify a program. The first model presents an abstraction that relates the different elements of a program to assets in a business enterprise, giving an intuitive method of expressing the parallelism in the program. The second model modifies the semantics of sequential C so that the assets are called remotely. This last model is implemented by preprocessing the user's code to invoke the run-time system, which handles message passing and synchronization.

This thesis proposes that the run-time system can be designed and implemented using object-oriented techniques to improve upon specific aspects of the previous version. Most of these changes fix known limitations or errors in the previous system. The new system is more flexible, allowing the programming models to be changed easily. It can also dynamically incorporate new resources into an executing program. The preprocessing stage has been simplified and, finally, the communications system was abstracted out of the code. These changes, along with several other optimizations, have been implemented and the new and old systems were compared. The results show that the new system has met all of its goals, although some have yet to be validated.

P. Iglinski, S. MacDonald, C. Morrow, D. Novillo, I. Parsons, J. Schaeffer, D. Szafron, and D. Woloschuk. "Enterprise User's Manual Version 2.4", Technical Report TR95-02, Department of Computing Science, University of Alberta, January 1995.
This paper contains an introduction and user manual for the Enterprise Parallel Programming System, including the programming model, the meta-programming model and tools (animation, replay and debugging).
This space intentionally left blank.