<?xml version="1.0" encoding="utf-8"?>
<document xmlns="http://cnx.rice.edu/cnxml" xmlns:cnxorg="http://cnx.rice.edu/system-info" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:md="http://cnx.rice.edu/mdml" xmlns:q="http://cnx.rice.edu/qml/1.0" xmlns:bib="http://bibtexml.sf.net/" id="new" cnxml-version="0.7" module-id="new">

<title>An Introduction to the Partitioned Global Address Space (PGAS) Programming Model</title>
<metadata xmlns:md="http://cnx.rice.edu/mdml" mdml-version="0.5">
  <!-- WARNING! The 'metadata' section is read only. Do not edit below.
       Changes to the metadata section in the source will not be saved. -->
  <md:repository>http://cnx.org/content</md:repository>
  <md:content-url>http://cnx.org/content/m20649/latest/</md:content-url>
  <md:content-id>m20649</md:content-id>
  <md:title>An Introduction to the Partitioned Global Address Space (PGAS) Programming Model</md:title>
  <md:version>1.7</md:version>
  <md:created>2009/03/11 09:41:30 GMT-5</md:created>
  <md:revised>2010/03/16 15:49:58.210 GMT-5</md:revised>
  <md:actors>
    <md:person userid="TimStitt">
      <md:firstname>Tim</md:firstname>
      <md:surname>Stitt</md:surname>
      <md:fullname>Tim Stitt Ph.D.</md:fullname>
      <md:email>stitt@cscs.ch</md:email>
    </md:person>
  </md:actors>
  <md:roles>
    <md:role type="author">TimStitt</md:role>
    <md:role type="maintainer">TimStitt</md:role>
    <md:role type="licensor">TimStitt</md:role>
  </md:roles>
  <md:license url="http://creativecommons.org/licenses/by/3.0/"/>
  <!-- For information on license requirements for use or modification, see license url in the
       above <md:license> element.
       For information on formatting required attribution, see the URL:
         CONTENT_URL/content_info#cnx_cite_header
       where CONTENT_URL is the value provided above in the <md:content-url> element.
  -->
  <md:keywordlist>
    <md:keyword>Chapel</md:keyword>
    <md:keyword>Co-Array Fortran (CAF)</md:keyword>
    <md:keyword>Parallel Programming Model</md:keyword>
    <md:keyword>PGAS</md:keyword>
    <md:keyword>Titanium</md:keyword>
    <md:keyword>Unified Parallel C (UPC)</md:keyword>
    <md:keyword>X10</md:keyword>
  </md:keywordlist>
  <md:subjectlist>
    <md:subject>Science and Technology</md:subject>
  </md:subjectlist>
  <md:abstract>This module introduces the Partitioned Global Address Space (PGAS) programming paradigm. This paradigm provides both a data and execution model that has the potential to dramatically improve runtime performance and programmer productivity on increasingly ubiquitous multi-core architectures. The fundamental principles of the PGAS paradigm are presented in comparison with traditional parallel programming models. Furthermore, the richer 'Asynchronous PGAS' programming model is also introduced in association with the next-generation parallel programming languages Chapel and X10.</md:abstract>
  <md:language>en</md:language>
  <!-- WARNING! The 'metadata' section is read only. Do not edit above.
       Changes to the metadata section in the source will not be saved. -->
</metadata>

<content>
  <section id="eip-799"><title>Introduction</title>

<para id="Introduction"><title>The Rise of the 'Multicore' Machines</title>While <term url="http://en.wikipedia.org/wiki/Moore%27s_law" window="new">Moore's Law</term> continues to predict the doubling of transistors on an integrated circuit every 18 months, performance and power considerations have forced chip designers to embrace <term target-id="multicore">multi-core</term> processors in place of higher frequency uni-core processors.</para>

<para id="eip-288">As desktop and high-performance computing architectures tend towards distributed collections of multi-core nodes<footnote id="multicoreFootnote">We can view a multi-core processor and its associated memory as a traditional symmetric multiprocessing (SMP) node.</footnote>, a new parallel <term target-id="model">programming paradigm</term> is required to fully exploit the complex distributed and shared-memory hierarchies of these evolutionary systems.</para>

<para id="eip-765">Recently, a programming model has been developed that has the potential to exploit the best features of this distributed shared-memory architecture. Not only does this model promise improved runtime performance on distributed clusters of <term target-id="SMP">SMPs</term>, its data and execution semantics support increased programmer productivity. This model is called the Partitioned Global Address Space (PGAS) model.</para></section>

<section id="eip-105"><title>A Brief Review of Conventional Parallel Programming Models</title>

<para id="eip-460"><title>Shared-Memory Model</title>The <term target-id="sharedMemoryDef">shared-memory</term> programming model typically exploits a shared memory system, where any memory location is directly accessible by any of the computing processes (i.e. there is a single global address space). This programming model is similar in some respects to the sequential single-processor programming model with the addition of new constructs for synchronising multiple access to shared variables and memory locations.</para>

<figure id="sharedMemory">
<media id="SMFlash" alt="Animation of Shared-Memory Model">
      <flash mime-type="application/x-shockwave-flash" src="SharedMemory.swf" height="350" width="350" wmode="transparent"/>
</media>
<caption>Shared-Memory Architecture and Programming Model</caption></figure>

<para id="eip-233">The shared-memory architecture and programming model is illustrated in Figure 1. In this model any processing element (PE) can make a reference to any memory address within the global address space. The memory request is forwarded through an interconnection network to memory, with the result returned back, via the network, to the PE. </para><para id="eip-120">Typically, a shared-memory system will implement a <term target-id="multithreadDef">multi-threaded programming model</term>, where each processing element executes program thread. Currently, <term target-id="openmpDef">OpenMP</term> and <term target-id="pthreadsDef">Pthreads</term> are the two application programming interfaces (API) predominantly used to implement multi-threaded applications on shared-memory systems.</para><exercise id="eip-714"><problem id="eip-27">
  <para id="eip-180">Which of the following properties of the shared-memory programming model (e.g using OpenMP) are generally true:
<newline/>
<newline/>
(a) It's a simpler programming model than the programming models for distributed-memory systems
<newline/>
(b) Provides precise control over data locality and processor affinity
<newline/>
(c) Supports finer-grain parallelism e.g., loop-level parallelism
<newline/> 
(d) Supports incremental parallelization
<newline/> 
(e) Shared-memory programming bugs are easier to track down
  </para>
</problem>

<solution id="eip-858">
  <para id="eip-399">(a) <emphasis>TRUE</emphasis> - It's a simpler programming model than the programming models for distributed-memory systems 
<note id="Ex1s1" type="note">Arguably, a single global address space simplifies memory references (e.g. array and variable references) within the program code, akin to the sequential programming model.</note>
<newline/>
(b) <emphasis>FALSE</emphasis> - Provides precise control over data locality and processor affinity
<note id="eip-id28007057" type="note">Generally shared-memory programming models provide little or no support for data placement and processor association.</note>
<newline/>
(c) <emphasis>TRUE</emphasis> - Supports finer-grain parallelism e.g., loop-level parallelism
<note id="Ex1s2" type="note">
Generally with a multi-threaded based programming language, program loops can be parallelized by executing independent iterations on different threads. In OpenMP this can be accomplished with the PARALLEL DO directive:   
<code id="eip-id13424676" display="block" lang="fortran">
!$OMP DO SCHEDULE(DYNAMIC,CHUNK)
      DO I = 1, N
        C(I) = A(I) + B(I)
        WRITE(*,100) TID,I,C(I)
 100    FORMAT(' Thread',I2,': C(',I3,')=',F8.2)
      ENDDO
!$OMP END DO NOWAIT
</code></note>
<newline/> 
(d) <emphasis>TRUE</emphasis> - Supports incremental parallelization
<note id="eip-id18712477" type="note">As illustrated in the example above, individual code segments can be parallelized by simply wrapping them in OpenMP directives.</note>
(e) <emphasis>FALSE</emphasis> - Shared-memory programming bugs are easier to track down
<note id="eip-id14957211" type="note">Shared-memory programming bugs involving synchronization and data races can be very difficult to trace.</note>
</para>
</solution>
</exercise><para id="eip-151"><title>Distributed-Memory Model</title>The <term target-id="distributedDef">distributed-memory</term> programming model exploits a distributed-memory system where each processor maintains its own local memory and has no direct knowledge about another processor's memory (a "share nothing" approach). For data to be shared, it must be passed from one processor to another as a message.</para>

<note id="fs-id6044832" type="important">Data that resides on the local memory of a processor can be accessed much more quickly than data that resides on another processor.</note>

<figure id="distributedMemory">
<media id="DMFlash" alt="Animation of Distributed-Memory Model">
      <flash mime-type="application/x-shockwave-flash" src="DistributedMemory.swf" height="350" width="350" wmode="transparent"/>
</media>
<caption>Distributed-Memory Architecture and Programming Model</caption></figure><para id="eip-104">The distributed-memory architecture and programming model is illustrated in Figure 2. If a processing element (PE) requires data from another PE to continue its execution, it must request the data. The request is made by sending a message, through the interconnection network, to the destination PE. When the data is available on the destination PE it is returned within a message, through the interconnection network, to the requesting PE. </para><para id="eip-525">Typically, a distributed-memory system will implement a <term target-id="messagePassDef">message-passing programming model</term>, where processing elements communicate data by sending and receiving messages. 
<newline/>
<newline/>
Currently, <term target-id="mpidef">MPI</term> is the de facto standard specification for implementing message-passing on distributed-memory systems. MPI programs generally follow a <term target-id="spmd">Single Program Multiple Data</term> (SPMD) programming style.</para><exercise id="eip-926"><problem id="eip-927">
  <para id="eip-633">
    Which of the following properties of the distributed-memory programming model (using MPI) are generally true:
<newline/>
<newline/>
(a) For many architectures, it can result in near-optimal performance
<newline/>
(b) Provides precise control over data locality and processor affinity
<newline/>
(c) Allows natural mapping of algorithms to implementation
<newline/> 
(d) Supports incremental parallelization
<newline/> 
(e) Runs on most parallel platforms
  </para>
</problem>

<solution id="eip-395">
  <para id="eip-319">(a) <emphasis>TRUE</emphasis> - For many architectures, it can result in near-optimal performance
<newline/>
(b) <emphasis>TRUE</emphasis> - Provides precise control over data locality and processor affinity
<note id="eip-id24296891" type="aside">Each MPI process has direct access to its local memory for reading and writing data values. Accessing local data is more efficient than accessing data on a remote process.</note>
<newline/>
(e) <emphasis>TRUE</emphasis> - Runs on most parallel platforms</para>
</solution></exercise>
</section><section id="eip-262"><title>The Partitioned Global Address Space (PGAS) Model</title><para id="eip-490"><title>The 'Best' of Both Worlds</title>Ideally a successful parallel programming model should hope to marry the performance and data locality (<emphasis>partitioning</emphasis>) features of MPI with the programmability and data referencing simplicity of a shared-memory (<emphasis>global address space</emphasis>) model.</para><para id="eip-724">The PGAS programming model aims to achieve these characteristics by providing:</para><list id="eip-236" list-type="enumerated" number-style="arabic"><item>a local-view programming style (which differentiates between local and remote data partitions)</item>
<item>a global address space (which is directly accessible by any process)</item>
<item>compiler-introduced communication to resolve remote references</item>
<item><term target-id="onesidedDef">one-sided communication</term> for improved inter-process performance</item>
<item>support for distributed data structures</item></list>

<figure id="pgas"><media id="pgasFlash" alt="Animation of PGAS Model">
      <flash mime-type="application/x-shockwave-flash" src="pgas2.swf" height="350" width="350" wmode="transparent"/>
</media>
<caption>PGAS Programming Model</caption></figure><para id="eip-933">The PGAS programming model is illustrated in Figure 3. In this model variables and arrays can be either <emphasis>shared</emphasis> or <emphasis>local</emphasis>. Each process has private memory for local data items and shared memory for globally shared data values. While the shared-memory is partitioned among the cooperating processes (each process will contribute memory to to the shared global memory), a process can directly access any data item within the global address space with a single address. 
<note id="eip-id44655285" type="important">Greater performance is achieved when a process accesses data which is held locally (whether in its private memory or a partition of the global address space).</note>
</para><para id="eip-740">In Figure 3, five data objects have been declared within the PGAS programming model: </para><list id="eip-696"><item>Each process has declared a private copy of variable <emphasis>x</emphasis></item>
<item>Process 2 has declared a shared variable <emphasis>y</emphasis></item>
<item>A shared array <emphasis>A</emphasis> is distributed across the global address space</item></list><para id="eip-320">Each instance of variable <emphasis>x</emphasis> can directly write and read values to/from the global address space. Likewise an address in the global address space can be directly read or written to from another address within the global address space.</para><note id="eip-76">Typically, PGAS language compilers generate the necessary communication during program compilation.</note><para id="eip-823"><title>PGAS Programming Languages</title>Currently there are three (3) PGAS programming languages that are becoming commonplace on modern computing systems:</para>

<list id="eip-508" list-type="enumerated" number-style="arabic"><item><term target-id="upc">Unified Parallel C (UPC)</term></item>
<item><term target-id="caf">Co-Array Fortran (CAF)</term></item>
<item><term target-id="titanium">Titanium</term></item></list><para id="eip-843"><title>Matrix Multiplication with UPC, CAF and Titanium</title>For your curiosity, the following code examples illustrate some of the PGAS language features provided by UPC, CAF and Titanium respectively. For each language, a primitive matrix multiplication operation has been implemented.</para><example id="eip-754" type="mmult"><code id="eip-id14741218" display="block" lang="c">
#include &lt;upc_relaxed.h&gt;

// a and c are blocked shared matrices, initialization is not currently implemented
shared [N*P /THREADS] int a[N][P], c[N][M];
shared[M/THREADS] int b[P][M];
int b_local[P][M];

void main (void) {
  int i, j , l; // private variables
  upc_memget(b_local, b, P*M*sizeof(int));

  upc_forall(i = 0 ; i&lt;N ; i++; &amp;c[i][0]) {
    for (j=0 ; j&lt;M ;j++) {
      c[i][j] = 0;
      for (l= 0 ; l&lt;P ; l++) c[i][j] += a[i][l]*b_local[l][j];
    }
  }
}<caption>Matrix Multiplication in UPC</caption></code></example>

<example id="fs-id19971337" type="mmult"><code id="fs-id19971338" display="block" lang="fortran">
real,dimension(n,n)[p,*] :: a,b,c

do k=1,n
  do q=1,p
    c(i,j) = c(i,j) + a(i,k)[myP, q]*b(k,j)[q,myQ]
  end do
end do
<caption>Matrix Multiplication in Co-Array Fortran</caption></code></example>

<example id="eip-id27980168" type="mmult"><code id="eip-id27980869" display="block" lang="java">
public static void matMul(double [2d] a,
                          double [2d] b,
                          double [2d] c) {

  foreach (ij in c.domain()) {
    double [1d] aRowi = a.slice(1, ij[1]);
    double [1d] bColj = b.slice(2, ij[2]);

      foreach (k in aRowi.domain()) {
        c[ij] += aRowi[k] * bColj[k];
      }
  }
}
<caption>Matrix Multiplication in Titanium</caption></code></example></section><section id="eip-33"><title>The Asynchronous Partitioned Global Address Space Model</title><para id="eip-920">Within the U.S., the DARPA <term target-id="hpcs">HPCS</term> project has the goal to raise high-performance computing (HPC) user productivity by a factor of 10 by the year 2010.</para><note id="eip-733">Productivity = Performance + Programmability + Portability + Robustness</note><para id="eip-458">As part of this project two novel parallel programming languages are being funded for development, with the aim of improving programmer productivity on next-generation computing architectures.
<newline/>
<newline/>
The two languages under development are:</para>

<list id="fs-id19207090" list-type="enumerated" number-style="arabic"><item><term target-id="x10">X10</term></item>
<item><term target-id="chapel">Chapel</term></item></list><para id="eip-0">Both these languages implement an <emphasis>asynchronous</emphasis> partitioned global address space (APGAS) programming model; a term originally coined within the X10 language project. The APGAS model extends the PGAS programming model by providing a richer execution framework than the SPMD style generally used by the traditional PGAS languages.
<newline/>
<newline/>
In particular, asynchrony is achieved by:</para><list id="eip-535" list-type="enumerated" number-style="arabic"><item>permitting each node to execute multiple tasks from a task pool</item>
<item>permitting nodes to invoke work on other nodes</item></list>

<example id="fs-id19536642" type="mmult"><para id="fs-id19343008">This example illustrates asynchronous task creation in Chapel using Chapel's <term target-id="locales">Locales</term> concept.</para> 
<code id="fs-id19343615" display="block">// Chapel programs begin running on locale 0 by default
var x, y: real;         // allocate x and y on locale 0

x=1;y=2;

begin on Locales(1) {   // asynchronously create task on locale 1
  var z: real;          // allocate z on locale 1
  writeln(x.locale.id); // print “0”
  writeln(z.locale.id); // print “1”
  z = x + y;            // requires “get” for x and y
  writeln(z);
}<caption>Asynchronous Task Creation in Chapel</caption></code></example>

<example id="fs-id7210507" type="mmult">
<para id="fs-id12462751">This example illustrates asynchronous task creation in X10 using X10's <term target-id="async">async</term> concept.</para> 
<code id="fs-id19206913" display="block">
// global dist. array
final double a[D] =  …;  
final int k = …;

async ( a.distribution[99] ) { 
    // executed at A[99]’s place
    atomic a[99] = k; 
}
<caption>Asynchronous Task Creation in X10</caption></code></example><para id="eip-580">Chapel and X10 provide many more high-level language features to improve programmer productivity during the development of parallel applications. These features will be explored in further detail in separate modules. </para><para id="eip-561">If you are interested in learning more about the next-generation parallel programming languages X10 and Chapel, please view the following video and audio introductions, presented by the technical leads of each project.  </para>

<para id="eip-892"><title>An Audio Introduction to X10 by Vijay Saraswat (IBM)</title></para><media id="eip-id4345904" display="block" alt="Audio Introduction to X10">
<audio mime-type="audio/mpeg" src="X10_audio.mp3"/>
</media>

<para id="eip-557">You can download the transcript of the audio presentation <link resource="X10_transcript.pdf" window="new">here</link>.</para>

<para id="eip-id12271749"><title>A Video Introduction to Chapel by Brad Chamberlain (Cray Inc.)</title></para>

<para id="fs-id14035052"><link url="http://www.youtube.com/watch?v=dK8IdrJrYtE" window="new">Google Seattle Conference on Scalability 2008: Chapel - Productive Parallel Programming at Scale</link>.</para>

</section>

</content>

<glossary>

<definition id="async">
<term>async</term>
<meaning id="fs-id17306624"><para id="fs-id17306625">The X10 asynchronous execution language construct.<newline/><newline/>
<emphasis>async (P) S</emphasis>: 
<list id="fs-id17337829" list-type="enumerated" number-style="arabic"><item>creates a new child activity at place <emphasis>P</emphasis>, that executes statement <emphasis>S</emphasis> </item>
<item>returns immediately</item>
</list>
</para>
</meaning>
</definition>

<definition id="chapel">
<term>Chapel</term>
<meaning id="fs-id45269654"><para id="fs-id45269655">Cascade High-Productivity Language: a new parallel programming language being developed by Cray Inc. as part of the DARPA-led High Productivity Computing Systems program (HPCS).<newline/><newline/>Further information: <link url="http://chapel.cs.washington.edu/" window="new">http://chapel.cs.washington.edu/</link></para>
</meaning>
</definition>

<definition id="caf">
<term>Co-array Fortran (CAF)</term>
<meaning id="fs-id5206361"><para id="fs-id5206362">Explicit PGAS language extensions to Fortran 95.<newline/><newline/>Further information: <link url="http://www.co-array.org/" window="new">http://www.co-array.org/</link></para>
</meaning>
</definition>

<definition id="distributedDef">
<term>Distributed-Memory System</term>
<meaning id="fs-id21393355"><para id="fs-id20876451">A distributed-memory system is a multiple-processor computer system in which each processor has its own private memory. Computational tasks can only operate on local data, and if remote data is required, the computational task must communicate with one or more remote processors.<newline/><newline/>Further information: <link url="http://en.wikipedia.org/wiki/Distributed_memory" window="new">http://en.wikipedia.org/wiki/Distributed_memory</link></para>
</meaning>
</definition>

<definition id="hpcs">
<term>HPCS</term>
<meaning id="fs-id9745624"><para id="fs-id9745625">The DARPA High Productivity Computing Systems project is focused on providing a new generation of economically viable high productivity computing systems for national security and for the industrial user community. <newline/><newline/>Further information: <link url="http://www.highproductivity.org/" window="new">http://www.highproductivity.org/</link></para>
</meaning>
</definition>

<definition id="locales">
<term>Locales</term>
<meaning id="fs-id15247790"><para id="fs-id15247791">Chapel's abstract representation of the target architecture. A locales properties include:
<list id="fs-id8457981" list-type="enumerated" number-style="arabic"><item>threads within a locale have uniform access to local memory</item>
<item>memory within other locales is accessible, but at a price</item>
<item>locales are defined for a given architecture by a Chapel compiler e.g., a multicore processor or SMP node could be a locale</item>
</list>
</para>
</meaning>
</definition>

<definition id="localViewDef">
<term>Local-view Model</term>
<meaning id="fs-id3330536"><para id="fs-id3364014">A programming model in which a process only has direct access to the local components of a distributed data structure.</para>
</meaning>
<seealso><term target-id="SPMD">SPMD</term></seealso>
</definition>



<definition id="messagePassDef">
<term>Message-Passing Model</term>
<meaning id="fs-id7670715"><para id="fs-id7670716">A communication protocol where data is sent and received in packets between communicating processes.<newline/><newline/>Further information: <link url="http://en.wikipedia.org/wiki/Message_passing" window="new">http://en.wikipedia.org/wiki/Message_passing</link></para>
</meaning>
</definition>

<definition id="mpidef">
<term>MPI</term>
<meaning id="fs-id12120790"><para id="fs-id16564617">Message-Passing Interface: a language-independent communications protocol used to program parallel computers using both point-to-point and collective communications. MPI defines a message-passing application programmer interface, together with protocol and semantic specifications for how its features must behave in any implementation<newline/><newline/>Further information: <link url="http://www.mpi-forum.org/" window="new">http://www.mpi-forum.org/</link></para>
</meaning>
</definition>

<definition id="multicore">
<term>Multi-core Processor</term>
<meaning id="fs-id20032936"><para id="fs-id11968724">A multi-core processor combines two or more independent cores (normally a CPU) into a single package composed of a single integrated circuit (IC). <newline/><newline/>Further information: <link url="http://en.wikipedia.org/wiki/Multi_core" window="new">http://en.wikipedia.org/wiki/Multi_core</link></para>
</meaning>
</definition>

<definition id="multithreadDef">
<term>Multi-threaded Programming Model</term>
<meaning id="fs-id3270025"><para id="fs-id4261118">Multi-threading is a popular programming and execution model that allows multiple threads to exist within the context of a single process. These threads share the process' resources but are able to execute independently.<newline/><newline/>Further information: <link url="http://en.wikipedia.org/wiki/Thread_(computer_science)" window="new">http://en.wikipedia.org/wiki/Thread_(computer_science)</link></para>
</meaning>
</definition>

<definition id="onesidedDef">
<term>One-sided Communication</term>
<meaning id="fs-id22412893"><para id="fs-id22412894">Traditional interprocess communication (used by MPI) requires cooperation and synchronization between sending and receiving processes; this is referred to as <emphasis>two-sided communication</emphasis>. <newline/><newline/>In <emphasis>one-sided communication</emphasis>, a process can update or interrogate the memory of another process without any intervention from the destination process.</para>
</meaning>
</definition>

<definition id="openmpDef">
<term>OpenMP</term>
<meaning id="fs-id8239911"><para id="fs-id8239912">OpenMP (Open Multi-Processing) is an application programming interface (API) that supports multi-platform shared memory multiprocessing programming (typically using a fork-join model) in C, C++ and Fortran on many architectures. It consists of a set of compiler directives, library routines, and environment variables that influence run-time behavior.<newline/><newline/>Further information: <link url="http://openmp.org/wp/" window="new">http://openmp.org/wp/</link></para>
</meaning>
</definition>

<definition id="model">
<term>Programming Paradigm</term>
<meaning id="fs-id8189361"><para id="fs-id8189362">A programming paradigm or model is a mental framework that governs the entire programming lifecycle including design, coding, testing, debugging and tuning.</para>
</meaning>
</definition>

<definition id="pthreadsDef">
<term>Pthreads</term>
<meaning id="fs-id9521538"><para id="fs-id9521539">Pthreads or POSIX Threads, is a POSIX standard that defines an API for creating and manipulating threads.<newline/><newline/>Further information: <link url="http://en.wikipedia.org/wiki/POSIX_Threads" window="new">http://en.wikipedia.org/wiki/POSIX_Threads</link></para>
</meaning>
</definition>

<definition id="sharedMemoryDef">
<term>Shared-Memory</term>
<meaning id="fs-id3977942"><para id="fs-id22562321">A shared memory system is one that typically provides a large block of random access memory that can be accessed by several different central processing units (CPUs) in a multiple-processor computer system.<newline/><newline/>Further information: <link url="http://en.wikipedia.org/wiki/Shared_memory" window="new">http://en.wikipedia.org/wiki/Shared_memory</link></para>
</meaning>
</definition>

<definition id="SMP">
<term>SMP</term>
<meaning id="fs-id46199310"><para id="fs-id5266654">Symmetric Multiprocessing: a multiprocessor computer-architecture where two or more identical processors can connect to a single shared main memory.<newline/><newline/>Further information: <link url="http://en.wikipedia.org/wiki/Symmetric_multiprocessing" window="new">http://en.wikipedia.org/wiki/Symmetric_multiprocessing</link></para>
</meaning>
</definition>

<definition id="spmd">
<term>SPMD</term>
<meaning id="fs-id8433378"><para id="fs-id8850206">Single Program Multiple Data: multiple autonomous processors simultaneously execute the same program at independent points.<newline/><newline/>Further information: <link url="http://en.wikipedia.org/wiki/SPMD" window="new">http://en.wikipedia.org/wiki/SPMD</link></para>
</meaning>
<seealso><term target-id="localViewDef">Local-view Model</term></seealso>
</definition>

<definition id="titanium">
<term>Titanium</term>
<meaning id="fs-id10176675"><para id="fs-id10176676">Explicit PGAS language extensions to Java.<newline/><newline/>Further information: <link url="http://titanium.cs.berkeley.edu/" window="new">http://titanium.cs.berkeley.edu/</link></para>
</meaning>
</definition>

<definition id="upc">
<term>Unified Parallel C (UPC)</term>
<meaning id="fs-id16079518"><para id="fs-id16079519">Explicit PGAS language extensions to ANSI C.<newline/><newline/>Further information: <link url="http://upc.gwu.edu/" window="new">http://upc.gwu.edu/</link></para>
</meaning>
</definition>

<definition id="x10">
<term>X10</term>
<meaning id="fs-id12864428"><para id="fs-id12864429">Experimental new language currently under development at IBM in collaboration with academic partners. The X10 effort is part of the IBM PERCS project (Productive Easy-to-use Reliable Computer Systems) in the DARPA program on High Productivity Computer Systems. <newline/><newline/>Further information: <link url="http://domino.research.ibm.com/comm/research_projects.nsf/pages/x10.index.html" window="new">http://domino.research.ibm.com/comm/research_projects.nsf/pages/x10.index.html</link></para>
</meaning>
</definition>

</glossary>

</document>

