diff --git a/.github/workflows/publish-site.yml b/.github/workflows/publish-site.yml deleted file mode 100644 index 56c9eeb..0000000 --- a/.github/workflows/publish-site.yml +++ /dev/null @@ -1,41 +0,0 @@ -# Via: https://github.com/SamStephens/nanoc-build-pages -name: Build and deploy to Github pages - -permissions: - contents: read - pages: write - id-token: write - -on: - push: - branches: - - master - -# Workflow with two jobs: "Build" then "Deploy" -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: 'Checkout' - uses: actions/checkout@v3 - with: - submodules: recursive - - name: 'Build page with Nanoc' - uses: SamStephens/nanoc-build-pages@v2 - with: - source: ./ - - name: 'Upload artifact' - uses: actions/upload-pages-artifact@v3 - with: - path: ./output - - deploy: - needs: build - runs-on: ubuntu-latest - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - steps: - - name: 'Deploy to GitHub Pages' - id: deployment - uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 5647d31..0000000 --- a/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -output/ -tmp/ -*.blg -*.log -*.nav -*.out -*.aux -*.snm -*.toc -*.bbl - diff --git a/Gemfile b/Gemfile deleted file mode 100644 index ffd4972..0000000 --- a/Gemfile +++ /dev/null @@ -1,6 +0,0 @@ -source 'https://rubygems.org' - -gem 'nanoc' -gem 'adsf' -gem 'nokogiri' -gem 'kramdown' diff --git a/Makefile b/Makefile deleted file mode 100644 index 00b000f..0000000 --- a/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -.PHONY: all clean - -TARGET := output - -all: - nanoc compile - -clean: - rm -rf $(TARGET) diff --git a/README.md b/README.md deleted file mode 100644 index 904954d..0000000 --- a/README.md +++ /dev/null @@ -1,40 +0,0 @@ -# The charmplusplus.org website - -See also https://wiki.illinois.edu/wiki/display/ppl/Deploy+the+charmplusplus+website. - -This is for deploying the charmplusplus website (http://charmplusplus.org/) which is hosted on the machine "charm". - - -## Building the website -Steps to obtain a local copy of the website for updating: - -- Check out the source code: - - $ git clone https://github.com/UIUC-PPL/charmplusplus.org - -- Install the required gems: - - $ gem install nanoc adsf - -- Compile the website (anytime you make changes): - - $ cd charmplusplus.org - $ var/lib/gems/1.8/bin/nanoc compile - -Note that the directory where the nanoc executable is stored may be different than this. - -- Start a local server (port will print to screeen): - - $ /var/lib/gems/1.8/bin/nanoc view - -From here you can access the website by accessing http://localhost:PORT/. - -## Editing the content - -- Change directory to `content` -- Edit the html -- Recompile the website to generate the new set of static pages - -## Deploy - -After compiling the webpage with nanoc, just push the changes to the master branch on GitHub and the website will automatically be deployed after a few minutes. diff --git a/Rules b/Rules deleted file mode 100644 index 02cf9ac..0000000 --- a/Rules +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env ruby - -# A few helpful tips about the Rules file: -# -# * The string given to #compile and #route are matching patterns for -# identifiers--not for paths. Therefore, you can’t match on extension. -# -# * The order of rules is important: for each item, only the first matching -# rule is applied. -# -# * Item identifiers start and end with a slash (e.g. “/about/” for the file -# “content/about.html”). To select all children, grandchildren, … of an -# item, use the pattern “/about/*/”; “/about/*” will also select the parent, -# because “*” matches zero or more characters. - -compile '/' do - filter :erb - layout 'homepage' - filter :relativize_paths, :type => :html -end - -compile '*' do - if item.binary? - # don’t filter binary items - else - case item[:extension] - when 'html' - # Lay the content out into this template - layout 'default' - # Run the laid out content through erb to run embedded function calls etc - filter :erb - #Convert resource links to use relative paths - filter :relativize_paths, :type => :html - when 'css' - filter :relativize_paths,:type => :css - when 'js' - filter :relativize_paths,:type => :css - end - end -end - -route '/tutorial/' do - # Write item with identifier /foo/ to /foo/index.html - item.identifier + 'index.html' -end - -route '/tutorial/*' do - # Write item with identifier /foo/ to /foo.ext - item.identifier.chop + '.' + item[:extension] -end - -route '*' do - if item.binary? - # Write item with identifier /foo/ to /foo.ext - item.identifier.chop + '.' + item[:extension] - else - case item[:extension] - when nil - item.identifier.chop - when 'html' - item.identifier + 'index.html' - else - item.identifier.chop + '.' + item[:extension] - end - end -end - -layout '*', :erb diff --git a/content/applications.html b/applications/index.html similarity index 62% rename from content/applications.html rename to applications/index.html index 37a3684..b71d7ab 100644 --- a/content/applications.html +++ b/applications/index.html @@ -1,14 +1,117 @@ ---- -title: Applications -homec: home -tutorialc: tutorial -applicationsc: applications selected applicationsSelected -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - + + + + + + + Charm++: Applications + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+

Applications

    @@ -23,7 +126,8 @@

    Applications

    -

    Molecular Dynamics - NAMD

    +
    +

    Molecular Dynamics - NAMD

    NAMD, recipient of a 2002 Gordon Bell Award, is a parallel molecular dynamics application designed for high-performance simulation of large biomolecular systems. NAMD is a result of many years of collaboration between Prof. @@ -59,8 +163,9 @@

    Applications

    -
    -

    N-Body Cosmological Simulations - ChaNGa

    +
    +
    +

    N-Body Cosmological Simulations - ChaNGa

    ChaNGa @@ -108,19 +213,18 @@

    Applications

    GPU clusters. Over time, ChaNGa is being actively developed and improved, with an eye for efficient utilization and scaling of current and future supercomputing systems. -See ChaNGa web +See ChaNGa web site for download and instructions.

    -
    -

    Contagion in Social Networks - Episimdemics

    +
    +
    +

    Contagion in Social Networks - Episimdemics

    - episims + episims
    @@ -149,12 +253,12 @@

    Applications

    -
    -

    Ab initio Molecular Dynamics - OpenAtom

    +
    +
    +

    Ab initio Molecular Dynamics - OpenAtom

    - OpenAtom + OpenAtom

    Many important problems in material science, chemistry, solid-state physics, and biophysics require a modeling approach based on fundamental @@ -167,13 +271,16 @@

    Applications

    using a large number of virtual processors, which are mapped flexibly to available processors with assistance from the Charm++ runtime system. See the OpenAtom web site for more -details.

    +details.

    +


    +

    -
    -

    Computational Science and Engineering Applications - CSE

    +
    +
    +

    Computational Science and Engineering Applications - CSE

    Professor P. Geubelle and S. Breitenfeld of the Computational Solid Mechanics Group have developed CrackProp, an explicit Finite Element method @@ -184,8 +291,7 @@

    Applications

    - CSE + CSE

    Professor J. Dantzig and Jun-Ho Jeong of the Solidification Processing Lab @@ -204,12 +310,12 @@

    Applications

    -
    -

    Advanced Rocket Simulation

    +
    +
    +

    Advanced Rocket Simulation

    - CSE + CSE

    @@ -238,11 +344,11 @@

    Applications

    -
    -

    PSTIP - Parallel Stochastic Integer Programming

    +
    +
    +

    PSTIP - Parallel Stochastic Integer Programming

    - CSE + CSE

    Stochastic optimization is used for optimal resource allocation under @@ -271,6 +377,21 @@

    Applications

    tree and parallel evaluation of scenarios. Our designs show strong scaling to hundreds of cores. See the report for more details.

    -

    +
    + +
    +
    + + +
    + +
    + + diff --git a/content/assets/charmwebsite.css b/assets/charmwebsite.css similarity index 94% rename from content/assets/charmwebsite.css rename to assets/charmwebsite.css index 4b27ff4..4e8eca8 100644 --- a/content/assets/charmwebsite.css +++ b/assets/charmwebsite.css @@ -19,8 +19,7 @@ BIG.XHUGE { font-size : xx-large } h1 { color: #7b2e2e; margin: 2px auto; text-align:center; } h2 { color: #7b2e2e; padding: 8pt; } h3 { padding: 5pt; } -h4 { padding: 3pt; } -h5 { padding: 3pt; } +h4 { padding: 3pt; } /* Remove the annoying underlines, but still keep it accessible */ a { text-decoration: none; } @@ -59,7 +58,6 @@ body { #splashscreen h2 { font-size: 300%; margin-bottom:2px; padding:2px; } #splashscreen h3 { font-size: 150%; margin-top:2px; padding:2px; } #splashscreen h4 { font-size: 125%; margin:2px auto; color:#006600; text-align: center; } -#splashscreen h5 { font-size: 125%; margin:2px auto; color:#006600; text-align: left; } #keytraits { list-style-type: none; -moz-column-count: 3; -webkit-column-count: 3; column-count: 3; @@ -76,12 +74,6 @@ body { -moz-column-count: 2; -webkit-column-count: 2; column-count: 2; margin: 2px 5em; } -#announcements { - margin-top: 1em; - padding-top: 1em; - border-top: 1px solid #cccccc; -} -#announcements h3 { margin-bottom: 5px; } #portability { -moz-column-count: 3; -webkit-column-count: 3; column-count: 3; } diff --git a/content/assets/hatchbkgd.png b/assets/hatchbkgd.png similarity index 100% rename from content/assets/hatchbkgd.png rename to assets/hatchbkgd.png diff --git a/content/assets/hover.js b/assets/hover.js similarity index 100% rename from content/assets/hover.js rename to assets/hover.js diff --git a/content/assets/prettify.js b/assets/prettify.js similarity index 100% rename from content/assets/prettify.js rename to assets/prettify.js diff --git a/capabilities/index.html b/capabilities/index.html new file mode 100644 index 0000000..42246d1 --- /dev/null +++ b/capabilities/index.html @@ -0,0 +1,186 @@ + + + + + + + Charm++: Capabilities + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +
    + +

    Capabilities

    + +

    Automatic Overlap

    + +

    Because parallelism in Charm++ is expressed via interacting parallel objects +instead of processors, the runtime system can seamlessly provide overlap of +communication and computation as an application runs.

    + +

    Automatic Load Balancing

    + +

    Charm++ ships with an entire suite of load balancers, which can be selected +at runtime. All the application must do is provide a hint on when it is a good +time to synchronize for load balancing.

    + +

    Automatic Checkpointing and Fault Tolerance

    + +

    Charm++ can easily checkpoint an application's data to disk or to the memory +of a buddy node. If a fault occurs and the job persists, Charm++ will detect a +hard node failure and automatically continue execution from the previous +in-memory checkpoint. The programmer simply specifies the data to checkpoint +using a clean interface that is used for load balancing to serialize the +data.

    + +

    Power/Energy Optimization

    + +

    Charm++ runtime can reduce total energy consumption i.e. both +machine and cooling energy consumptions, by combining control over the +processor operating frequency/voltage with object migration. It also enables +restraining core temperatures to save cooling energy.

    + +

    Portable Code

    + +

    Charm++ comes pre-packaged with many machine layers that are tuned to the +latest supercomputer architectures, ranging from Blue Gene/Q to Cray XK6.

    + +

    Independent Modules, Interleaved Execution

    + +

    Because Charm++ programs are written in terms of a set of modules that +define parallel objects, multiple modules can execute concurrently. When one +module has little work to do or is idle, another module can fill the gap. Because +work can be prioritized in Charm++, the user can specify which objects have +priority and they will be treated accordingly by the Charm++ scheduler

    + +

    Interoperable with MPI, OpenMP and CUDA

    + +

    +Charm++ supports time and space sharing with MPI, allowing MPI to execute with Charm++ code either +in phases or partitioned by processors. Charm++ comes with its own OpenMP runtime which can be used +with Clang, GCC, and ICC compilers and which allows co-scheduling OpenMP tasks and Charm++ entry methods. +Charm++ also provides support for asynchronously executing CUDA kernels on the GPU and for orchestrating +data movement between hosts and devices.

    + +

    Ecosystem of Tools

    + +

    Charm++ is not just a programming language or runtime system; it also comes with a +full suite of tools, ranging from a parallel debugger to performance +visualization. You can even inject python code on the fly as your application +runs using the CCS tool.

    + +
    +
    + + +
    + + + diff --git a/classmaterial/index.html b/classmaterial/index.html new file mode 100644 index 0000000..b0ed0fd --- /dev/null +++ b/classmaterial/index.html @@ -0,0 +1,267 @@ + + + + + + + Charm++: + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Topic Slides Further Reading
    Introduction pptx pdf  
    Migratable-Objects, Programming Model pptx pdf A short article about Charm
    Model Contd. + Basic Charm++ pdf  
    Task parallelism and grainsize pdf  
    Chare Arrays pdf Basic Chares Arrays
    Structure Dagger(Message coordination) pdf LJdyanmics
    Dynamic Load Balancing and PUP pdf  
    Static Assignment + Debugging Techniques pptx  
    Load balancing, Basic Messages, LiveViz LiveViz
    + GreedyVsRefineLB
     
    Using Projections, and Charmdebug Projections
    + CharmDebug
    Projections Manual
    + CharmDebug Manual +
    Threaded Methods and blocking methods pptx  
    Threads, futures, Cth calls, and explicit suspension pptx Threaded Methods
    Messages, Priorities, Groups and Nodegroups pptx Messages
    Array Sections pptx  
    Shared Memory within a node:
    Basic Mechanisms, Conventions, + Conditional Packing, Boom-arrays
     
    Shared Memory: Charm+OpenMP, CkLoop  
    Adaptive MPI, MSA  
    Writing your own load balancer  
    State Space Search, Divide/Conquer apps, Seed balancer,
    Mixing data-parallel programs with task parallelism
     
    Writing your own load balancer  
    Fault Tolerance  
    Charisma, Charj  
    Application Case studies: NAMD, ChaNGa    
    Application Case studies:
     OpenAtom, CharmSimdemics + Interoperability with MPI
       
    + + +
    + +
    +
    + + +
    + + + diff --git a/config.yaml b/config.yaml deleted file mode 100644 index ff9a53b..0000000 --- a/config.yaml +++ /dev/null @@ -1,83 +0,0 @@ -# A list of file extensions that nanoc will consider to be textual rather than -# binary. If an item with an extension not in this list is found, the file -# will be considered as binary. -text_extensions: [ 'coffee', 'css', 'erb', 'haml', 'handlebars', 'hb', 'htm', 'html', 'js', 'less', 'markdown', 'md', 'ms', 'mustache', 'php', 'rb', 'sass', 'scss', 'txt', 'xhtml', 'xml' ] - -# The path to the directory where all generated files will be written to. This -# can be an absolute path starting with a slash, but it can also be path -# relative to the site directory. -output_dir: output - -# A list of index filenames, i.e. names of files that will be served by a web -# server when a directory is requested. Usually, index files are named -# “index.html”, but depending on the web server, this may be something else, -# such as “default.htm”. This list is used by nanoc to generate pretty URLs. -index_filenames: [ 'index.html' ] - -# Whether or not to generate a diff of the compiled content when compiling a -# site. The diff will contain the differences between the compiled content -# before and after the last site compilation. -enable_output_diff: false - -prune: - # Whether to automatically remove files not managed by nanoc from the output - # directory. For safety reasons, this is turned off by default. - auto_prune: false - - # Which files and directories you want to exclude from pruning. If you version - # your output directory, you should probably exclude VCS directories such as - # .git, .svn etc. - exclude: [ '.git', '.hg', '.svn', 'CVS' ] - -# The data sources where nanoc loads its data from. This is an array of -# hashes; each array element represents a single data source. By default, -# there is only a single data source that reads data from the “content/” and -# “layout/” directories in the site directory. -string_pattern_type: legacy -data_sources: - - - # The type is the identifier of the data source. By default, this will be - # `filesystem_unified`. - type: filesystem_unified - identifier_type: legacy - # The path where items should be mounted (comparable to mount points in - # Unix-like systems). This is “/” by default, meaning that items will have - # “/” prefixed to their identifiers. If the items root were “/en/” - # instead, an item at content/about.html would have an identifier of - # “/en/about/” instead of just “/about/”. - items_root: / - - # The path where layouts should be mounted. The layouts root behaves the - # same as the items root, but applies to layouts rather than items. - layouts_root: / - - # Whether to allow periods in identifiers. When turned off, everything - # past the first period is considered to be the extension, and when - # turned on, only the characters past the last period are considered to - # be the extension. For example, a file named “content/about.html.erb” - # will have the identifier “/about/” when turned off, but when turned on - # it will become “/about.html/” instead. - allow_periods_in_identifiers: false - -# Configuration for the “watch” command, which watches a site for changes and -# recompiles if necessary. -watcher: - # A list of directories to watch for changes. When editing this, make sure - # that the “output/” and “tmp/” directories are _not_ included in this list, - # because recompiling the site will cause these directories to change, which - # will cause the site to be recompiled, which will cause these directories - # to change, which will cause the site to be recompiled again, and so on. - dirs_to_watch: [ 'content', 'layouts', 'lib' ] - - # A list of single files to watch for changes. As mentioned above, don’t put - # any files from the “output/” or “tmp/” directories in here. - files_to_watch: [ 'config.yaml', 'Rules' ] - - # When to send notifications (using Growl or notify-send). - notify_on_compilation_success: true - notify_on_compilation_failure: true - -deploy: - default: - kind: git - branch: gh-pages diff --git a/contact/index.html b/contact/index.html new file mode 100644 index 0000000..fec1780 --- /dev/null +++ b/contact/index.html @@ -0,0 +1,166 @@ + + + + + + + Charm++: Contact + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +
    + +
    +

    Email the Charm++ developers + at charm@lists.cs.illinois.edu for bug + reports or Charm++ questions.

    + +

    Email the Parallel Programming Laboratory + at ppl@lists.cs.illinois.edu.

    + +

    Contact Professor Laxmikant (Sanjay) Kale at: +

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Email:kale@illinois.edu
    Phone:(217) 244-0094
    Office: 4212 Siebel Center
    Coordinator:Shanna M. DeSouza
    Email:desouzas@illinois.edu
    Phone:(217) 244-9104
    +
    + + +
    +
    + + +
    + + + diff --git a/content/capabilities.html b/content/capabilities.html deleted file mode 100644 index 2182a35..0000000 --- a/content/capabilities.html +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Capabilities ---- - -

    Capabilities

    - -

    Automatic Overlap

    - -

    Because parallelism in Charm++ is expressed via interacting parallel objects -instead of processors, the runtime system can seamlessly provide overlap of -communication and computation as an application runs.

    - -

    Automatic Load Balancing

    - -

    Charm++ ships with an entire suite of load balancers, which can be selected -at runtime. All the application must do is provide a hint on when it is a good -time to synchronize for load balancing.

    - -

    Automatic Checkpointing and Fault Tolerance

    - -

    Charm++ can easily checkpoint an application's data to disk or to the memory -of a buddy node. If a fault occurs and the job persists, Charm++ will detect a -hard node failure and automatically continue execution from the previous -in-memory checkpoint. The programmer simply specifies the data to checkpoint -using a clean interface that is used for load balancing to serialize the -data.

    - -

    Power/Energy Optimization

    - -

    Charm++ runtime can reduce total energy consumption i.e. both -machine and cooling energy consumptions, by combining control over the -processor operating frequency/voltage with object migration. It also enables -restraining core temperatures to save cooling energy.

    - -

    Portable Code

    - -

    Charm++ comes pre-packaged with many machine layers that are tuned to the -latest supercomputer architectures, ranging from Blue Gene/Q to Cray XK6.

    - -

    Independent Modules, Interleaved Execution

    - -

    Because Charm++ programs are written in terms of a set of modules that -define parallel objects, multiple modules can execute concurrently. When one -module has little work to do or is idle, another module can fill the gap. Because -work can be prioritized in Charm++, the user can specify which objects have -priority and they will be treated accordingly by the Charm++ scheduler

    - -

    Interoperable with MPI, OpenMP and CUDA

    - -

    -Charm++ supports time and space sharing with MPI, allowing MPI to execute with Charm++ code either -in phases or partitioned by processors. Charm++ comes with its own OpenMP runtime which can be used -with Clang, GCC, and ICC compilers and which allows co-scheduling OpenMP tasks and Charm++ entry methods. -Charm++ also provides support for asynchronously executing CUDA kernels on the GPU and for orchestrating -data movement between hosts and devices.

    - -

    Ecosystem of Tools

    - -

    Charm++ is not just a programming language or runtime system; it also comes with a -full suite of tools, ranging from a parallel debugger to performance -visualization. You can even inject python code on the fly as your application -runs using the CCS tool.

    diff --git a/content/classmaterial.html b/content/classmaterial.html deleted file mode 100644 index 050cf3b..0000000 --- a/content/classmaterial.html +++ /dev/null @@ -1,148 +0,0 @@ ---- -mec: home -tutorialc: tutorial -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Topic Slides Further Reading
    Introduction pptx pdf  
    Migratable-Objects, Programming Model pptx pdf A short article about Charm
    Model Contd. + Basic Charm++ pdf  
    Task parallelism and grainsize pdf  
    Chare Arrays pdf Basic Chares Arrays
    Structure Dagger(Message coordination) pdf LJdyanmics
    Dynamic Load Balancing and PUP pdf  
    Static Assignment + Debugging Techniques pptx  
    Load balancing, Basic Messages, LiveViz LiveViz
    - GreedyVsRefineLB
     
    Using Projections, and Charmdebug Projections
    - CharmDebug
    Projections Manual
    - CharmDebug Manual
    Threaded Methods and blocking methods pptx  
    Threads, futures, Cth calls, and explicit suspension pptx Threaded Methods
    Messages, Priorities, Groups and Nodegroups pptx Messages
    Array Sections pptx  
    Shared Memory within a node:
    Basic Mechanisms, Conventions, - Conditional Packing, Boom-arrays
     
    Shared Memory: Charm+OpenMP, CkLoop  
    Adaptive MPI, MSA  
    Writing your own load balancer  
    State Space Search, Divide/Conquer apps, Seed balancer,
    Mixing data-parallel programs with task parallelism
     
    Writing your own load balancer  
    Fault Tolerance  
    Charisma, Charj  
    Application Case studies: NAMD, ChaNGa    
    Application Case studies:
     OpenAtom, CharmSimdemics - Interoperability with MPI
       
    - - -
    diff --git a/content/contact.html b/content/contact.html deleted file mode 100644 index dda206a..0000000 --- a/content/contact.html +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Contact -homec: home -tutorialc: tutorial -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - -
    -

    Email the Charm++ developers - at charm@lists.cs.illinois.edu for bug - reports or Charm++ questions.

    - -

    Email the Parallel Programming Laboratory - at ppl@lists.cs.illinois.edu.

    - -

    Contact Professor Laxmikant (Sanjay) Kale at:
    - - - - - - - -
    Email:kale@illinois.edu
    Phone:(217) 244-0094
    Office: 4212 Siebel Center
    Coordinator:Shanna M. DeSouza
    Email:desouzas@illinois.edu
    Phone:(217) 244-9104
    -

    - diff --git a/content/download.html b/content/download.html deleted file mode 100644 index 50d91d2..0000000 --- a/content/download.html +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: Download -homec: home -tutorialc: tutorial -applicationsc: applications -miniAppsc: miniApps -downloadc: download selected downloadSelected -toolsc: tools -helpc: help ---- - -
    -

    Downloads

    -

    Charm++

    - -

    Latest release version: Charm++ v7.0.0 (tar.gz)

    -

    Latest dev version: Nightly Snapshot (tar.gz)

    - -

    The latest development version of Charm++ can be downloaded directly from our - git source archive. To get the Charm++ source code:

    -
    git clone https://github.com/UIUC-PPL/charm
    -

    This will create a directory named charm. Move to this directory:

    -
    cd charm
    -

    And now build Charm++ (netlrts-linux example):

    -
    ./build charm++ netlrts-linux-x86_64 [ --with-production | -g ]
    -

    This will make a netlrts-linux-x86_64 directory, with bin, include, lib, etc. subdirectories.

    -

    Note that this development version may not be as portable or robust as the released - versions. Therefore, it may be prudent to keep a backup of old copies of - Charm++.

    - - -

    Projections

    - -

    Projections is Charm++'s performance analysis tool.

    - -

    Latest release binaries: Projections (tar.gz)

    - -

    To get the latest Projections source code:

    -
    git clone https://github.com/UIUC-PPL/projections
    -

    To build (requires gradle):

    -
    cd projections
    make
    - - -

    LiveViz and Charm Debug

    - -

    LiveViz is Charm++'s live program visualization tool. Charm Debug is Charm++'s parallel debugger.

    - -

    Latest Charm Debug release binaries: Charm Debug (tar.gz)

    - -

    To get the latest ccs_tools (includes both LiveViz and Charm Debug source code):

    -
    git clone https://github.com/UIUC-PPL/ccs_tools
    -

    To build:

    -
    cd ccs_tools
    ant
    - - -

    License

    - -

    Charm++ and associated software are licensed under the Charm++/Converse License

    . - -
    diff --git a/content/exercises.html b/content/exercises.html deleted file mode 100644 index 2090fe8..0000000 --- a/content/exercises.html +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: Charm++ Exercises -homec: home -tutorialc: tutorial -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - - -
    - -

    Learn Charm++ via a series of programming exercises

    -
    -
    -

    !! Under Construction, the following is currently being updated and will include links to the exercises !!

    - - - - - - - - - - - - - -
    - - diff --git a/content/exercises/arraysdesign.html b/content/exercises/arraysdesign.html deleted file mode 100644 index 3a2a24a..0000000 --- a/content/exercises/arraysdesign.html +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: Chare Arrays Design Exercise -homec: home -tutorialc: tutorial -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - - -

    Chare Arrays: Design Exercise

    - -

    Data Balancing:

    - - -

    Assume you have a 1D chare array -A. Each chare (say A[i]) in it holds a vector of numbers. The size of -this vector is different on different chares (say sizei on -A[i]). Your task is to equalize the load on all processors by -exchanging the numbers. It is not necessary to do minimal data -movement, but it is desirable. The balance at the end needs to be -almost exact. If there are a total of N numbers, and v chares, there -should be between floor (N/v): ceil(N/v) items on each chare. Note -that the only way to send information to another chare is by sending -an (entry) method invocation to it.

    - -

    There are many distinct algorithms possible. Sketch the -alternatives without coding them, and write cost estimates for them. -Keep in mind that the simplest (i.e. approximate) cost model in -Charm++: entry methods invocation's cost \alpha + n . {\beta}, where -α is a fixed cost, and β is a per-byte cost. For the sake of -intuition, you may assume α is about a thousand times larger than -β, say a microsecond vs a nanosecond. -Reductions and broadcasts of size N data on P processors cost \alpha log (P) + -N \beta. -Keep in mind that many -(but not all) -of the algorithms for this problem have two phases: first phase to identify who -should send how many numbers to whom, and second to actually do the -data exchange. Make sure to write your time estimates for both phases. -Compare two of the interesting algorithms in terms of cost, performance -tradeoffs if any (e.g. is each algorithm better in different -scenarios), scalability and coding complexity. -By scalability, here, we mean how well the algorithm behaves with a -large number of chares and/or a large number of physical processors.

    \ No newline at end of file diff --git a/content/exercises/arraysmethod1.html b/content/exercises/arraysmethod1.html deleted file mode 100644 index 3eabb90..0000000 --- a/content/exercises/arraysmethod1.html +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: Chare Arrays Method 1 Exercise -homec: home -tutorialc: tutorial -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - - -

    Chare Arrays: Method 1 Exercise

    - diff --git a/content/exercises/arraysmethod2.html b/content/exercises/arraysmethod2.html deleted file mode 100644 index e03d9ae..0000000 --- a/content/exercises/arraysmethod2.html +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: Chare Arrays Method 2 Exercise -homec: home -tutorialc: tutorial -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - - -

    Chare Arrays: Method 2 Exercise

    - diff --git a/content/exercises/arraysmethod3.html b/content/exercises/arraysmethod3.html deleted file mode 100644 index 9a4493f..0000000 --- a/content/exercises/arraysmethod3.html +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: Chare Arrays Method 3 Exercise -homec: home -tutorialc: tutorial -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - - -

    Chare Arrays: Method 3 Exercise

    - diff --git a/content/exercises/k-means.html b/content/exercises/k-means.html deleted file mode 100644 index e39ac56..0000000 --- a/content/exercises/k-means.html +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Chare Arrays Design Exercise -homec: home -tutorialc: tutorial -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - - -

    Chare Arrays: K-Means Clustering Exercise

    - -

    K-Means Clustering:

    - - -

    Give a collection M points in 2 dimensions, optimally classify them in K clusters using an iterative refinement algorithm, and output only the centroid of each cluster.

    -

    PART A: (for simplicity, we will use 2 dimensions, the real problems typically involve a larger number of dimensions). More concretely: create a chare array called Points of N chares, each with M/N data points. The constructors initialize each data point with random X and Y coordinates, (0 <= X,Y < 1.0). The main chare generates K random points as an initial guess for centroids of the K clusters, and broadcasts them (as an array of x-y pairs) to the Points chare array, to an entry method called Assign. This method decides, for each point it owns, which centroid it is closest to. It then contributes into 2 reductions: one a sum of points it added to each cluster (so an integer array of size K) and another a sum of X and Y coordinates for each cluster (so, an array of 2K doubles). The target of the reductions are the UpdateCounts and UpdateCoords methods in the main chare. When both reductions are complete the main chare updates the centroids of each cluster (simply calclulate, for each of the K clusters, the sum of X coordinates i’th cluster divided by the count of points assigned to i’th cluster, and similarly for Y.) The algorithm then repeats the Assign (via broadcast) and Update steps, until the assignment of points to cluster remains unchanged. We will approximate this by calculating (in the main chare) the changes to any centroid, and when no centroid coordinate changes beyond a small threshold T (say 0.001), we will assume the algorithm has converged.

    -

    Part B: Reduce the number of reductions in each iteration from 2 to 1. Hint: there are 2 ways of doing this: first involves approximating the counts to be double precision numbers and the second involves writing a custom reduction).

    -

    Part C: The “no change to centroids above a threshold” method above is an approximation. Implement a more accurate method by using an additional reduction of the number of points which have changed their “allegiance” (i.e. the cluster to which they belong in each iteration. If this number is 0, the algorithm has converged. Again, as in part B, reduce the number of reductions to just 1 if possible.

    -

    Part D: Change the random number generation so that you create K sets, with each set centered around a distinct coordinate (purported centroid), and see if your program is able to retrieve the clusters correctly. Use any method to restrict points around a centroid to within the 0.0:1.0 box, along each dimension.

    \ No newline at end of file diff --git a/content/exercises/liveViz.html b/content/exercises/liveViz.html deleted file mode 100644 index 3568061..0000000 --- a/content/exercises/liveViz.html +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: LiveViz Particle Exercise (Extension) -homec: home -tutorialc: tutorial -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - - - -

    LiveViz: Particle Exercise (Extension)

    - - - - -
    - - - -
    Figure 1
    - -

    For this exercise, continue by building upon your work for the previous exercise. Add colour to emphasise the skew and watch the balancer work.

    - -
      -
    1. - Extend each chare to contain particles of three different colors. Each color should move at different speeds - green should move at the default speed, red should move twice as fast and green should move half as fast. -
    2. - -
    3. - Distribute colours to reproduce the imbalance as shown in the figure: reds bunched in the centre, greens in the upper-left, blues in the lower-right. -
    4. - -
    5. - Download the LiveViz client from GitHub. During link time, use the -module liveViz flag. Note that LiveViz will not work with multicore charm builds. For additional instructions - refer to the documentation. -
    6. - -
    7. - Run your C++ code using ++server and ++server-port 1234, and then run the liveViz client using liveVize localhost 1234, and observe how the particles behave. -
    8. -
    diff --git a/content/exercises/loadbalancing.html b/content/exercises/loadbalancing.html deleted file mode 100644 index e7b70d7..0000000 --- a/content/exercises/loadbalancing.html +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Load Balancing Particle Exercise (Extension) -homec: home -tutorialc: tutorial -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - - - -

    Load Balancing: Particle Exercise (Extension)

    - -

    For this exercise, continue by building upon your work for the previous exercise. You will now work to create measurable imbalance so that load balancers have something meaningful to fix.

    - -
      -
    1. - Let m × m be the chare-array dimensions and k the baseline number of particles per chare. Update the number of particles per chare to be -N_{x,y} = k + \frac{k(x + y)}{m}. -
    2. - -
    3. - Build with tracing enabled using the -tracemode projections flag. -
    4. -
    5. - Install projections, and focus on the time profile view to see how the imbalance affects performance and efficiency. -
    6. -
    - -

    Variants: Instructors may choose to use a different formula for introducing imbalance

    \ No newline at end of file diff --git a/content/exercises/oddevensort.html b/content/exercises/oddevensort.html deleted file mode 100644 index 2f12364..0000000 --- a/content/exercises/oddevensort.html +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: Chare Arrays Odd-Even Sort Exercise -homec: home -tutorialc: tutorial -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - - -

    Chare Arrays: Odd-Even Sort Exercise

    - -

    A mainchare has a chare array of size N. Each chare in the array generates its own random number, with a unique seed. The array must be sorted in N steps, where at each step, each chare may communicate with at most one of its neighbors (i.e. on an 'odd' step adjacent chares are paired in one fashion, and on an 'even' step the pairing is switched). No barriers are allowed, and there is only one reduction, at the end, which checks that the elements have been properly sorted. No global synchronizations are allowed during iterations, the objective of the assignment is to learn to handle asynchrony.

    - -

    For example:

    -

    Even steps: 0--1 2--3 4--5 6--7

    -

    Odd steps: 0 1--2 3--4 5--6 7

    -

    N is a command line parameter.

    - -

    No SDAG is to be used.

    diff --git a/content/exercises/particle.html b/content/exercises/particle.html deleted file mode 100644 index ff77812..0000000 --- a/content/exercises/particle.html +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: Chare Arrays Particle Exercise -homec: home -tutorialc: tutorial -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - - -

    Chare Arrays: Particle Exercise

    - - - - - -
    - - - -
    - Figure 1 -
    - -

    Random Migrating Particles

    - -

    For this exercise, you will write code that simulates a set of particles moving - randomly in a 2-dimensional space within a bounding box. The coordinates of the - overall simulation box are between 0.0 and 100.0 along each dimension. The particles - are divided among chares based on their coordinates. The chares should be organized - in a 2-dimensional array of chares (using a chare array) of size k \times k. So, each - chare owns a bounding box of its own with size 100.0/k. The particles in each chare - can be stored as a vector.

    - -

    Your program should generate n particles per chare during construction with a - random (but valid, i.e. within the chare) position for particles. Your program - should accept the number of particles per cell n, and k as command line parameters - in that sequence.

    - -

    Expected Output: Your program should calculate and print to screen the maximum and - total number of particles every 10 iterations. Additionally, the simulation should - not be delayed by this calculation (i.e. you should use reductions).

    - -

    For testing your program, you can use 10000 (=n) particles per chare, simulated over 100 steps - and a chare array of size 16 \times 16 (k=16). Experiment with different number of particles and - chare array sizes.

    - -

    Note: There might be multiple particles having the same x and y coordinates, especially - if you increase the density of each cell. You do not need to handle this case separately; - it is a valid case assumption.

    - -
      -
    • The pseudocode for the overall algorithm is:
    • - for(iteration=0; iteration<ITERATION; iteration++){ -
        -
      • For each of the particles that belong to my chare: change its x and y coordinate by a small random amount. - If this change causes the particle to move to an invalid coordinate, keep the particle in its original position.
      • -
      • Move all the particles that do not belong to a chare's bounding box to their correct homes. - Since the movement is small, this will mean communication to the eight near neighbor chares. Some of these messages may contain no particles. - For both efficiency and ease of implementation, all communication with neighbor chares should happen at the end of an iteration rather than after each particle.
      • -
      • if(iteration%10 == 0)
      • -
          -
        • Do reductions to calculate average and max number of particles
        • -
        -
      - } -
    - -

    Instructor's Note: This exercise can be implemented in several ways, feel free to choose from the variations below or create your own based on your learning objectives:

    -
      -
    • Choose to move the particle along either the x or y axis using an additional random variable, which simplifies communication as there are now only four neighbor chares.
    • -
    • If a movement causes a particle to move to an invalid coordinate, move in the opposite direction instead.
    • -
    \ No newline at end of file diff --git a/content/exercises/primality.html b/content/exercises/primality.html deleted file mode 100644 index 7aa2298..0000000 --- a/content/exercises/primality.html +++ /dev/null @@ -1,90 +0,0 @@ ---- -title: Basic Chares Primality Testing Exercise -homec: home -tutorialc: tutorial -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - - -

    Basic Chares: Primality Testing Exercise

    -
    (testing with a chare for each number being tested)
    - -

    Part A

    -

    Write a program based on the outline below. -(Note that the program has a few artificial restrictions/elements that -are meant to teach you specific concepts. So, please follow the -instructions to the letter.)

    - -

    The main chare generates K random integers, and fires a -checkPrimality chare for each. -The chare checks if the number given to it is a prime using a variant of the function -below, and returns the result to the main chare. The main chare -maintains an array of pairs: <number, Boolean>, and prints it at the -end. An entry should be added to this array (with the number being tested, and a -default value such as "False") as soon as the chare is fired. In -particular, you are not allowed to delay adding the entry after the -result is returned by the chare. -Make sure that your program does not search the array when a response -comes. So, figure out a bookkeeping scheme to avoid it.

    - -

    Obtain K from a command line argument. You may use rand() from -the math library for generating random integers.

    - -

    For testing primality, use the following function. For extra credit, -modify it so that it is not -testing for every i, but (a) avoids testing even numbers except 2 and -(b) don’t let the loop run all the way to “number-1”).

    - -

    - -int isPrime(const long number)
    -{
    -  if(number<=1) return 0;
    -  for(int i=2; i<number; i++)
    -  {
    -                if(0 == number%i)
    -                  return 0;
    -  }
    -  return 1;
    -}
    -
    -

    - - - -

    Part B (grainsize control)

    - -

    Measuring performance and improving it via grainsize control:

    - -

    Grainsize control -is a way to improve performance of the above program. -Use information from the Charm++ manual about how to pass -arrays of data to entry methods, and send a bunch (M) of numbers to be -tested to each -new Chare, and experiment with different values of M to get good -performance. -You may wish to read M as a command line parameter, for ease of experimentation. -Measure -performance by adding two calls to CkTimer() in the main chare, one -just before -starting creation of checkPrimality chares, and the other after all -the results have been returned (but before they are printed), and -printing the difference between the timers. You may -omit (and probably should omit) printing primality results for performance runs. -Vary M and report smallest M for -which performance was within 5% infinite grainsize (i.e. $M == K$). -Again, make sure our artificial restriction is obeyed: do not send -back the numbers the number being tested (because you are not allowed -to search for it anyway).

    - -

    Part C:

    -

    Let the numbers being tested be 64 bit random numbers. For simplicity, -generate them by concatenating 2 32 bit random numbers.

    \ No newline at end of file diff --git a/content/exercises/projections.html b/content/exercises/projections.html deleted file mode 100644 index 2e005a6..0000000 --- a/content/exercises/projections.html +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Projections Particle Exercise (Extension) -homec: home -tutorialc: tutorial -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - - - -

    Projections: Particle Exercise (Extension)

    - -

    For this exercise, continue by building upon your work for the previous exercise. You will now work to enable dynamic migration so Charm++ balancers can actually move work around.

    - -
      -
    1. - Implement PUP serialization for your chare array as documented. -
    2. -
    3. - At appropriate intervals, call AtSync() so the runtime knows the chare is ready for potential migration. -
    4. -
    5. - Select a load-balancing strategy. For this exercise we will use - GreedyRefineLB (use option -balancer GreedyRefineLB). -
    6. - -
    7. - Re-run the application as in Part 1 and compare how the program behaves differently. -
    8. -
    diff --git a/content/getting_started.html b/content/getting_started.html deleted file mode 100644 index 83af05b..0000000 --- a/content/getting_started.html +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: Applications -homec: home -tutorialc: tutorial -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - -
    -

    Getting Started with Charm++

    -
      -
    1. - First, get a copy of Charm++ from the download page. - If you want to do development on Charm++ itself, you may want to clone our - git repository at http://charm.cs.illinois.edu/gerrit/charm.git to make it - easier to contribute patches and merge your work with the latest version of - Charm. -
    2. - -
    3. - Next, you need to compile Charm++ on your system. You'll need basic Unix - build utilities like make and a C++ compiler. Charm++ provides a script - called 'build' in its top-level directory that will build Charm++ for you, - given some information about the system you're compiling for and the - features you want access to. The README file in Charm++'s top-level directory - gives details about the various options you have available to you when - compiling Charm++. -
    4. - -
    5. - Now it's time to get started building and running Charm++ programs. To get - started, you may want to look at the many examples in the examples - directory of Charm++. More information about compiling and running - applications is available in the - installation and usage guide. For more in-depth information about - the features of Charm++, consult the - Charm++ Parallel Programming System Manual. -
    6. -
    -
    diff --git a/content/help.html b/content/help.html deleted file mode 100644 index 800be3f..0000000 --- a/content/help.html +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: Help -homec: home -tutorialc: tutorial -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help selected helpSelected ---- - -
    -If you need further help, please send an email to charm mailing list or contact us by other means. -
    -
    -
      -
    • Parallel Programming Lab [html]
    • -
    • Charm++ FAQ - [html] -
    • -
    • Charm++ Tutorial [html]
    • -
    • Recent Commit Activity [html]
    • -
    • Nightly Regression Tests [html]
    • -
    • Manuals -
        -
      • Charm++ -
          -
        • - Charm++ Language - [html] -
        • -
        • - Adaptive MPI (AMPI) - [html] -
        • -
        • - Installation and Usage - [html] -
        • -
        • - Fortran 90 Bindings for Charm++ - [html] -
        • -
        • - Charm++ and Converse Libraries - [html] -
        • -
        -
      • -
      • Tools: - -
      • -
      -
    - - diff --git a/content/history.html b/content/history.html deleted file mode 100644 index ccd01af..0000000 --- a/content/history.html +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: History ---- - -

    History

    - -The Charm software was developed as a group effort of the Parallel Programming -Laboratory at the University of Illinois at Urbana-Champaign. Researchers at -the Parallel Programming Laboratory keep Charm++ updated for the new machines, -new programming paradigms, and for supporting and simplifying development of -emerging applications for parallel processing. The earliest prototype, Chare -Kernel(1.0), was developed in the late eighties. It consisted only of basic -remote method invocation constructs available as a library. The second -prototype, Chare Kernel(2.0), a complete re-write with major design changes. -This included C language extensions to denote Chares, messages and -asynchronous remote method invocation. Charm(3.0) improved on this syntax, and -contained important features such as information sharing abstractions, and -chare groups (called Branch Office Chares). Charm(4.0) included Charm++ and -was released in fall 1993. Charm++ in its initial version consisted of -syntactic changes to C++ and employed a special translator that parsed the -entire C++ code while translating the syntactic extensions. Charm(4.5) had a -major change that resulted from a significant shift in the research agenda of -the Parallel Programming Laboratory. The message-driven runtime system code of -the Charm++ was separated from the actual language implementation, resulting -in an interoperable parallel runtime system called Converse. The Charm++ -runtime system was retargetted on top of Converse, and popular programming -paradigms such as MPI and PVM were also implemented on Converse. This allowed -interoperability between these paradigms and Charm++. This release also -eliminated the full-fledged Charm++ translator by replacing syntactic -extensions to C++ with C++ macros, and instead contained a small language and -a translator for describing the interfaces of Charm++ entities to the runtime -system. This version of Charm++, which, in earlier releases was known as -Interface Translator Charm++, is the default version of Charm++ now, and hence -referred simply as Charm++. In early 1999, the runtime system of Charm++ was -rewritten in C++. Several new features were added. The interface language -underwent significant changes, and the macros that replaced the syntactic -extensions in original Charm++, were replaced by natural C++ constructs. Late -1999, and early 2000 reflected several additions to Charm++, when a load -balancing framework and migratable objects were added to Charm++. diff --git a/content/index.html b/content/index.html deleted file mode 100644 index 0b975a0..0000000 --- a/content/index.html +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: Parallel Programming Framework -homec: home selected homeSelected -tutorialc: tutorial -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - - - -
    -

    Charm++ is a parallel programming framework in C++ supported by - an adaptive runtime system, which enhances user productivity and allows - programs to run portably from small multicore computers (your laptop) to - the largest supercomputers.

    - -

    It enables users to easily expose and express much of the parallelism - in their algorithms while automating many of the requirements for high - performance and scalability. It permits writing parallel programs in - units that are natural to the domain, without having to deal with - processors and threads.

    - -

    Charm++ has been in production use for over 15 years in the - scientific and high performance computing communities and currently has - thousands of users in dozens of countries across a wide variety of - computing disciplines. It has been adopted by many computing teams, and - has been used to produce several large parallel applications. It is - actively developed, maintained, and supported by the - Parallel Programming Laboratory at - UIUC and its collaborators.

    - - -
    -
      -
    • -

      environments

      -
        -
      • x86 (workstations, laptops, etc.)
      • -
      • ARM7/8
      • -
      • Cray XC30/40, XE6, XK6/7
      • -
      • IBM BlueGene Q
      • -
      • IBM POWER8/9
      • -
      • Beowulf clusters
      • -
      • Linux, Mac, Windows
      • -
      -
    • -
    • -

      network interfaces

      -
        -
      • TCP, UDP
      • -
      • Infiniband verbs
      • -
      • MPI
      • -
      • OFI
      • -
      • PAMI (IBM BlueGene Q and POWER)
      • -
      • uGNI (Cray Gemini and Aries)
      • -
      • Shared Memory
      • -
      -
    • -
    • -

      compilers

      -
        -
      • clang
      • -
      • cray
      • -
      • fujitsu
      • -
      • gcc
      • -
      • ibm
      • -
      • intel
      • -
      • microsoft
      • -
      • portland group
      • -
      -
    • -
    diff --git a/content/othermedia.html b/content/othermedia.html deleted file mode 100644 index be68147..0000000 --- a/content/othermedia.html +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Other Learning Material -homec: home -tutorialc: tutorial selected tutorialSelected -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- -

    Charm++ Workshops:

    - -
  • Hybrid Tutorial 2023
  • -
  • 19th Workshop 2021
  • -
  • 18th Workshop 2020
  • -
  • 17th Workshop 2019
  • -
  • 16th Workshop 2018
  • -
  • 15th Workshop 2017
  • -
  • 14th Workshop 2016
  • -
  • 13th Workshop 2015
  • -
  • 12th Workshop 2014
  • -
  • 11th Workshop 2013
  • -
  • 10th Workshop 2012
  • -
  • 9th Workshop 2011
  • -
  • 8th Workshop 2010
  • -
  • 7th Workshop 2009
  • -
  • 6th Workshop 2008
  • -
  • 5th Workshop 2007
  • -
  • 4th Workshop 2005
  • -
  • 3rd Workshop 2004
  • -
  • 2nd Workshop 2003
  • -
  • 1st Workshop 2002
  • -
    - -

    -Charm++ Workshop Introduction video. -For more tutorial material, slides and readings refer here. -

    diff --git a/content/ppt_pdfs/tutorial_2023/01_a_CharmModel2023.pptx b/content/ppt_pdfs/tutorial_2023/01_a_CharmModel2023.pptx deleted file mode 100644 index 6369e15..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/01_a_CharmModel2023.pptx and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/01_a_CharmModel2023PDF.pdf b/content/ppt_pdfs/tutorial_2023/01_a_CharmModel2023PDF.pdf deleted file mode 100644 index 52e923b..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/01_a_CharmModel2023PDF.pdf and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/01_b_Grainsize_2023.pptx b/content/ppt_pdfs/tutorial_2023/01_b_Grainsize_2023.pptx deleted file mode 100644 index b6e2ac9..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/01_b_Grainsize_2023.pptx and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/01_b_Grainsize_2023PDF.pdf b/content/ppt_pdfs/tutorial_2023/01_b_Grainsize_2023PDF.pdf deleted file mode 100644 index eea744b..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/01_b_Grainsize_2023PDF.pdf and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/01_c_SomeBenefits.pptx b/content/ppt_pdfs/tutorial_2023/01_c_SomeBenefits.pptx deleted file mode 100644 index 7af457c..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/01_c_SomeBenefits.pptx and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/01_c_SomeBenefitsPDF.pdf b/content/ppt_pdfs/tutorial_2023/01_c_SomeBenefitsPDF.pdf deleted file mode 100644 index 34035a5..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/01_c_SomeBenefitsPDF.pdf and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/02_a_HelloWorld.pptx b/content/ppt_pdfs/tutorial_2023/02_a_HelloWorld.pptx deleted file mode 100644 index 3abf699..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/02_a_HelloWorld.pptx and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/02_a_HelloWorldPDF.pdf b/content/ppt_pdfs/tutorial_2023/02_a_HelloWorldPDF.pdf deleted file mode 100644 index 4c70aa0..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/02_a_HelloWorldPDF.pdf and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/02_b_CharmInterface.pptx b/content/ppt_pdfs/tutorial_2023/02_b_CharmInterface.pptx deleted file mode 100644 index e197a4e..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/02_b_CharmInterface.pptx and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/02_b_CharmInterfacePDF.pdf b/content/ppt_pdfs/tutorial_2023/02_b_CharmInterfacePDF.pdf deleted file mode 100644 index 8218f8b..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/02_b_CharmInterfacePDF.pdf and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/02_c_AsynchronousMethods.pptx b/content/ppt_pdfs/tutorial_2023/02_c_AsynchronousMethods.pptx deleted file mode 100644 index 4be5bd2..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/02_c_AsynchronousMethods.pptx and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/02_c_AsynchronousMethodsPDF.pdf b/content/ppt_pdfs/tutorial_2023/02_c_AsynchronousMethodsPDF.pdf deleted file mode 100644 index cb9c5d9..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/02_c_AsynchronousMethodsPDF.pdf and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/04_a_ChareArrays.pptx b/content/ppt_pdfs/tutorial_2023/04_a_ChareArrays.pptx deleted file mode 100644 index 294a4af..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/04_a_ChareArrays.pptx and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/04_a_ChareArraysPDF.pdf b/content/ppt_pdfs/tutorial_2023/04_a_ChareArraysPDF.pdf deleted file mode 100644 index 812658b..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/04_a_ChareArraysPDF.pdf and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/04_b_RuntimeBroadcastReduction.pptx b/content/ppt_pdfs/tutorial_2023/04_b_RuntimeBroadcastReduction.pptx deleted file mode 100644 index 6298904..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/04_b_RuntimeBroadcastReduction.pptx and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/04_b_RuntimeBroadcastReductionPDF.pdf b/content/ppt_pdfs/tutorial_2023/04_b_RuntimeBroadcastReductionPDF.pdf deleted file mode 100644 index ed3b548..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/04_b_RuntimeBroadcastReductionPDF.pdf and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/06_a_LoadBalancing.pptx b/content/ppt_pdfs/tutorial_2023/06_a_LoadBalancing.pptx deleted file mode 100644 index 8bc7e45..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/06_a_LoadBalancing.pptx and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/06_a_LoadBalancingPDF.pdf b/content/ppt_pdfs/tutorial_2023/06_a_LoadBalancingPDF.pdf deleted file mode 100644 index 650b654..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/06_a_LoadBalancingPDF.pdf and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/06_b_PUP.pptx b/content/ppt_pdfs/tutorial_2023/06_b_PUP.pptx deleted file mode 100644 index 0146e5c..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/06_b_PUP.pptx and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/06_b_PUPPDF.pdf b/content/ppt_pdfs/tutorial_2023/06_b_PUPPDF.pdf deleted file mode 100644 index d33f587..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/06_b_PUPPDF.pdf and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/06_c_FaultTolerance.pptx b/content/ppt_pdfs/tutorial_2023/06_c_FaultTolerance.pptx deleted file mode 100644 index 98a02cf..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/06_c_FaultTolerance.pptx and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/06_c_FaultTolerancePDF.pdf b/content/ppt_pdfs/tutorial_2023/06_c_FaultTolerancePDF.pdf deleted file mode 100644 index 9ec6c4a..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/06_c_FaultTolerancePDF.pdf and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/08_a_sdag.pptx b/content/ppt_pdfs/tutorial_2023/08_a_sdag.pptx deleted file mode 100644 index dc1ee07..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/08_a_sdag.pptx and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/08_a_sdagPDF.pdf b/content/ppt_pdfs/tutorial_2023/08_a_sdagPDF.pdf deleted file mode 100644 index 926ee3a..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/08_a_sdagPDF.pdf and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/08_b_ParallelPrefixFixed.pptx b/content/ppt_pdfs/tutorial_2023/08_b_ParallelPrefixFixed.pptx deleted file mode 100644 index f9a0cea..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/08_b_ParallelPrefixFixed.pptx and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/08_b_ParallelPrefixFixedPDF.pdf b/content/ppt_pdfs/tutorial_2023/08_b_ParallelPrefixFixedPDF.pdf deleted file mode 100644 index 14af1ac..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/08_b_ParallelPrefixFixedPDF.pdf and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/09_advanced.pptx b/content/ppt_pdfs/tutorial_2023/09_advanced.pptx deleted file mode 100644 index 8acd600..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/09_advanced.pptx and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/09_advancedPDF.pdf b/content/ppt_pdfs/tutorial_2023/09_advancedPDF.pdf deleted file mode 100644 index 315058f..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/09_advancedPDF.pdf and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/09xy_sections.pptx b/content/ppt_pdfs/tutorial_2023/09xy_sections.pptx deleted file mode 100644 index acf50bf..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/09xy_sections.pptx and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/09xy_sectionsPDF.pdf b/content/ppt_pdfs/tutorial_2023/09xy_sectionsPDF.pdf deleted file mode 100644 index d95c03a..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/09xy_sectionsPDF.pdf and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/10_appDesign_2023.pptx b/content/ppt_pdfs/tutorial_2023/10_appDesign_2023.pptx deleted file mode 100644 index 790bdea..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/10_appDesign_2023.pptx and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/10_appDesign_2023PDF.pdf b/content/ppt_pdfs/tutorial_2023/10_appDesign_2023PDF.pdf deleted file mode 100644 index 1790cca..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/10_appDesign_2023PDF.pdf and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/11_threadedMethods.pptx b/content/ppt_pdfs/tutorial_2023/11_threadedMethods.pptx deleted file mode 100644 index d3babac..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/11_threadedMethods.pptx and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/11_threadedMethodsPDF.pdf b/content/ppt_pdfs/tutorial_2023/11_threadedMethodsPDF.pdf deleted file mode 100644 index 01d3df2..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/11_threadedMethodsPDF.pdf and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/13_a1_LibsAndModules.pptx b/content/ppt_pdfs/tutorial_2023/13_a1_LibsAndModules.pptx deleted file mode 100644 index b33aa86..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/13_a1_LibsAndModules.pptx and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/13_a1_LibsAndModulesPDF.pdf b/content/ppt_pdfs/tutorial_2023/13_a1_LibsAndModulesPDF.pdf deleted file mode 100644 index 1548507..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/13_a1_LibsAndModulesPDF.pdf and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/13_a2_prefixAsLib.pptx b/content/ppt_pdfs/tutorial_2023/13_a2_prefixAsLib.pptx deleted file mode 100644 index 208a8c2..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/13_a2_prefixAsLib.pptx and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/13_a2_prefixAsLibPDF.pdf b/content/ppt_pdfs/tutorial_2023/13_a2_prefixAsLibPDF.pdf deleted file mode 100644 index e8e1288..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/13_a2_prefixAsLibPDF.pdf and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/Projections.pptx b/content/ppt_pdfs/tutorial_2023/Projections.pptx deleted file mode 100644 index d077f19..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/Projections.pptx and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/ProjectionsPDF.pdf b/content/ppt_pdfs/tutorial_2023/ProjectionsPDF.pdf deleted file mode 100644 index 0b45224..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/ProjectionsPDF.pdf and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/charm4py.pptx b/content/ppt_pdfs/tutorial_2023/charm4py.pptx deleted file mode 100644 index cae8c9a..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/charm4py.pptx and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/charm4pyPDF.pdf b/content/ppt_pdfs/tutorial_2023/charm4pyPDF.pdf deleted file mode 100644 index 8e6b855..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/charm4pyPDF.pdf and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/examplesMedianQDhistoSort.pptx b/content/ppt_pdfs/tutorial_2023/examplesMedianQDhistoSort.pptx deleted file mode 100644 index 7dd1c1e..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/examplesMedianQDhistoSort.pptx and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/examplesMedianQDhistoSortPDF.pdf b/content/ppt_pdfs/tutorial_2023/examplesMedianQDhistoSortPDF.pdf deleted file mode 100644 index 1654da3..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/examplesMedianQDhistoSortPDF.pdf and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/usingGpgpusInCharm.pptx b/content/ppt_pdfs/tutorial_2023/usingGpgpusInCharm.pptx deleted file mode 100644 index 7f75a9a..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/usingGpgpusInCharm.pptx and /dev/null differ diff --git a/content/ppt_pdfs/tutorial_2023/usingGpgpusInCharmPDF.pdf b/content/ppt_pdfs/tutorial_2023/usingGpgpusInCharmPDF.pdf deleted file mode 100644 index 39615e5..0000000 Binary files a/content/ppt_pdfs/tutorial_2023/usingGpgpusInCharmPDF.pdf and /dev/null differ diff --git a/content/progmodel.html b/content/progmodel.html deleted file mode 100644 index 5025ca5..0000000 --- a/content/progmodel.html +++ /dev/null @@ -1,70 +0,0 @@ ---- -title: Programming Model ---- - -

    Programming Model

    - -

    Object-based program design

    -
      -
    • Express algorithms and program designs using objects
    • -
    • Decompose computation into interacting object collections
    • -
    • Write native C++ code
    • -
    • Use all C++ capabilities (OO, generics etc)
    • -
    - -

    Globally addressable objects

    -
      -
    • Some classes are elevated into global visibility
    • -
    • Objects of these classes can be addressed from any processor
    • -
    • Parallel control flow primarily involves these globally visible objects
    • -
    - -

    Globally invocable methods

    -
      -
    • Some methods of globally visible classes are also elevated into global visibility
    • -
    • Only these methods of a globally visible object can be invoked from any processor
    • -
    - -

    Asynchronous methods

    -
      -
    • Objects in computation interact using method invocations
    • -
    • Do not return any data
    • -
    • Method invocation does not block
    • -
    • No promise of immediate execution
    • -
    - -

    Object collections

    -
      -
    • Collections of objects of a given type can be created, managed and addressed collectively
    • -
    • Collections are indexed
    • -
    • Each object in collection is globally visible. can be addressed via the tuple of collection handle and object index.
    • -
    • Method invocations on such collections are implicit broadcasts to all objects
    • -
    - -
    - -
    Figure: User view and system view in Charm++
    -
    - -

    Object placement

    -
      -
    • Easily control placement of objects on processors
    • -
    - -

    Migratable / serializable objects

    -
      -
    • Objects can be migrated
    • -
    • Any data in program can be migrated
    • -
    • Simply needs a serialization function
    • -
    - -

    Decompose data across object collection

    -
      -
    • Typical data decomposition is by decomposing the data across multiple objects of a single class
    • -
    • Massively parallel computations on each portion of the data can be performed by simply invoking methods on the whole collection
    • -
    - -

    Decompose data manipulation across methods

    - -

    Easily task parallelism

    - diff --git a/content/release.html b/content/release.html deleted file mode 100644 index a72977f..0000000 --- a/content/release.html +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Release Info ---- - -

    Release Information

    - - diff --git a/content/tools.html b/content/tools.html deleted file mode 100644 index 25928a0..0000000 --- a/content/tools.html +++ /dev/null @@ -1,91 +0,0 @@ ---- -title: Tools -homec: home -tutorialc: tutorial -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools selected toolsSelected -helpc: help ---- -
    -

    Tools

    -
    -
    -

    Parallel Performance Analysis: Projections

    -
    -
    - Projections is a performance analysis/visualization framework that helps you understand and investigate performance-related problems in your parallel (CHARM++) application. It is a framework with an event tracing component with features that allow you to control the amount of information generated and to a lesser degree the amount of perturbation the tracing activities introduce into the application. It also has a Java-based visualization and analysis component with various views that will help present the performance information in a visually useful manner. The research page can be found here. -
    - - -
    - - The above two figures show the timeline and time-profile view in Projections. In the timeline view, user can see the messages between processors. In the time-profile view, user can observe the usage of the application as time goes by. -
    -
    -
    -
    -
    -

    The latest development version of Projections can be downloaded directly from our source archive. The Git version control system is used, which is available from here.

    -
      -
    1. -

      Check out Projections from the repository:

      -
      git clone https://github.com/UIUC-PPL/projections
      -
    2. -
    3. -

      This will create a directory named projections. Move to this directory:

      -
      cd projections
      -
    4. -
    5. -

      And now build Projections:

      -
      make
      -
    6. -
    -
    -
    -
    - The manual can be found here. -
    -
    - -
    -
    -

    Parallel Debugging: Charm Debug

    -
    -
    Charm++ offers a variety of parallel debugging options, from the extremely basic to the extremely sophisticated. The traditional debugging methods, such as logging (via the CkPrintf routine) and interactive debugging (via the "++debug" command line option) are supported under Charm++. -
    -
    - In addition, Charm++ offers several additional features designed to simplify application development. Linking with "-memory paranoid" checks all dynamic heap allocation calls for common errors, such as double-delete, random-delete, read-after-delete, buffer over- and under-write errors. Charm++, when compiled without "-DCMK_OPTIMIZE", contains hundreds of assertions to catch invalid parameters and uninitialized data passed to API routines. -
    -
    - Charm Debug is a sophisticated parallel debugger, with the ability to - set breakpoints, examine variables, objects, and messages across the - entire machine. The design of this debugger is described in the research page. -
    -
    -
    - -
    -

    The latest development version of Charm Debug can be downloaded directly from our source archive. The Git version control system is used, which is available from here.

    -
      -
    1. -

      Check out Charm Debug from the repository:

      -
      git clone https://github.com/UIUC-PPL/ccs_tools
      -
    2. -
    3. -

      This will create a directory named ccs_tools. Move to this directory:

      -
      cd ccs_tools
      -
    4. -
    5. -

      And now build Charm Debug:

      -
      ant
      -
    6. -
    -
    -
    -
    - The manual can be found here. -
    -
    -
    diff --git a/content/tutorial/ArrayMapping.html b/content/tutorial/ArrayMapping.html deleted file mode 100644 index 6224aa9..0000000 --- a/content/tutorial/ArrayMapping.html +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: Tutorial -homec: home -tutorialc: tutorial selected tutorialSelected -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - - -

    Mapping Chare Array Elements to Physical Processors

    - -

    - For various reasons (performance, etc.) the programmer may wish to control where the initial chare - array elements in a chare array reside (that is, on which physical processor they are located). There - are multiple methods the programmer can use to control the initial placement of chare array elements - in a chare array on the physical processors. -

    - - -

    Inserting Individual Chare Array Elements

    - -

    - The most direct method of controlling which processors the chare array elements are located on - initially is to explicitly create the chare array element one-by-one, specifying with processor - it should be located on during creation. This can be done by creating the chare array with a - call to myArrayProxy = CProxy_myArrayClass::CkNew() with no arguments (or the number of elements set to zero - if a CkArrayOptions object is used). Once the chare array has been created, individual chare - array elements can be inserted by using the myArrayProxy[i].insert(pe) function call where i - is the index of the chare array element to create and pe is the processor number on which the - chare array element should be created on. Once all chare array elements have been added to the array, - the myArrayProxy::doneInserting() call must be called to indicate to the Charm++ Runtime System - that the initial elements of the chare array have been added. Additional chare array elements can be - added at a later time followed by an additional call to myArrayProxy::doneInserting(). -

    - - -

    Using the CkArrayMap Class

    - -

    - Chare arrays also have an associated CkArrayMap class which maps indexes in the arrays - to specific processors. By default, a round-robin (RRMap) map object is used. - When the chare array is being created, the programmer can specify which map object the array - should use via a call to CkArrayOptions::setMap(). For example, instead of round-robin, - the programmer might use the BlockMap map class to have the objects mapped in a blocked - scheme. -

    - -

    - The programmer may create their own map object to be used for a chare array. Simply create a - child class of the CkArrayMap class. The important member functions are outlined below. Then, - create an instance of the class and associate the map object with the chare array (via CkArrayOptions) - during array creation time. -

    - -

    - CkArrayMap::populateInitial(): This function is responsible for creating all of the - initial array elements located on the physical processor. That is, it is called on every processor - and makes a call to the chare array manager's insertInitial() function for each of the chare - array elements local to that processor (triggering the creation of the actual chare array elements on - the physical processor). This is a virtual function; the child class can provide - its own implementation of this function. However, one is provided by CkArrayMap itself which - simply uses the CkArrayMap::procNum() function to decide where the chare array elements - initially reside. -

    - -

    - CkArrayMap::procNum(): This function simply maps an array index (input) to the number - of the physical processor (output). For example, the round-robin map class's (RRMap) version - of this function simply returns 'index % CkNumPes()'. This function is a pure virtual member - function. The child class must provide an implementation of this function. -

    - -

    - CkArrayMap::homePe(): This function is similar to the procNum() function, however, the value - returned indicates which physical processor is the home processor for the chare array element. - This is a virtual function, the child class can provide its own implementation of this function. However, - one is provided by CkArrayMap itself which simply returns the same value that procNum() returns. -

    \ No newline at end of file diff --git a/content/tutorial/ArraySections.html b/content/tutorial/ArraySections.html deleted file mode 100644 index 4f37aab..0000000 --- a/content/tutorial/ArraySections.html +++ /dev/null @@ -1,135 +0,0 @@ ---- -title: Tutorial -homec: home -tutorialc: tutorial selected tutorialSelected -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - - - -

    Array Sections

    - -

    - Sometimes only certain elements of a chare array need to have messages sent to them (i.e. their entry - methods invoked). Furthermore, sometimes the same subset of chares in the chare array may need to - have this occur many times throughout the course of the application execution. - Array sections are a way of specifying a arbitrary subset of elements in a chare array. Once the - array section has been defined, it can be used to multicast a message to the members of the chare - array subset. -

    - - -

    Defining and Using Chare Array Sections

    - -

    - The first way of creating array sections is to specify a triplet of numbers to the constructor of the - array section proxy's constructor. The triplet contains three values: the starting index, the ending - index, and a stride. One triplet can be given for each dimension of the array. For example, consider - a 1D chare array. To create array sections, one containing all of the even numbered indexes (including - index 0) and one containing all the odd numbered indexes, the following code could be used. -

    - -
    - - - - - - - - -
    - - // Create a chare array
    - int arrayLength = ...;
    - CProxy_myArrayClass arrayProxy = CProxy_myArrayClass::ckNew(arrayLength);
    -
    - // Create the array section proxies
    - CProxySection_myArrayClass arraySectionProxy_even =
    -   CProxySection_myArrayClass::ckNew(arrayProxy, 0, arrayLength - 1, 2);
    - CProxySection_myArrayClass arraySectionProxy_odd =
    -   CProxySection_myArrayClass::ckNew(arrayProxy, 1, arrayLength - 1, 2);
    -
    - // Invoked entry methods on all of the members of the array sections of myArray
    - arraySectionProxy_even.myEntryMethod(...); // Invoke myEntryMethod() on the even members
    - arraySectionProxy_odd.myEntryMethod1(...); // Invoke myEntryMethod1() on the odd members
    -
    -
    - Figure 1: Code to create even and odd array sections for a 1D chare array -
    -
    - -

    - While the triplet method is a quick and easy way of quickly defining large subsets of chare array elements, - the subsets need to be regular. This is not always sufficient to identify useful subsets. Another method - of defining a subset of elements is to create a vector of indexes and then create the array section using - the vector of indexes. For example, the following code will also create an array section containing all of - the odd index elements in the chare array, however, it will do it by creating a vector with all the odd - indexes. -

    - -
    - - - - - - - - -
    - - // Create a chare array
    - int arrayLength = ...;
    - CProxy_myArrayClass arrayProxy = CProxy_myArrayClass::ckNew(arrayLength);
    -
    - // Create the vector of odd indexes
    - CkVec<CkArrayIndex1D> indexVector;
    - for (int i = 0; i < arrayLength; i++)
    -   if (i % 2 == 1) // If an odd index, add it to the vector
    -     indexVector.push_back(CkArrayIndex1D(i));
    -
    - // Create the array section from the vector of indexes
    - CProxySection_myArrayClass arraySectionProxy_odd =
    -   CProxySection_myArrayClass::ckNew(arrayProxy, indexVector.getVec(), indexVector.size());
    -
    - // Invoke myEntryMethod1() on all of the odd members of myArray
    - arraySectionProxy_odd.myEntryMethod1(...);
    -
    -
    - Figure 2: Code to create an odd array section for a 1D chare array using a vector of indexes -
    -
    - - - - - -
    - - - -
    - Figure 3: Indexing scheme for array proxies and array section proxies -
    - -

    Indexing for Individual Elements of Array Sections

    - -

    - The individual elements in the array section can be index individually. Starting with index zero, each - member of the subset of elements (i.e. the array section members) can be individually indexed according - to the scheme presented in Figure 3. -

    - - -

    More Information

    - -

    - For more information on callbacks, please see - Section 3.8.13: Array Section of the - The Charm++ Programming Language Manual -

    diff --git a/content/tutorial/BasicsOfCharmProgramming.html b/content/tutorial/BasicsOfCharmProgramming.html deleted file mode 100644 index 2c9cde0..0000000 --- a/content/tutorial/BasicsOfCharmProgramming.html +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Tutorial -homec: home -tutorialc: tutorial selected tutorialSelected -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - - - -

    Basics of Charm++ Programming

    - -

    - Throughout this section, we will be using a simple Hello World program to demonstrate - the ideas presented. -

    - - -

    Components of a Charm++ Program

    -
    - - -

    Basic "Hello World" Program (single processor, single chare)

    -
    - - -

    Array "Hello World": A Slightly More Advanced "Hello World" Program (multiple processors, multiple chares)

    -
    - - -

    Broadcast "Hello World": A Parallel "Hello World" Program (multiple processors, multiple chares)

    -
    - \ No newline at end of file diff --git a/content/tutorial/BroadcastHelloWorld.html b/content/tutorial/BroadcastHelloWorld.html deleted file mode 100644 index 31a7651..0000000 --- a/content/tutorial/BroadcastHelloWorld.html +++ /dev/null @@ -1,456 +0,0 @@ ---- -title: Tutorial -homec: home -tutorialc: tutorial selected tutorialSelected -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - - - -

    Broadcast "Hello World" Program: A Parallel "Hello World" Program

    - - - - - - -
    - -
    - Figure: Control Flow of the Broadcast "Hello World" Program -
    -
    - -

    - This version of "Hello World" is basically the same as the Array "Hello World" program - except that all of the Hello chare objects will be told to say "Hello" at the same time - instead of each of them doing it one-by-one. The figure to the right shows the control - flow of the program. The source code is located below. Here are the differences from - the Array "Hello World" program: -

    - -
      -
    • - broadcast: In the Array "Hello World" program, the last thing the Main::Main() - constructor did was tell the first element of the helloArray to sayHi(). - In this version of "Hello World," Main::Main tells the entire array of Hello chare - objects to sayHi(). This is done by calling Hello::sayHi() on the array - itself (instead of just a single element of the array). -
    • - sayHi(): The Hello::sayHi() entry method no longer has the if statement that - tests if the object is the last object in the chare array. Instead, every element of the - chare arrays invokes done() on the Main chare object (sends a message). -
    • - done(): The Main::done() entry method is now invoked multiple times. The - Main chare object has a counter, doneCount, that counts the number of times - Main::done() has been called. Once this count reaches the number of elements in - the Hello chare array, the program exits. -
    • - numElements: Since the Main chare object is the only object that needs access - to the numElements value, it has been made into a member variable of the Main chare class. -
    - -
    - - -

    Broadcast "Hello World" Code

    - -

    - The source code for this example can be found - here (BroadcastHelloWorld.tar.gz). -

    - - -

    The "Hello" Chare Class

    - - -
    - - - - - - - - -
    - - - - - - - - - -
    Header File (hello.h)
    -
    - - #ifndef __HELLO_H__
    - #define __HELLO_H__
    -
    - class Hello : public CBase_Hello {
    -
    -  public:
    -
    -   /// Constructors ///
    -   Hello();
    -   Hello(CkMigrateMessage *msg);
    -
    -   /// Entry Methods ///
    -   void sayHi(int from);
    - };
    -
    - #endif //__HELLO_H__ -
    -
    -
    - - - - - - - - - -
    Interface File (hello.ci)
    -
    - - module hello {
    -
    -   array [1D] Hello {
    -     entry Hello();
    -     entry void sayHi(int);
    -   };
    -
    - }; -
    -
    -
    - -
    - - - - - - - - - -
    Source File (hello.C)
    -
    - - #include "hello.decl.h"
    -
    - #include "hello.h"
    - #include "main.decl.h"
    -
    - extern /* readonly */ CProxy_Main mainProxy;
    -
    - Hello::Hello() {
    - -   // Nothing to do when the Hello chare object is created.
    -   // This is where member variables would be initialized
    -   // just like in a C++ class constructor.
    -
    - }
    -
    - - // Constructor needed for chare object migration (ignore for now)
    - // NOTE: This constructor does not need to appear in the ".ci" file
    -
    - Hello::Hello(CkMigrateMessage *msg) { }
    -
    - void Hello ::sayHi(int from) {
    -
    -   // Have this chare object say hello to the user.
    -   CkPrintf("\"Hello\" from Hello chare # %d on "
    -            "processor %d (told by %d).\n",
    -            thisIndex, CkMyPe(), from);
    -
    - -   // Report to the Main chare object that this chare object
    -   // has completed its task.
    -
    -   mainProxy.done();
    - }
    -
    - #include "hello.def.h" -
    -
    -
    - -
    -
    - - -

    The "Main" Chare Class

    - - -
    - - - - - - - - -
    - - - - - - - - - -
    Header File (main.h)
    -
    - - #ifndef __MAIN_H__
    - #define __MAIN_H__
    -
    - class Main : public CBase_Main {
    -
    -  private:
    -   /// Member Variables (Object State) ///
    -   int numElements;
    -   int doneCount;
    -
    -  public:
    -   /// Constructors ///
    -   Main(CkArgMsg* msg);
    -   Main(CkMigrateMessage* msg);
    -
    -   /// Entry Methods ///
    -   void done();
    - };
    -
    - #endif //__MAIN_H__ -
    -
    -
    - - - - - - - - - -
    Interface File (main.ci)
    -
    - - mainmodule main {
    -
    -   readonly CProxy_Main mainProxy;
    -
    -   extern module hello;
    -
    -   mainchare Main {
    -     entry Main(CkArgMsg* msg);
    -     entry void done();
    -   };
    -
    - }; -
    -
    -
    - -
    - - - - - - - - - -
    Source File (main.C)
    -
    - - #include "main.decl.h"
    -
    - #include "main.h"
    - #include "hello.decl.h"
    -
    - /* readonly */ CProxy_Main mainProxy;
    -
    - // Entry point of Charm++ application
    - Main::Main(CkArgMsg* msg) {
    -
    -   // Initialize the local member variables
    -   doneCount = 0;    // Set doneCount to 0
    -   numElements = 5;  // Default numElements to 5
    -
    - -   // There should be 0 or 1 command line arguments.
    -   // If there is one, it is the number of "Hello"
    -   // chares that should be created.
    -
    -   if (msg->argc > 1)
    -     numElements = atoi(msg->argv[1]);
    -
    - -   // We are done with msg so delete it.
    -
    -   delete msg;
    -
    - -   // Display some info about this execution
    -   // for the user.
    -
    -   CkPrintf("Running \"Hello World\" with %d elements "
    -            "using %d processors.\n",
    -            numElements, CkNumPes());
    -
    - -   // Set the mainProxy readonly to point to a
    -   // proxy for the Main chare object (this
    -   // chare object).
    -
    -   mainProxy = thisProxy;
    -
    - -   // Create the array of Hello chare objects.
    -
    -   CProxy_Hello helloArray = CProxy_Hello::ckNew(numElements);
    -
    - -   // Invoke the "sayHi()" entry method on all of the
    -   // elements in the helloArray array of chare objects.
    -
    -   helloArray.sayHi(-1);
    - }
    -
    - - // Constructor needed for chare object migration (ignore for now)
    - // NOTE: This constructor does not need to appear in the ".ci" file
    -
    - Main::Main(CkMigrateMessage* msg) { }
    -
    - - // When called, the "done()" entry method will increment the doneCount.
    - // Once all of the Hello chare objects have indicated that they have
    - // completed their tasks, "done()" will cause the program to exit.
    -
    - void Main::done() {
    - -   // Increment the doneCount. If all of the Hello chare
    -   // objects have indicated that they are done, then exit.
    -   // Otherwise, continue waiting for the Hello chare objects.
    -
    -   doneCount++;
    -   if (doneCount >= numElements)
    -     CkExit();
    - }
    -
    - #include "main.def.h" -
    -
    -
    - -
    -
    - -

    Makefile

    - -

    - The makefile for this program is the same as it is for the Array "Hello World" program. -

    - - -
    - - - - - - - -
    Makefile
    -
    - - CHARMDIR = [put Charm++ install directory here]
    - CHARMC = $(CHARMDIR)/bin/charmc $(OPTS)
    -
    - default: all
    - all: hello
    -
    - hello : main.o hello.o
    -    $(CHARMC) -language charm++ -o hello main.o hello.o
    -
    - main.o : main.C main.h main.decl.h main.def.h hello.decl.h
    -    $(CHARMC) -o main.o main.C
    -
    - main.decl.h main.def.h : main.ci
    -    $(CHARMC) main.ci
    -
    - hello.o : hello.C hello.h hello.decl.h hello.def.h main.decl.h
    -    $(CHARMC) -o hello.o hello.C
    -
    - hello.decl.h hello.def.h : hello.ci
    -    $(CHARMC) hello.ci
    -
    - clean:
    -    rm -f main.decl.h main.def.h main.o
    -    rm -f hello.decl.h hello.def.h hello.o
    -    rm -f hello charmrun -
    -
    -
    -
    - - - -

    Output

    - -

    - The only difference in the output of this program and the Array "Hello World" program is - that all of the Hello chare objects are told to sayHi() by the Main chare object. - This is reflected by the fact that all the output lines below have "told by -1" in them. -

    - - -
    - - - - - - - - - - -
    -
    - - $ ./charmrun +p3 ./hello 10
    - Running "Hello World" with 10 elements using 3 processors.
    - "Hello" from Hello chare # 0 on processor 0 (told by -1).
    - "Hello" from Hello chare # 3 on processor 0 (told by -1).
    - "Hello" from Hello chare # 6 on processor 0 (told by -1).
    - "Hello" from Hello chare # 9 on processor 0 (told by -1).
    - "Hello" from Hello chare # 1 on processor 1 (told by -1).
    - "Hello" from Hello chare # 4 on processor 1 (told by -1).
    - "Hello" from Hello chare # 7 on processor 1 (told by -1).
    - "Hello" from Hello chare # 2 on processor 2 (told by -1).
    - "Hello" from Hello chare # 5 on processor 2 (told by -1).
    - "Hello" from Hello chare # 8 on processor 2 (told by -1). -
    -
    -
    - Figure: Output of the Broadcast "Hello World" Program -
    -
    diff --git a/content/tutorial/BuildingTheCharmRuntimeSystem.html b/content/tutorial/BuildingTheCharmRuntimeSystem.html deleted file mode 100644 index 801f3b4..0000000 --- a/content/tutorial/BuildingTheCharmRuntimeSystem.html +++ /dev/null @@ -1,92 +0,0 @@ ---- -title: Tutorial -homec: home -tutorialc: tutorial selected tutorialSelected -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - - - -

    Building the Charm++ Runtime System

    - -

    - In the root directory of the Charm++ distribution is a build script. This build script - is used to compile the Charm++ Runtime System for a particular platform. The exact platform that - should be used depends on the setup of the machine being used by the user. For the sake of this - example, we will assume that the target platform is a cluster of Linux workstations. - - Please Note: If the build script is executed with the "--help" command-line argument - (i.e. the command "./build --help"), it will print out a usage message which includes a list - of platforms available. - -

    - -

    - The general usage form of the build script is:

    -

    - -
    - build <target> <version> <options> [ charmc-options ... ] -
    - -

    - where: -

    - -
      -
    • - <target>: This indicates which portion of the Charm++ distribution should be - built. Because there are many components to the Charm++ distribution this allows the user - to only build the portions that are needed for their purpose. Targets include: charm++, AMPI, - FEM, LIBS, bigemulator, pose, jade, and msa. For example, the charm++ target builds the - basic Charm++ Runtime System. The LIBS target builds additional libraries with various - functionality (also builds the charm++ target on which it depends). If the pose target is - used, both charm++ and LIBS targets will be built followed - by the pose target. The pose target will create the required libraries needed for applications - that will use its PDES functionality. -
    • - <version>: This is one of the available platforms. For a cluster of linux - workstations connected using an Ethernet network, the target platform is net-linux. - For the full list of supported platforms, use "./build --help". -
    • - <options> (Optional): This is where platform specific options - should be specified. For example, multiple compilers are supported for various platforms. - If the user wishes to use a compiler different from the default compiler for the platform, - this would be specified here. Other platform specific options can include options for the - type of network, SMP-mode, PAPI support, and so on. -
    • - [ charmc-options ... ] (Optional): This is where compiler specific - options can be specified. The compiler wrapper charmc will use the options specified here - by default when it is used to compile Charm++ programs. The compiler that it wraps is - either the default compiler for the platform or the user defined compiler specified in - the <options> portion of the build command. -
    - -

    Examples

    - -

    - (1) For a cluster of Linux workstations connected by an Ethernet network (32-bit x86 architecture): - ./build charm++ net-linux
    - - (2) 1 with SMP support: - ./build charm++ net-linux smp
    - - (3) 1 with the "-O3" compiler option on by default for charmc: - ./build charm++ net-linux "-O3"
    - - (4) 1 with both SMP support and the "-O3" compiler option on by default for charmc: - ./build charm++ net-linux smp "-O3"
    - -

    - -

    - - WARNING: Depending on the speed of the machine being used and the options specified, the build - process of the Charm++ Runtime System can take several minutes (as high as 10-20 minutes for - older machines). - -

    diff --git a/content/tutorial/Callbacks.html b/content/tutorial/Callbacks.html deleted file mode 100644 index f0856e9..0000000 --- a/content/tutorial/Callbacks.html +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: Tutorial -homec: home -tutorialc: tutorial selected tutorialSelected -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - - - -

    Callbacks

    - -

    - Callbacks are used by the Charm++ Runtime System, frameworks, libraries, and so on to notify - application code that some kind of event has occurred. For example, reductions use callbacks to - notify the application code when the reduction has completed. The basic idea is that the application - code can specify what action to take when the callback is triggered (i.e. the specific - event occurs). The action taken can be a variety of things including calling function or - having the application exit. -

    - -

    "Do Nothing" Callback

    - -

    - To create a callback object that does nothing, simply create it as follows: - CkCallback cb(CkCallback::ignore). When triggered, the callback does nothing. -

    - -

    CkExit Callback

    - -

    - To create a callback object that will cause CkExit() to be called when the callback is triggered, - simply create it as follows: CkCallback cb(CkCallback::ckExit). -

    - -

    C Function Callback

    - -

    - To create a callback object that will cause a C function to be executed, create it as - follows: CkCallback cb(CkCallbackFunc cFunc, void* param). Here, the type of the - CkCallbackFunc is void myCFunction(void* param, void* msg). The param - pointer used when the callback object was created will be passed to the C function as the - param parameter. The msg parameter will point to the message created by whatever - entity (e.g. a library) triggers the callback. -

    - -

    Entry Method Callback

    - -

    - To create a callback object that will cause an entry method to be called on a chare object, - create it as follows: CkCallback cb(int entryMethodIndex, CkChareID &id). Each entry - method for a chare class has an associated entry method index. The entry method - index is used here to identify which entry method on the chare object (specified by the - id parameter) should be executed. -

    - -

    - To get the entry method index for any given - entry method, do the following: - int entryMethodIndex = CkIndex_MyChareClass::myEntryMethod(...parameters for entry method...) - where MyChareClass is the name of the chare class and myEntryMethod is the name - of the entry method. The parameters passed to this function are not actually used when retrieving - the entry method index; they are only used to identify which entry method is actually being - called in cases where multiple entry methods share the same name (i.e. are overloaded). For example, - to get the entry method index for an entry method with the following prototype: - void MyChareClass::myEntryMethod(int* x) one could use - int myEntryMethodIndex = CkIndex_MyChareClass::myEntryMethod((int*)NULL). (Remember, this is not - actually calling myEntryMethod so it is alright for the pointer to have a NULL value. Only - the type of the parameter is important so overloaded functions can be differentiated.) -

    - -

    Example Usage

    - -

    - For an example of how a callback would be created an used, please see the - Reductions Section. -

    - -

    More Information

    - -

    - For more information on callbacks, please see - Section 3.15: Callbacks of the - The Charm++ Programming Language Manual -

    diff --git a/content/tutorial/CommonFunctions.html b/content/tutorial/CommonFunctions.html deleted file mode 100644 index 59ae7cc..0000000 --- a/content/tutorial/CommonFunctions.html +++ /dev/null @@ -1,176 +0,0 @@ ---- -title: Tutorial -homec: home -tutorialc: tutorial selected tutorialSelected -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - - - -

    Commonly Used (or Otherwise Useful) Functions

    - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - Processor/Node/Rank Information -
    int CkMyPe(): - Returns the processor number for the processor it is called on (0 through P-1 - where P is the number of processors available to the application). -
    int CkNumPes(): - Returns the number of processors available to the application. -
    int CkMyNode(): - Returns the node number of the node it was called on (0 through N-1 - where N is the number of nodes available to the application) and a node is - defined as a single address space. -
    int CkNumNodes(): - Returns the number of nodes available to the application. -
    int CkMyRank(): - Returns the rank number of the processor it was called on. The rank of a processor - is its number within the node (address space) starting at 0. For example, if a single - node contains four processors (i.e. a node size of four), the processors' rank numbers - would be 0 through 3 with each having a unique value. -
    int CkNodeSize(): - Returns the number of processors within the node it was called. on. -
    int CkNodeFirst(int nodeNumber): - Returns the processor number of the processor at rank zero within the specified node (address - space). -
    int CkNodeOf(int procNumber): - Returns the node number of the specified processor. -
    int CkRankOf(int procNumber): - Returns the rank number of the specified processor. -
    - - Program Termination -
    void CkExit(): - This function causes the Charm++ application to terminate. The call does not return. All - other processors to notified that execution of the application should end. -
    void CkExitAfterQuiescence(): - Informs the Charm++ Runtime System that the Charm++ application should exit if quiescence is - detected. Quiescence is described in - Section 3.13: Quiescence Detection of the - The Charm++ Programming Language Manual. -
    void CkAbort(const char* message): - This function causes the Charm++ application to abort. The speicified message is displayed - before the application terminates. This function does not return. -
    - - Timing Functions -
    double CkCpuTimer(): - Returns the value of the system timer (in seconds). The system timer is started when the - application begins and measures processor time (both user and system time). -
    double CkWallTimer(): - Returns the amount of time that has elapsed since the application started from the wall - clock timer (in seconds). -
    double CkTimer(): - Aliases to either CkCpuTimer() or CkWallTimer() depending on the system being used. Typically, - dedicated machines (i.e. program has complete use of CPU such as ASCI Red) this function aliases to - CkWallTimer(). For machines which have multiple processes sharing the same CPU (such as a - workstation), this function aliases to CkCpuTimer(). -
    -
    diff --git a/content/tutorial/ParticlesCode.html b/content/tutorial/ParticlesCode.html deleted file mode 100644 index 53bbf08..0000000 --- a/content/tutorial/ParticlesCode.html +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: Tutorial -homec: home -tutorialc: tutorial selected tutorialSelected -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - - - - -

    Particles Code

    - - - - - -
    - - - -
    - Figure 1 -
    - -

    Description

    - -

    - For the assignment, you will write code that simulates a set of particles moving randomly in a 2-dimensional space within a bounding box. The coordinates of the overall simulation box are between 0.0 and 100.0 along each dimension. The particles are divided among chares based on their coordinates. The chares should be organized in a 2-dimensional array of chares (using a chare array) of size k x k. So, each chare owns a bounding box of its own with size 100.0/k. See Figure 1. -

    - -

    - Your program should generate n particles per chare during construction with a random (but valid, i.e. within the chare) position for particles. Your program should accept the number of particles per cell n, and k as command line parameters in that sequence. -

    - -

    Skeleton Code

    - -

    - A base code for Particles Code can be found here. The skeleton code includes base code for Mainchare Main, 2-D Chare Array Cell and Particle class representing the particles the Chare Array contains. There are also comments in the skeleton code that will guide you through the assignment. -

    - -

    Expected Output

    - -

    - Your program should calculate and print to screen the maximum and total number of particles every 10 iterations. Use the provided print function. Additionally, the simulation should not be delayed by this calculation (i.e. you should use reductions). -

    - -

    - For testing your Particles Code, you can use 10000 (=n) particles per chare, simulated over 100 steps and a chare array of size 16 x 16 (k=16). Experiment with different number of particles and chare array sizes as our test cases will use values in addition to the defaults. -

    - -

    - Note: There might be multiple particles having the same x and y coordinates, especially if you increase the density of each cell. You do not need to handle this case separately; it is a valid case assumption. -

    - - - -

    -

      -
    • The pseudocode for the overall algorithm is:
    • - for(iteration=0; iteration < ITERATION; iteration++){ -
        -
      • For each of the particles that belong to my chare: change its x and y coordinate by a small random amount.
      • -
      • Move all the particles that do not belong to a chare's bounding box to their correct homes. Since the movement is small, this will mean communication to the eight near neighbor chares. Some of these messages may contain no particles.
      • -
      • if(iteration%10 == 0)
      • -
          -
        • Do reductions to calculate average and max number of particles
        • -
        -
      - } -
    -

    diff --git a/content/tutorial/ParticlesCode_lb.html b/content/tutorial/ParticlesCode_lb.html deleted file mode 100644 index e29486a..0000000 --- a/content/tutorial/ParticlesCode_lb.html +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: Tutorial -homec: home -tutorialc: tutorial selected tutorialSelected -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - - - -

    Particles Code with Load Balancing and Performance Analysis

    - - - - - -
    - - - -
    - Figure 1 -
    - -

    Description

    - -

    - This assignment is an extension of Particles Code. You will use your code from Particles Code and extend it to do load balancing and visualization using LiveViz. -

    - -

    - In Particles Code, the particles moved randomly. There was no prominent load imbalance between chare array elements. Now we will create load imbalance between chares by coloring the particles, moving them at different speeds, and changing their initial distribution. -

    - -
      -
    • The particles will have three colors: blue, red, and green. To represent this, you need to add a variable to the Particle object.
    • -
    • To make particles move at different speeds, add a constant speed factor to the perturb function depending on the color of the objects. Change the range of blue particles to half, red particles will have the full range (so they will move faster), and green particles will move at one-quarter speed.
    • -
    • You are also required to change the initial distribution of the particles depending on the color. In the beginning green particles will be distributed to the right upper triangle, blue particles will be on the left lower triangle of the cell, and red particles will be in the middle square. Chare array elements having red particles will have 2*particlesPerCell number of particles per cell and the rest of the chare array elements will have particlesPerCell number of elements where particlesPerCell is a command line argument as in Particles Code.
    • -
    • This will result in chares along the diagonal generating both green and blue particles in their bounding box. Thus, they will have 2*particlesPerCell. Additionally, chares along the diagonal inside the red box will generate red particles in addition to the green and blue chares. In total they will have 4 * particlesPerCell (1 (for Green) + 1 (for Blue) + 2 (for Red) * particlesPerCell). The other chares in the red box not on the diagonal will generate both red and green or blue particles. Their total will be 3 * particlesPerCell (2 (Red) + 1 (Green or Blue) * particlesPerCell). See Figure 1.
    • -
    - -

    Part A) Load Balancing and Projections:

    - -

    - In this part, you'll try 3 different load balancing strategies and comment on the behavior you observe. The first two load balancing strategies you will use are GreedyLB and RefineLB. For the third strategy, you will get to choose one of the other load balancing strategies. Observe the effect of load balancing (overhead and benefit) on the total execution time of the application using Projections. Are they beneficial? Why or why not? How much is the overhead? Which strategy is the best for this Particle application? etc. -

    - -

    Part B) Visualization using LiveViz:

    - -

    - In this part you will visualize the 2-D grid with moving particles using LiveViz. Particles should be shown in color. You need to submit two images from the visualization: one in the beginning showing the initial particle distribution and one when the application is more advanced (after the particles are moved and intermixed). -

    - -

    - Please read the LiveViz manual for details about LiveViz setup and usage. You can also look at the Wave2D application for an example code that uses LiveViz. It's located in charm/examples/charm++/wave2d. -

    - diff --git a/content/tutorial/PiExample.html b/content/tutorial/PiExample.html deleted file mode 100644 index a354433..0000000 --- a/content/tutorial/PiExample.html +++ /dev/null @@ -1,158 +0,0 @@ ---- -title: Tutorial -homec: home -tutorialc: tutorial selected tutorialSelected -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - - - -

    Introducing Reductions

    - - -

    Reductions

    - -

    - By now, we've spent a lot of time in this tutorial talking about how to decompose problems - into chares and distribute them across processors. That's great, but what good is splitting - up your problem if you can't put it back together? When you need to combine values from an array - of chares, you can turn to one of the most important parallel programming tools: a reduction. -

    - -

    - Reductions turn data that is scattered across a chare array into a single value using a reduction - operation, such as sum or maximum. Each of the chares in the array contribute some local data -

    - -

    "Hello World" Code

    - -

    The "Hello" Chare Class

    - - -
    - - - - - - - - - - diff --git a/content/tutorial/Preface.html b/content/tutorial/Preface.html deleted file mode 100644 index 4140a91..0000000 --- a/content/tutorial/Preface.html +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: Tutorial -homec: home -tutorialc: tutorial selected tutorialSelected -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - - - -

    Preface

    - - -

    Welcome to the Charm++ Tutorial

    - -

    - Welcome to the Charm++ Programming Tutorial! We are happy that you are interested in learning about the Charm++ Programming Model and what it can do for you as a programmer. The purpose of this tutorial is to give the reader a basic understanding of how to program using the Charm++ parallel programming model. Charm++ is an object-oriented message passing parallel programming model which has mainly been used in the realm of HPC and scientific computing. Charm++ can be used to write parallel applications that run on a variety of machines ranging from a single notebook/desktop computer to computer clusters containing tens of thousands of processors. To date, Charm++ applications have been shown to scale to as many as forty thousand processors on some of the world's largest and most powerful supercomputers. - - We are always eager to get feedback from our users. If you have any questions or comments about this tutorial or about Charm++ in general, please feel free to contact us at charm@cs.illinois.edu. We hope you find this tutorial helpful. -

    - - - -

    What the Reader Should Know Before Starting

    - -

    - The reader is expected to be familiar with the C++ programming language and, at least, - the basics of the object-oriented programming style used in C++. The reader is also - recommended to have a basic understanding of multiple "threads of execution" or concurrency. - Previous experience in parallel programming will help, but is not required. -

    - -

    - The Charm++ distribution, which contains the Charm++ Runtime System and related tools, libraries, - and so on, can be downloaded - here. -

    - -

    - While working through this tutorial, the reader may find the information in the various manuals helpful (in particular, the The Charm++ Programming Language Manual). For additional information on Charm++ and related software, please see the Charm++ Homepage. -

    diff --git a/content/tutorial/Projections.html b/content/tutorial/Projections.html deleted file mode 100644 index 896e8c7..0000000 --- a/content/tutorial/Projections.html +++ /dev/null @@ -1,85 +0,0 @@ ---- -title: Tutorial -homec: home -tutorialc: tutorial selected tutorialSelected -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - - - -

    Projections

    - -

    - Projections is a performance visualization tool designed to work closely with the - Charm++ Runtime System. The Charm++ Runtime System collects performance data about the Charm++ - application during runtime. This data is then analyzed by Projections. Projections can - present this data to the user using several different graphs/representations. -

    - -

    -

    - - -

    How Projections Works

    - -

    - The Charm++ Runtime System keeps track of when each entry methods starts and stops. Additionally, - it keeps track of the various messages that are sent by the entry methods (including aspects such - as where the message is headed, the size of the message, and so on). This information is recorded - in log files which are analyzed after the program has finished executing. - The user can also choose to enable and disable the collection of the performance data dynamically - during runtime. -

    - -

    -

    - -

    Commonly Used Graphs/Visualizations Available In Projections

    - - -
    -
    - - - - - - - - - - - - - - - - - - -
    Header File (hello.h)
    -
    - - #ifndef __HELLO_H__
    - #define __HELLO_H__
    -
    - class Hello : public CBase_Hello {
    -
    -  public:
    -
    -   /// Constructors ///
    -   Hello();
    -   Hello(CkMigrateMessage *msg);
    -
    -   /// Entry Methods ///
    -   void sayHi(int from);
    - };
    -
    - #endif //__HELLO_H__ -
    -
    -
    Interface File (hello.ci)
    -
    - - module hello {
    -
    -   array [1D] Hello {
    -     entry Hello();
    -     entry void sayHi(int);
    -   };
    -
    - }; -
    -
    -
    -
    - - - - - - - - - - -
    Header File (hello.C)
    -
    - - #include "hello.decl.h"
    -
    - #include "hello.h"
    - #include "main.decl.h"
    -
    -
    - extern /* readonly */ CProxy_Main mainProxy;
    - extern /* readonly */ int numElements;
    -
    -
    - Hello::Hello() {
    -   // Nothing to do when the Hello chare object is created.
    -   // This is where member variables would be initialized
    -   // just like in a C++ class constructor.
    - }
    -
    -
    - // Constructor needed for chare object migration (ignore for now)
    - // NOTE: This constructor does not need to appear in the ".ci" file
    - Hello::Hello(CkMigrateMessage *msg) { }
    -
    -
    - void Hello ::sayHi(int from) {
    -
    -   // Have this chare object say hello to the user.
    -   CkPrintf("\"Hello\" from Hello chare # %d on "
    -            "processor %d (told by %d).\n",
    -            thisIndex, CkMyPe(), from);
    -
    -   // Tell the next chare object in this array of chare objects
    -   // to also say hello. If this is the last chare object in
    -   // the array of chare objects, then tell the main chare
    -   // object to exit the program.
    -   if (thisIndex < (numElements - 1))
    -     thisProxy[thisIndex + 1].sayHi(thisIndex); -   else
    -     mainProxy.done(); - }
    -
    -
    - #include "hello.def.h" -
    -
    -
    -
    - - - - - - - - - - - - -
    - - - - - Summary: When projections is initially opened, a summary graph of the application execution - is presented to the user (assuming the summary module was linked to the application; see the - Compile Time Options section below). The utilization is an - aggregate of all the processors. -
    - - - - - Overview: In the overview graph, each processor is represented by a horizontal bar - with time increasing time from left to right. The color of the bar at that point in time - represents the utilization of that processor (see the color scale to the left of the overview - graph). -
    -
    - - -

    Using Projections

    - - -

    Compile Time Options

    - -

    Runtime Options

    diff --git a/content/tutorial/ShadowArrays.html b/content/tutorial/ShadowArrays.html deleted file mode 100644 index ee04260..0000000 --- a/content/tutorial/ShadowArrays.html +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: Tutorial -homec: home -tutorialc: tutorial selected tutorialSelected -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - - - -

    Shadow Arrays (AKA: Bound Arrays)

    - -

    - It may be useful to have corresponding elements of two or more chare arrays to be located on the - same processor. For example, if the corresponding elements of chare arrays X and Y - frequently communicate with one another, it would be advantageous to have those elements, - X[i] and Y[i], on the same processor to reduce communication costs. Shadow arrays - in Charm++ are a way of accomplishing just this type of behavior. When two or more arrays are - bound, the Charm++ Runtime System ensures that the objects are always located on the same - physical processor. -

    - - - - - -
    -
    - - // Assumed variable declarations
    - int numElements = ...;
    -
    - // Creation of first array (standard process)
    - CProxy_myArrayClass1 myArray1 = CProxy_myArrayClass1::ckNew(...parameters... , numElements);
    -
    - // Creation of the second array (bound to the first)
    - CkArrayOptions ckOptions(numElements);
    - opts.bindTo(myArray1);
    - CProxy_myArrayClass2 myArray2 = CProxy_myArrayClass2::ckNew(ckOptions);
    -
    -
    -
    - Figure 1: Code to create two chare arrays, myArray1 and myArray2, which are - bound together. -
    - -

    - Shadow (or bound) arrays create a relationship in terms of element mapping and load balancing between - two or more arrays. The idea is fairly straight forward. First, a chare array is created in the - standard manner. Then, a second array is created as a shadow of the first array (or bound to the first - array). This is done through the CkArrayOptions parameter to the ckNew call which creates - the second array. Additional arrays can also be bound to this set of bound arrays in a similar manner. -

    - -

    - There is no restriction to the type or number of chare elements in the arrays. The bound arrays can - be instances of the same chare array class or be different chare array classes. Also, the arrays do not - have to have the same number of elements. For indexes where the other array doesn't have a corresponding - element, the element that exists is free to move between processors arbitrarily. The Charm++ Runtime - System simply ensures that when there are corresponding elements (that is, elements at - corresponding indexes), in a set of bound arrays, the elements will be located on the same physical - processor. -

    - -

    - Since the corresponding objects are always located on the same processor, the objects can take advantage - of this in various ways. For example, they can obtain local pointers to one another via a call to - ckLocal() on the proxy for the element. However, each time the objects migrate (i.e. the objects - are unpacked via the Pack-UnPack Routines), the local pointer needs - to be refreshed so it is a valid pointer on the new physical processor. -

    - -

    - For more information on callbacks, please see - Section 3.8.6: Advanced Array Creation: Bound Arrays of the - The Charm++ Programming Language Manual -

    diff --git a/content/tutorial/images/particlescode.png b/content/tutorial/images/particlescode.png deleted file mode 100644 index 252eca4..0000000 Binary files a/content/tutorial/images/particlescode.png and /dev/null differ diff --git a/content/tutorial/images/particlescode_lb.png b/content/tutorial/images/particlescode_lb.png deleted file mode 100644 index 69e3ec9..0000000 Binary files a/content/tutorial/images/particlescode_lb.png and /dev/null differ diff --git a/content/workshops_and_tutorials.html b/content/workshops_and_tutorials.html deleted file mode 100644 index 1940adc..0000000 --- a/content/workshops_and_tutorials.html +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: Workshops and Tutorials ---- - -

    Workshops and Tutorials

    - -

    Hybrid Tutorial 2023

    -We have decided to postpone the normal workshop to spring 2024. Instead, we will conduct a 2-day Charm++ tutorial on October 23rd and 24th. -

    -Dates: Monday October 23rd - Tuesday October 24th -

    -Location: University of Illinois Urbana-Champaign (remote option available as well) -

    -For in person attendees, both days of the tutorial will be at the Beckman Institute (Room 3035) on the UIUC campus. -

    -For remote attendees, we will also have zoom available. -

    -Registration: Please complete this form to register. -

    -Schedule: -
    -All times are central time -

    -Monday October 23rd -

    -

    10:00 AM to 10:20 AM - Introduction

    -

    10:20 AM to 10:50 AM - Chares and Asynchronous Method Invocations

    -

    10:50 AM to 12:00 PM - Chare Arrays

    -

    12:00 PM to 1:30 PM - Lunch/Hands on Exercise 1 - SimpleMax

    -

    1:30 PM to 2:00 PM - Hands on Exercise 2 - CheckSorted

    -

    2:00 PM to 2:30 PM - Load Balancing and Fault Tolerance

    -

    2:30 PM to 3:00 PM - SDAG

    -

    3:00 PM to 3:10 PM - Hands on Exercise 3 intro - Even/Odd Sort SDAG

    -

    3:10 PM to 3:30 PM - Discussion and Q&A

    -

    evening - hands on exercises with online help

    -
    -Day 1 Content -

    -

    Charm Model: pptx pdf

    -

    Grainsize: pptx pdf

    -

    Charm Benefits: pptx pdf

    -

    Hello World Example: pptx pdf

    -

    Charm Interface: pptx pdf

    -

    Asynchronous Methods: pptx pdf

    -

    Chare Arrays: pptx pdf

    -

    Broadcast Reductions: pptx pdf

    -

    Load Balancing: pptx pdf

    -

    PUP: pptx pdf

    -

    Fault Tolerance: pptx pdf

    -

    SDAG: pptx pdf

    -

    Parallel Prefix Example: pptx pdf

    -

    Advanced Topic Summary: pptx pdf

    -

    Charm++ Application Examples: pptx pdf

    -
    -Tuesday October 24th -

    -

    10:30 AM to 11:15 AM - charm4py

    -

    11:15 AM to 12:30 PM - Advanced Topics

    -

    12:30 PM to 2:00 PM - Lunch/Exercises

    -

    2:00 PM to 4:00 PM - Advanced Topics(continued)

    -

    evening - hands on exercises with online help

    -
    -Day 2 Content -

    -

    charm4py: pptx pdf

    -

    Median Calculation, Quiescence Detection, and Histogramming Example: pptx pdf

    -

    Libraries and Modules: pptx pdf

    -

    Projections: pptx pdf

    -

    Prefix as a Library Example: pptx pdf

    -

    Threaded Methods: pptx pdf

    -

    Chare Array Sections: pptx pdf

    -

    GPUs and Charm: pptx pdf

    diff --git a/download/index.html b/download/index.html new file mode 100644 index 0000000..8b690e0 --- /dev/null +++ b/download/index.html @@ -0,0 +1,177 @@ + + + + + + + Charm++: Download + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +
    + +
    +

    Downloads

    +

    Charm++

    + +

    Latest release version: Charm++ v6.10.1 (tar.gz)

    +

    Latest dev version: Current master (tar.gz)

    + +

    The latest development version of Charm++ can be downloaded directly from our + git source archive. To get the Charm++ source code:

    +
    git clone https://github.com/UIUC-PPL/charm
    +

    This will create a directory named charm. Move to this directory:

    +
    cd charm
    +

    And now build Charm++ (netlrts-linux example):

    +
    ./build charm++ netlrts-linux-x86_64 [ --with-production | -g ]
    +

    This will make a netlrts-linux-x86_64 directory, with bin, include, lib, etc. subdirectories.

    +

    Note that this development version may not be as portable or robust as the released + versions. Therefore, it may be prudent to keep a backup of old copies of + Charm++.

    + + +

    Projections

    + +

    Projections is Charm++'s performance analysis tool.

    + +

    Latest release binaries: Projections (tar.gz)

    + +

    To get the latest Projections source code:

    +
    git clone https://github.com/UIUC-PPL/projections
    +

    To build (requires gradle):

    +
    cd projections
    make
    + + +

    LiveViz and Charm Debug

    + +

    LiveViz is Charm++'s live program visualization tool. Charm Debug is Charm++'s parallel debugger.

    + +

    Latest Charm Debug release binaries: Charm Debug (tar.gz)

    + +

    To get the latest ccs_tools (includes both LiveViz and Charm Debug source code):

    +
    git clone https://github.com/UIUC-PPL/ccs_tools
    +

    To build:

    +
    cd ccs_tools
    ant
    + + +

    License

    + +

    Charm++ and associated software are licensed under the Charm++/Converse License

    . + +
    + +
    +
    + + +
    + + + diff --git a/content/execmodel.html b/execmodel/index.html similarity index 52% rename from content/execmodel.html rename to execmodel/index.html index 7c3efcc..e96f33b 100644 --- a/content/execmodel.html +++ b/execmodel/index.html @@ -1,7 +1,117 @@ ---- -title: Execution Model ---- + + + + + + + Charm++: Execution Model + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +
    +

    Execution Model

    @@ -111,3 +221,17 @@

    Execution Model

    an exception to this. They must be called from a threaded method, and so are allowed to return (certain types of) values.

    + +
    +
    + + +
    + + + diff --git a/exercises/arraysdesign/index.html b/exercises/arraysdesign/index.html new file mode 100644 index 0000000..fcd49dc --- /dev/null +++ b/exercises/arraysdesign/index.html @@ -0,0 +1,167 @@ + + + + + + + Charm++: Chare Arrays Design Exercise + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +
    + + +

    Chare Arrays: Design Exercise

    + +

    Data Balancing:

    + + +

    Assume you have a 1D chare array +A. Each chare (say A[i]) in it holds a vector of numbers. The size of +this vector is different on different chares (say sizei on +A[i]). Your task is to equalize the load on all processors by +exchanging the numbers. It is not necessary to do minimal data +movement, but it is desirable. The balance at the end needs to be +almost exact. If there are a total of N numbers, and v chares, there +should be between floor (N/v): ceil(N/v) items on each chare. Note +that the only way to send information to another chare is by sending +an (entry) method invocation to it.

    + +

    There are many distinct algorithms possible. Sketch the +alternatives without coding them, and write cost estimates for them. +Keep in mind that the simplest (i.e. approximate) cost model in +Charm++: entry methods invocation's cost \alpha + n . {\beta}, where +α is a fixed cost, and β is a per-byte cost. For the sake of +intuition, you may assume α is about a thousand times larger than +β, say a microsecond vs a nanosecond. +Reductions and broadcasts of size N data on P processors cost \alpha log (P) + +N \beta. +Keep in mind that many +(but not all) +of the algorithms for this problem have two phases: first phase to identify who +should send how many numbers to whom, and second to actually do the +data exchange. Make sure to write your time estimates for both phases. +Compare two of the interesting algorithms in terms of cost, performance +tradeoffs if any (e.g. is each algorithm better in different +scenarios), scalability and coding complexity. +By scalability, here, we mean how well the algorithm behaves with a +large number of chares and/or a large number of physical processors.

    +
    +
    + + +
    + + + diff --git a/exercises/arraysmethod1/index.html b/exercises/arraysmethod1/index.html new file mode 100644 index 0000000..d59f3b4 --- /dev/null +++ b/exercises/arraysmethod1/index.html @@ -0,0 +1,131 @@ + + + + + + + Charm++: Chare Arrays Method 1 Exercise + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +
    + + +

    Chare Arrays: Method 1 Exercise

    + + +
    +
    + + +
    + + + diff --git a/exercises/arraysmethod2/index.html b/exercises/arraysmethod2/index.html new file mode 100644 index 0000000..0ae2e9e --- /dev/null +++ b/exercises/arraysmethod2/index.html @@ -0,0 +1,131 @@ + + + + + + + Charm++: Chare Arrays Method 2 Exercise + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +
    + + +

    Chare Arrays: Method 2 Exercise

    + + +
    +
    + + +
    + + + diff --git a/exercises/arraysmethod3/index.html b/exercises/arraysmethod3/index.html new file mode 100644 index 0000000..8298994 --- /dev/null +++ b/exercises/arraysmethod3/index.html @@ -0,0 +1,131 @@ + + + + + + + Charm++: Chare Arrays Method 3 Exercise + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +
    + + +

    Chare Arrays: Method 3 Exercise

    + + +
    +
    + + +
    + + + diff --git a/content/exercises/images/charm_logo.jpg b/exercises/images/charm_logo.jpg similarity index 100% rename from content/exercises/images/charm_logo.jpg rename to exercises/images/charm_logo.jpg diff --git a/exercises/index.html b/exercises/index.html new file mode 100644 index 0000000..94785df --- /dev/null +++ b/exercises/index.html @@ -0,0 +1,192 @@ + + + + + + + Charm++: Charm++ Exercises + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +
    + + +
    + +

    Learn Charm++ via a series of programming exercises

    +
    +
    +

    !! Under Construction, the following is currently being updated and will include links to the exercises !!

    + +
      +
    • Basic Chares

    • +
    +
      +
    1. Primality test
    2. +
    +
      +
    • Part A: Primality testing with a chare for each number being tested
    • +
    • Part B: Batched primality testing
    • +
    + +
  • Chare Arrays

  • +
      +
    1. Data balancing
    2. +
        +
      1. Design exercise
      2. +
      3. Method 1
      4. +
      5. Method 2
      6. +
      7. Method 3
      8. +
      +
    3. Odd-even sort
    4. +
    5. Particle exercise
    6. +
    +
  • Load Balancing

  • +
      +
    1. Particle Exercise with multiple types of particles
    2. +
        +
      1. Add load balancing
      2. +
      3. Add projections and show impact of load balancing via time-profile and timeline
      4. +
      5. Add liveviz
      6. +
      +
    +
  • Structured Dagger

  • +
      +
    1. Rewrite odd-even sort using sdag (and see how simple it became)
    2. +
    3. Key-value pairs
    4. +
    +
  • Threaded Methods and Futures

  • +
  • Libraries / Modules, and Quiesence Detection

  • + + + + + + + + + + + + +
    + + + +
    +
    + + +
    + + + + + diff --git a/exercises/oddevensort/index.html b/exercises/oddevensort/index.html new file mode 100644 index 0000000..ac4f138 --- /dev/null +++ b/exercises/oddevensort/index.html @@ -0,0 +1,136 @@ + + + + + + + Charm++: Chare Arrays Odd-Even Sort Exercise + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +
    + + +

    Chare Arrays: Odd-Even Sort Exercise

    + +

    A mainchare has a chare array of size N. Each chare in the array generates its own random number. The array must be sorted in N steps, where at each step, each chare may communicate with at most one of its neighbors (i.e. on an 'odd' step adjacent chares are paired in one fashion, and on an 'even' step the pairing is switched). No barriers are allowed, and there is only one reduction, at the end, which checks that the elements have been properly sorted.

    + +

    N is a command line parameter.

    + +

    No SDAG is to be used.

    + +
    +
    + + +
    + + + diff --git a/exercises/particle/index.html b/exercises/particle/index.html new file mode 100644 index 0000000..2d5ae48 --- /dev/null +++ b/exercises/particle/index.html @@ -0,0 +1,182 @@ + + + + + + + Charm++: Chare Arrays Particle Exercise + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +
    + + +

    Chare Arrays: Particle Exercise

    + + + + + +
    + + + +
    + Figure 1 +
    + +

    Random Migrating Particles

    + +

    For this exercise, you will write code that simulates a set of particles moving + randomly in a 2-dimensional space within a bounding box. The coordinates of the + overall simulation box are between 0.0 and 100.0 along each dimension. The particles + are divided among chares based on their coordinates. The chares should be organized + in a 2-dimensional array of chares (using a chare array) of size k \times k. So, each + chare owns a bounding box of its own with size 100.0/k. The particles in each chare + can be stored as a vector.

    + +

    Your program should generate n particles per chare during construction with a + random (but valid, i.e. within the chare) position for particles. Your program + should accept the number of particles per cell n, and k as command line parameters + in that sequence.

    + +

    Expected Output: Your program should calculate and print to screen the maximum and + total number of particles every 10 iterations. Additionally, the simulation should + not be delayed by this calculation (i.e. you should use reductions).

    + +

    For testing your program, you can use 10000 (=n) particles per chare, simulated over 100 steps + and a chare array of size 16 \times 16 (k=16). Experiment with different number of particles and + chare array sizes.

    + +

    Note: There might be multiple particles having the same x and y coordinates, especially + if you increase the density of each cell. You do not need to handle this case separately; + it is a valid case assumption.

    + +
      +
    • The pseudocode for the overall algorithm is:
    • + for(iteration=0; iteration<ITERATION; iteration++){ +
        +
      • For each of the particles that belong to my chare: change its x and y coordinate by a small random amount.
      • +
      • Move all the particles that do not belong to a chare's bounding box to their correct homes. Since the movement is small, this will mean communication to the eight near neighbor chares. Some of these messages may contain no particles.
      • +
      • if(iteration%10 == 0)
      • +
          +
        • Do reductions to calculate average and max number of particles
        • +
        +
      + } +
    +
    +
    + + +
    + + + diff --git a/exercises/primality/index.html b/exercises/primality/index.html new file mode 100644 index 0000000..423da44 --- /dev/null +++ b/exercises/primality/index.html @@ -0,0 +1,206 @@ + + + + + + + Charm++: Basic Chares Primality Testing Exercise + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +
    + + +

    Basic Chares: Primality Testing Exercise

    +
    (testing with a chare for each number being tested)
    + +

    Part A

    +

    Write a program based on the outline below. +(Note that the program has a few artificial restrictions/elements that +are meant to teach you specific concepts. So, please follow the +instructions to the letter.)

    + +

    The main chare generates K random integers, and fires a +checkPrimality chare for each. +The chare checks if the number given to it is a prime using a variant of the function +below, and returns the result to the main chare. The main chare +maintains an array of pairs: <number, Boolean>, and prints it at the +end. An entry should be added to this array (with the number being tested, and a +default value such as "False") as soon as the chare is fired. In +particular, you are not allowed to delay adding the entry after the +result is returned by the chare. +Make sure that your program does not search the array when a response +comes. So, figure out a bookkeeping scheme to avoid it.

    + +

    Obtain K from a command line argument. You may use rand() from +the math library for generating random integers.

    + +

    For testing primality, use the following function. For extra credit, +modify it so that it is not +testing for every i, but (a) avoids testing even numbers except 2 and +(b) don’t let the loop run all the way to “number-1”).

    + +

    + +int isPrime(const long number)
    +{
    +  if(number<=1) return 0;
    +  for(int i=2; i<number; i++)
    +  {
    +                if(0 == number%i)
    +                  return 0;
    +  }
    +  return 1;
    +}
    +
    +

    + + + +

    Part B (grainsize control)

    + +

    Measuring performance and improving it via grainsize control:

    + +

    Grainsize control +is a way to improve performance of the above program. +Use information from the Charm++ manual about how to pass +arrays of data to entry methods, and send a bunch (M) of numbers to be +tested to each +new Chare, and experiment with different values of M to get good +performance. +You may wish to read M as a command line parameter, for ease of experimentation. +Measure +performance by adding two calls to CkTimer() in the main chare, one +just before +starting creation of checkPrimality chares, and the other after all +the results have been returned (but before they are printed), and +printing the difference between the timers. You may +omit (and probably should omit) printing primality results for performance runs. +Vary M and report smallest G for +which performance was within 5% infinite grainsize (i.e. $G == K$). +Again, make sure our artificial restriction is obeyed: do not send +back the numbers the number being tested (because you are not allowed +to search for it anyway).

    + +

    Part C:

    +

    Let the numbers being tested be 64 bit random numbers. For simplicity, +generate them by concatenating 2 32 bit random numbers.

    +
    +
    + + +
    + + + diff --git a/content/figs/amr_out1.png b/figs/amr_out1.png similarity index 100% rename from content/figs/amr_out1.png rename to figs/amr_out1.png diff --git a/content/figs/amr_out2.png b/figs/amr_out2.png similarity index 100% rename from content/figs/amr_out2.png rename to figs/amr_out2.png diff --git a/content/figs/amr_out3.png b/figs/amr_out3.png similarity index 100% rename from content/figs/amr_out3.png rename to figs/amr_out3.png diff --git a/content/figs/amr_perf.png b/figs/amr_perf.png similarity index 100% rename from content/figs/amr_perf.png rename to figs/amr_perf.png diff --git a/content/figs/amr_remesh.png b/figs/amr_remesh.png similarity index 100% rename from content/figs/amr_remesh.png rename to figs/amr_remesh.png diff --git a/content/figs/barnes_concept.png b/figs/barnes_concept.png similarity index 100% rename from content/figs/barnes_concept.png rename to figs/barnes_concept.png diff --git a/content/figs/barnes_perf.png b/figs/barnes_perf.png similarity index 100% rename from content/figs/barnes_perf.png rename to figs/barnes_perf.png diff --git a/content/figs/denselu_perf.png b/figs/denselu_perf.png similarity index 100% rename from content/figs/denselu_perf.png rename to figs/denselu_perf.png diff --git a/content/figs/fft_perf.png b/figs/fft_perf.png similarity index 100% rename from content/figs/fft_perf.png rename to figs/fft_perf.png diff --git a/content/figs/jetalloc.png b/figs/jetalloc.png similarity index 100% rename from content/figs/jetalloc.png rename to figs/jetalloc.png diff --git a/content/figs/leanmd_bgp.png b/figs/leanmd_bgp.png similarity index 100% rename from content/figs/leanmd_bgp.png rename to figs/leanmd_bgp.png diff --git a/content/figs/leanmd_bgq.png b/figs/leanmd_bgq.png similarity index 100% rename from content/figs/leanmd_bgq.png rename to figs/leanmd_bgq.png diff --git a/content/figs/leanmd_bgq_chkp.png b/figs/leanmd_bgq_chkp.png similarity index 100% rename from content/figs/leanmd_bgq_chkp.png rename to figs/leanmd_bgq_chkp.png diff --git a/content/figs/leanmd_bgq_restart.png b/figs/leanmd_bgq_restart.png similarity index 100% rename from content/figs/leanmd_bgq_restart.png rename to figs/leanmd_bgq_restart.png diff --git a/content/figs/progmodel/02-data-decomp-via-arrays.png b/figs/progmodel/02-data-decomp-via-arrays.png similarity index 100% rename from content/figs/progmodel/02-data-decomp-via-arrays.png rename to figs/progmodel/02-data-decomp-via-arrays.png diff --git a/content/figs/progmodel/03-many-data-parallel-arrays.png b/figs/progmodel/03-many-data-parallel-arrays.png similarity index 100% rename from content/figs/progmodel/03-many-data-parallel-arrays.png rename to figs/progmodel/03-many-data-parallel-arrays.png diff --git a/content/figs/progmodel/05-parallelism-via-obj-collections.png b/figs/progmodel/05-parallelism-via-obj-collections.png similarity index 100% rename from content/figs/progmodel/05-parallelism-via-obj-collections.png rename to figs/progmodel/05-parallelism-via-obj-collections.png diff --git a/content/figs/progmodel/06-objects-sys-view.png b/figs/progmodel/06-objects-sys-view.png similarity index 100% rename from content/figs/progmodel/06-objects-sys-view.png rename to figs/progmodel/06-objects-sys-view.png diff --git a/content/figs/progmodel/07-obj-programmer-view.png b/figs/progmodel/07-obj-programmer-view.png similarity index 100% rename from content/figs/progmodel/07-obj-programmer-view.png rename to figs/progmodel/07-obj-programmer-view.png diff --git a/content/figs/progmodel/18-locmgr.png b/figs/progmodel/18-locmgr.png similarity index 100% rename from content/figs/progmodel/18-locmgr.png rename to figs/progmodel/18-locmgr.png diff --git a/content/figs/ra_mesh.png b/figs/ra_mesh.png similarity index 100% rename from content/figs/ra_mesh.png rename to figs/ra_mesh.png diff --git a/content/figs/ra_perf.png b/figs/ra_perf.png similarity index 100% rename from content/figs/ra_perf.png rename to figs/ra_perf.png diff --git a/content/figs/solver_perf.png b/figs/solver_perf.png similarity index 100% rename from content/figs/solver_perf.png rename to figs/solver_perf.png diff --git a/content/figs/sysviewvsprogview.png b/figs/sysviewvsprogview.png similarity index 100% rename from content/figs/sysviewvsprogview.png rename to figs/sysviewvsprogview.png diff --git a/content/figs/time-profile.png b/figs/time-profile.png similarity index 100% rename from content/figs/time-profile.png rename to figs/time-profile.png diff --git a/content/figs/timeline.png b/figs/timeline.png similarity index 100% rename from content/figs/timeline.png rename to figs/timeline.png diff --git a/getting_started/index.html b/getting_started/index.html new file mode 100644 index 0000000..0df2dd4 --- /dev/null +++ b/getting_started/index.html @@ -0,0 +1,160 @@ + + + + + + + Charm++: Applications + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +
    + +
    +

    Getting Started with Charm++

    +
      +
    1. + First, get a copy of Charm++ from the download page. + If you want to do development on Charm++ itself, you may want to clone our + git repository at http://charm.cs.illinois.edu/gerrit/charm.git to make it + easier to contribute patches and merge your work with the latest version of + Charm. +
    2. + +
    3. + Next, you need to compile Charm++ on your system. You'll need basic Unix + build utilities like make and a C++ compiler. Charm++ provides a script + called 'build' in its top-level directory that will build Charm++ for you, + given some information about the system you're compiling for and the + features you want access to. The README file in Charm++'s top-level directory + gives details about the various options you have available to you when + compiling Charm++. +
    4. + +
    5. + Now it's time to get started building and running Charm++ programs. To get + started, you may want to look at the many examples in the examples + directory of Charm++. More information about compiling and running + applications is available in the + installation and usage guide. For more in-depth information about + the features of Charm++, consult the + Charm++ Parallel Programming System Manual. +
    6. +
    +
    + +
    +
    + + +
    + + + diff --git a/help/index.html b/help/index.html new file mode 100644 index 0000000..c6523a6 --- /dev/null +++ b/help/index.html @@ -0,0 +1,186 @@ + + + + + + + Charm++: Help + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +
    + +
    +If you need further help, please send an email to charm mailing list or contact us by other means. +
    +
    +
      +
    • Parallel Programming Lab [html]
    • +
    • Charm++ FAQ + [html] +
    • +
    • Charm++ Tutorial [html]
    • +
    • Recent Commit Activity [html]
    • +
    • Nightly Regression Tests [html]
    • +
    • Manuals +
        +
      • Charm++ +
          +
        • + Charm++ Language + [html] +
        • +
        • + Adaptive MPI (AMPI) + [html] +
        • +
        • + Installation and Usage + [html] +
        • +
        • + Fortran 90 Bindings for Charm++ + [html] +
        • +
        • + Charm++ and Converse Libraries + [html] +
        • +
        +
      • +
      • Tools: + +
      • +
      +
    • +
    +
    + + + +
    +
    + + +
    + + + + + diff --git a/history/index.html b/history/index.html new file mode 100644 index 0000000..bb34514 --- /dev/null +++ b/history/index.html @@ -0,0 +1,163 @@ + + + + + + + Charm++: History + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +
    + +

    History

    + +The Charm software was developed as a group effort of the Parallel Programming +Laboratory at the University of Illinois at Urbana-Champaign. Researchers at +the Parallel Programming Laboratory keep Charm++ updated for the new machines, +new programming paradigms, and for supporting and simplifying development of +emerging applications for parallel processing. The earliest prototype, Chare +Kernel(1.0), was developed in the late eighties. It consisted only of basic +remote method invocation constructs available as a library. The second +prototype, Chare Kernel(2.0), a complete re-write with major design changes. +This included C language extensions to denote Chares, messages and +asynchronous remote method invocation. Charm(3.0) improved on this syntax, and +contained important features such as information sharing abstractions, and +chare groups (called Branch Office Chares). Charm(4.0) included Charm++ and +was released in fall 1993. Charm++ in its initial version consisted of +syntactic changes to C++ and employed a special translator that parsed the +entire C++ code while translating the syntactic extensions. Charm(4.5) had a +major change that resulted from a significant shift in the research agenda of +the Parallel Programming Laboratory. The message-driven runtime system code of +the Charm++ was separated from the actual language implementation, resulting +in an interoperable parallel runtime system called Converse. The Charm++ +runtime system was retargetted on top of Converse, and popular programming +paradigms such as MPI and PVM were also implemented on Converse. This allowed +interoperability between these paradigms and Charm++. This release also +eliminated the full-fledged Charm++ translator by replacing syntactic +extensions to C++ with C++ macros, and instead contained a small language and +a translator for describing the interfaces of Charm++ entities to the runtime +system. This version of Charm++, which, in earlier releases was known as +Interface Translator Charm++, is the default version of Charm++ now, and hence +referred simply as Charm++. In early 1999, the runtime system of Charm++ was +rewritten in C++. Several new features were added. The interface language +underwent significant changes, and the macros that replaced the syntactic +extensions in original Charm++, were replaced by natural C++ constructs. Late +1999, and early 2000 reflected several additions to Charm++, when a load +balancing framework and migratable objects were added to Charm++. + +
    +
    + + +
    + + + diff --git a/content/images/application_over.png b/images/application_over.png similarity index 100% rename from content/images/application_over.png rename to images/application_over.png diff --git a/content/images/applications.png b/images/applications.png similarity index 100% rename from content/images/applications.png rename to images/applications.png diff --git a/content/images/applications_over.png b/images/applications_over.png similarity index 100% rename from content/images/applications_over.png rename to images/applications_over.png diff --git a/content/images/bigsim_app.png b/images/bigsim_app.png similarity index 100% rename from content/images/bigsim_app.png rename to images/bigsim_app.png diff --git a/content/images/blurb_back.png b/images/blurb_back.png similarity index 100% rename from content/images/blurb_back.png rename to images/blurb_back.png diff --git a/content/images/button_back.png b/images/button_back.png similarity index 100% rename from content/images/button_back.png rename to images/button_back.png diff --git a/content/images/changa_app.png b/images/changa_app.png similarity index 100% rename from content/images/changa_app.png rename to images/changa_app.png diff --git a/content/images/charm_logo.jpg b/images/charm_logo.jpg similarity index 100% rename from content/images/charm_logo.jpg rename to images/charm_logo.jpg diff --git a/content/images/contact_icon.png b/images/contact_icon.png similarity index 100% rename from content/images/contact_icon.png rename to images/contact_icon.png diff --git a/content/images/cse_dendrites_app.jpg b/images/cse_dendrites_app.jpg similarity index 100% rename from content/images/cse_dendrites_app.jpg rename to images/cse_dendrites_app.jpg diff --git a/content/images/download.png b/images/download.png similarity index 100% rename from content/images/download.png rename to images/download.png diff --git a/content/images/download_icon.png b/images/download_icon.png similarity index 100% rename from content/images/download_icon.png rename to images/download_icon.png diff --git a/content/images/download_icon_red.png b/images/download_icon_red.png similarity index 100% rename from content/images/download_icon_red.png rename to images/download_icon_red.png diff --git a/content/images/download_over.png b/images/download_over.png similarity index 100% rename from content/images/download_over.png rename to images/download_over.png diff --git a/content/images/episimdemics_app.jpg b/images/episimdemics_app.jpg similarity index 100% rename from content/images/episimdemics_app.jpg rename to images/episimdemics_app.jpg diff --git a/content/images/episims_app.jpg b/images/episims_app.jpg similarity index 100% rename from content/images/episims_app.jpg rename to images/episims_app.jpg diff --git a/content/images/explore_icon.png b/images/explore_icon.png similarity index 100% rename from content/images/explore_icon.png rename to images/explore_icon.png diff --git a/content/images/footer.png b/images/footer.png similarity index 100% rename from content/images/footer.png rename to images/footer.png diff --git a/content/images/git_icon.png b/images/git_icon.png similarity index 100% rename from content/images/git_icon.png rename to images/git_icon.png diff --git a/content/images/header.png b/images/header.png similarity index 100% rename from content/images/header.png rename to images/header.png diff --git a/content/images/help.png b/images/help.png similarity index 100% rename from content/images/help.png rename to images/help.png diff --git a/content/images/help_over.png b/images/help_over.png similarity index 100% rename from content/images/help_over.png rename to images/help_over.png diff --git a/content/images/home.png b/images/home.png similarity index 100% rename from content/images/home.png rename to images/home.png diff --git a/content/images/home_icon.png b/images/home_icon.png similarity index 100% rename from content/images/home_icon.png rename to images/home_icon.png diff --git a/content/images/home_over.png b/images/home_over.png similarity index 100% rename from content/images/home_over.png rename to images/home_over.png diff --git a/content/images/jetalloc.png b/images/jetalloc.png similarity index 100% rename from content/images/jetalloc.png rename to images/jetalloc.png diff --git a/content/images/manual_icon.png b/images/manual_icon.png similarity index 100% rename from content/images/manual_icon.png rename to images/manual_icon.png diff --git a/content/images/miniApps.png b/images/miniApps.png similarity index 100% rename from content/images/miniApps.png rename to images/miniApps.png diff --git a/content/images/miniApps_over.png b/images/miniApps_over.png similarity index 100% rename from content/images/miniApps_over.png rename to images/miniApps_over.png diff --git a/content/images/model_icon.png b/images/model_icon.png similarity index 100% rename from content/images/model_icon.png rename to images/model_icon.png diff --git a/content/images/namd_app.png b/images/namd_app.png similarity index 100% rename from content/images/namd_app.png rename to images/namd_app.png diff --git a/content/images/openatom_app.png b/images/openatom_app.png similarity index 100% rename from content/images/openatom_app.png rename to images/openatom_app.png diff --git a/content/images/publication_icon.png b/images/publication_icon.png similarity index 100% rename from content/images/publication_icon.png rename to images/publication_icon.png diff --git a/content/images/rsrm_ignition_app.jpg b/images/rsrm_ignition_app.jpg similarity index 100% rename from content/images/rsrm_ignition_app.jpg rename to images/rsrm_ignition_app.jpg diff --git a/content/images/side_left.png b/images/side_left.png similarity index 100% rename from content/images/side_left.png rename to images/side_left.png diff --git a/content/images/side_right.png b/images/side_right.png similarity index 100% rename from content/images/side_right.png rename to images/side_right.png diff --git a/content/images/sides.png b/images/sides.png similarity index 100% rename from content/images/sides.png rename to images/sides.png diff --git a/content/images/started_icon.png b/images/started_icon.png similarity index 100% rename from content/images/started_icon.png rename to images/started_icon.png diff --git a/content/images/tools.png b/images/tools.png similarity index 100% rename from content/images/tools.png rename to images/tools.png diff --git a/content/images/tools_over.png b/images/tools_over.png similarity index 100% rename from content/images/tools_over.png rename to images/tools_over.png diff --git a/content/images/tutorial.png b/images/tutorial.png similarity index 100% rename from content/images/tutorial.png rename to images/tutorial.png diff --git a/content/images/tutorial_over.png b/images/tutorial_over.png similarity index 100% rename from content/images/tutorial_over.png rename to images/tutorial_over.png diff --git a/index.html b/index.html new file mode 100644 index 0000000..53be766 --- /dev/null +++ b/index.html @@ -0,0 +1,286 @@ + + + + + + + Charm++: Parallel Programming Framework + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +

    Charm++

    +

    parallel programming framework

    +
      +
    • +

      migratable objects

      +

      + Use our unified data / task parallel model. + Express parallelism in terms of interacting collections of objects. + Use work and data units natural to your app. + Don't shackle performance by explicitly managing cores / threads. + +

      +
    • +
    • +

      asynchronous methods

      +

      Communication is as simple as invoking methods on remote objects. + Get zero-effort overlap of your computation with your communication. + Define your own serializable data or message types. + + +

      +
    • +
    • +

      adaptive runtime system

      +

      Allow our intelligent runtime system to orchestrate execution. + You design and decompose the parallel algorithm; the runtime + observes and optimizes performance. Win-Win! + +

      +
    • + more... +
    +
    +

    capabilities

    +
      +
    • Automatic overlap
    • +
    • Automatic load balancing
    • +
    • Automatic checkpointing
    • +
    • Automatic fault tolerance
    • +
    • Portable code
    • +
    • Independent modules, interleaved execution
    • +
    • Interoperable with MPI and OpenMP
    • +
    • Ecosystem of tools
    • +
    + more... +
    +
    +
    +
    +
    + + + +
    +

    Charm++ is a parallel programming framework in C++ supported by + an adaptive runtime system, which enhances user productivity and allows + programs to run portably from small multicore computers (your laptop) to + the largest supercomputers.

    + +

    It enables users to easily expose and express much of the parallelism + in their algorithms while automating many of the requirements for high + performance and scalability. It permits writing parallel programs in + units that are natural to the domain, without having to deal with + processors and threads.

    + +

    Charm++ has been in production use for over 15 years in the + scientific and high performance computing communities and currently has + thousands of users in dozens of countries across a wide variety of + computing disciplines. It has been adopted by many computing teams, and + has been used to produce several large parallel applications. It is + actively developed, maintained, and supported by the + Parallel Programming Laboratory at + UIUC and its collaborators.

    + + +
    +
      +
    • +

      environments

      +
        +
      • x86 (workstations, laptops, etc.)
      • +
      • ARM7/8
      • +
      • Cray XC30/40, XE6, XK6/7
      • +
      • IBM BlueGene Q
      • +
      • IBM POWER8/9
      • +
      • Beowulf clusters
      • +
      • Linux, Mac, Windows
      • +
      +
    • +
    • +

      network interfaces

      +
        +
      • TCP, UDP
      • +
      • Infiniband verbs
      • +
      • MPI
      • +
      • OFI
      • +
      • PAMI (IBM BlueGene Q and POWER)
      • +
      • uGNI (Cray Gemini and Aries)
      • +
      • Shared Memory
      • +
      +
    • +
    • +

      compilers

      +
        +
      • clang
      • +
      • cray
      • +
      • fujitsu
      • +
      • gcc
      • +
      • ibm
      • +
      • intel
      • +
      • microsoft
      • +
      • portland group
      • +
      +
    • +
    + +
    +
    + +
    + + + diff --git a/layouts/homepage.html b/layouts/homepage.html deleted file mode 100644 index 39f02eb..0000000 --- a/layouts/homepage.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - Charm++: <%= @item[:title] %> - - - - - - - - - - - - - - - - - - - - - -
    - - - - -
    -
    -

    Charm++

    -

    parallel programming framework

    -
      -
    • -
      migratable objects
      -

      - Use our unified data / task parallel model. - Express parallelism in terms of interacting collections of objects. - Use work and data units natural to your app. - Don't shackle performance by explicitly managing cores / threads. - -

      -
    • -
    • -
      asynchronous methods
      -

      Communication is as simple as invoking methods on remote objects. - Get zero-effort overlap of your computation with your communication. - Define your own serializable data or message types. - - -

      -
    • -
    • -
      adaptive runtime system
      -

      Allow our intelligent runtime system to orchestrate execution. - You design and decompose the parallel algorithm; the runtime - observes and optimizes performance. Win-Win! - -

      -
    • - more... -
    -
    -

    Charm++ Workshop 2024 Announcement

    -

    - We will be having the 21st Annual Workshop on Charm++ and its applications at UIUC on Thursday - April 25th and Friday April 26th 2024. - For more information and for registration, please follow this link. -

    -

    Hybrid Tutorial 2023 Announcement

    -

    - We will be having a hybrid tutorial at UIUC on Monday October 23rd and Tuesday October 24th. - For more information and for registration, please follow this link. -

    -
    -
    -

    capabilities

    -
      -
    • Automatic overlap
    • -
    • Automatic load balancing
    • -
    • Automatic checkpointing
    • -
    • Automatic fault tolerance
    • -
    • Portable code
    • -
    • Independent modules, interleaved execution
    • -
    • Interoperable with MPI and OpenMP
    • -
    • Ecosystem of tools
    • -
    - more... -
    -
    -
    -
    -
    - <%= yield %> -
    -
    - -
    - - - diff --git a/lib/default.rb b/lib/default.rb deleted file mode 100644 index a4df0cc..0000000 --- a/lib/default.rb +++ /dev/null @@ -1,2 +0,0 @@ -# All files in the 'lib' directory will be loaded -# before nanoc starts compiling. diff --git a/content/miniApps.html b/miniApps/index.html similarity index 60% rename from content/miniApps.html rename to miniApps/index.html index e28455d..6e6fb90 100644 --- a/content/miniApps.html +++ b/miniApps/index.html @@ -1,14 +1,117 @@ ---- -title: Mini-Apps -homec: home -tutorialc: tutorial -applicationsc: applications -miniAppsc: miniApps selected miniAppsSelected -downloadc: download -toolsc: tools -helpc: help ---- + + + + + + + Charm++: Mini-Apps + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +
    + @@ -45,7 +148,8 @@

    LeanMD

    The computation performed in this code mimics the short-range non-bonded force calculation in NAMD, and resembles the LJ force computation in miniMD benchmark in the Mantevo benchmark suite maintained by Sandia National Laboratories. -

    The force calculation in Lennard-Jones dynamics is done within a cutoff-radius, rc for every atom. +

    +

    The force calculation in Lennard-Jones dynamics is done within a cutoff-radius, rc for every atom. In LeanMD, the computation is parallelized using a hybrid scheme of spatial and force decomposition. The three-dimensional (3D) simulation space consisting of atoms is divided into cells of dimensions that are equal to the sum of the cutoff distance, rc and a margin. In each iteration, @@ -54,19 +158,20 @@

    LeanMD

    the computes, the cells perform the force integration and update various properties of their atoms – acceleration, velocity and positions. -

    Features: Automated load balancing, fault tolerance, multicast manager.

    - +

    +

    Features: Automated load balancing, fault tolerance, multicast manager.

    +
    - - + +
    Figure: performance of LeandMD on Blue Gene/P and Blue Gene/Q
    - - + +
    Figure: fault tolerant LeandMD on Blue Gene/Q
    @@ -80,7 +185,8 @@

    AMR

    The parallel mesh restructuring algorithm operates in terms of near-neighbor communication among individual blocks, and a single synchronization-only collective. -

    Traditional AMR algorithms phrase the design in terms of processors that +

    +

    Traditional AMR algorithms phrase the design in terms of processors that contain many blocks. Instead, we promote blocks to first-class entities that act as a virtual processor. As the mesh is refined or coarsened in AMR, the number of blocks will change and traditional algorithms require @@ -99,7 +205,8 @@

    AMR

    no data. Besides termination detection, blocks execute completely asynchronously, communicating only with neighboring blocks when required. -

    Traditional AMR implementations store the quad-tree instance on each +

    +

    Traditional AMR implementations store the quad-tree instance on each process consuming O(P) memory and taking O(log N) time for neighbor lookup. We organize the blocks into a quad-tree but address each block by their location in the tree using bit vectors to represent quadrants recursively. @@ -109,23 +216,24 @@

    AMR

    provides direct, efficient communication between them. The runtime system can then redistribute the blocks periodically without any change to the logic. -

    Features: quiescence detection, dynamic chare creation, load balancing.

    - +

    +

    Features: quiescence detection, dynamic chare creation, load balancing.

    +
    - - - + + +
    Figure: example simulation of a circular fluid advected by a constant velocity field. From left to right, the figure displays the fluid density after 2, 572, and 1022 iterations respectively. The white squares demonstrate how the mesh is evolving over time.
    - - + +
    Figure: performance of AMR on Blue Gene/Q. Left: Timesteps per second strong scaling on IBM BG/Q with a max depth of 15. Right: The non-overlapped delay of remeshing in milliseconds. The @@ -148,7 +256,8 @@

    Barnes-Hut

    hierarchical recursive subdivision of space into cubic cells. Barnes-Hut method is widely used in cosmological simulations. -

    The N-body problem involves the numerical calculation of the trajectories +

    +

    The N-body problem involves the numerical calculation of the trajectories of N point masses (or charges) moving under the influence of a conservative force field such as that induced by gravity (or electrical charges). In its simplest form, the method models bodies as particles of zero @@ -163,7 +272,8 @@

    Barnes-Hut

    quadratic complexity, the amount of work done by this all-pairs method makes it infeasible for systems with large N. -

    Barnes and Hut devised a hierarchical N-body method that +

    +

    Barnes and Hut devised a hierarchical N-body method that performs significantly fewer computations but at the cost of a greater relative error in the computed solution. The method relies on the spatial partitioning of the input system of particles, thereby imposing a tree-structure on it. @@ -176,16 +286,17 @@

    Barnes-Hut

    yields an expected complexity of O(N lg N), making it suitable for large systems of particles. - +

    +
    - +
    Figure: Time Progression view showing 2 processors executing an iteration of Barnes-Hut.
    - +
    Figure: Performance of Barnes-Hut for 10 and 50 million particle systems on Intrepid (IBM BG/P).
    @@ -201,7 +312,8 @@

    Dense LU

    programming paradigm, our LU implementation does not employ any linear algebra specific notations. Our implementation is very succinct and presents several distinct benefits. -

    We use a typical block-decomposed algorithm for the LU factorization +

    +

    We use a typical block-decomposed algorithm for the LU factorization process. Our focus in this effort has been less on choosing the best possible factorization algorithm than on demonstrating productivity with a reasonable choice. The input matrix of n x n elements is decomposed into square blocks @@ -209,19 +321,23 @@

    Dense LU

    high performance linear algebra library, typically a platform-specific implementation of BLAS and perform partial pivoting for each matrix column. -

    Features: composable library, flexible data placement, +

    +
    +

    Features: composable library, flexible data placement, block-centric control flow, separation of concerns. -

    +

    +
    - +
    Figure: weak scaling (matrix occupies 75% of memory) from 120 to 8064 processors on Jaguar (Cray XT5). Strong scaling (n = 96, 000) from 256 to 4096 processors on Intrepid (IBM BG/P).
    -
    +
    +
    @@ -230,14 +346,16 @@

    Dense LU

    HPCCG

    HPCCG is Charm++ implementation of HPCCG mini-application in the Mantevo Suite. It was originally developed as the first Mantevo mini-app in order to be the best representation of an unstructured implicit finite element or finite volume application in 800 lines of code. -

    +

    +

    Kripke

    Kripke is a proxy application from Lawrence Livermore National Laboratory (LLNL) for Sn discrete particle transport codes. Given a volume of interest, knowledge of its boundary conditions and the particle-generating sources within and outside the domain, Kripke solves for the flux of particles at every point in the domain at a subsequent time. It does so by decomposing the domain into 3-dimensional subdomains that we call zone sets, and then sweeps the over the zone sets for all energy group sets and angular direction sets. These parallel sweeps are all independent of each other, and so Kripke sweeps from all corners of the domain simultaneously and pipelines sweeps originating from the same domain corner. -

    +

    +
    @@ -253,11 +371,11 @@

    Triangular Solver

    its independent parts and waits for its dependency messages from the left. Nondiagonal blocks wait for the solution values from their corresponding diagonal block, and then start their computation.

    - +
    - +
    Figure: performance of sparse triangular solver on Intrepid (IBM BG/P) for different sparse matrices. Performance is much better than the standard SuperLU DIST package.
    @@ -276,12 +394,12 @@

    1D FFT

    operations are executed via point-to-point messages and external libraries (FFTW or ESSL) perform serial FFTs on the rows of the matrix.

    -

    Features: interoperability with MPI, adaptive overlap.

    - +

    Features: interoperability with MPI, adaptive overlap.

    +
    - +
    Figure: performance of Global FFT on IBM’s BG/Q BG/P.
    @@ -305,12 +423,14 @@

    Random Access

    topologies with dimensions matching the network representation of the current run led to good performance. -

    We used a Charm++ group to partition the global table across the nodes in +

    +

    We used a Charm++ group to partition the global table across the nodes in a run. Each element of the group allocates its part of the global table, generates random update keys, and sends the updates to the appropriate destination. -

    In the context of TRAM, each processor is limited to sending to and receiving +

    +

    In the context of TRAM, each processor is limited to sending to and receiving messages from a subset of the processors involved in the run. When determining where to send a particular data item (in our case table update), TRAM selects a destination from among its peers so that data items always make forward @@ -320,15 +440,16 @@

    Random Access

    separately for each destination on the network. -

    Features: TRAM, automated topology discovery.

    - +

    +

    Features: TRAM, automated topology discovery.

    +
    - - + +
    Figure: Random access in Charm++. Left: message aggregation using TRAM. Right: performance of random access on Intrepid (IBM BG/P) and Vesta (IBM BG/Q). -
    +
    @@ -338,6 +459,22 @@

    Random Access

    EP Stream

    This benchmark is a simple Charm++ implementation of the HPC Challenge stream benchmark. -

    +

    +
    + +
    +
    + + +
    + +
    + + diff --git a/content/news.html b/news/index.html similarity index 67% rename from content/news.html rename to news/index.html index b52d2ab..64ac67d 100644 --- a/content/news.html +++ b/news/index.html @@ -1,51 +1,130 @@ ---- -title: News -homec: home -tutorialc: tutorial -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help -newsc: news selected newsSelected ---- - -

    Charm++ Release 7.0.0

    -10/25/2021 -
      -
    • The Parallel Programming Laboratory is pleased to announce the next stable version of Charm++, 7.0.0, has been released!
    • -
    • This release contains many new features, bug fixes, and performance improvements.
    • -
    -

    You can view the release notes and find the source code and binaries for download here. - -

    The 19th Annual Workshop on Charm++ and its Applications (2021)

    -10/18/2021 -

    - The Parallel Programming Laboratory is hosting the 19th Annual Workshop - on Charm++ and its Applications October 18-19, 2021. - - The workshop will be streamed live. You can find the list of talks and webcast - here. -

    - - -

    Charm++ Release 6.10.2

    -08/05/2020 -
      -
    • The Parallel Programming Laboratory is pleased to announce the next stable version of Charm++, 6.10.2, has been released!
    • -
    • This release contains bug fixes.
    • -
    -

    You can view the release notes and find the source code and binaries for download here. - -

    Charm++ Release 6.10.1

    + + + + + + + Charm++: News + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +
    + +

    +Charm++ Release 6.10.1

    03/05/2020
    • The Parallel Programming Laboratory is pleased to announce the next stable version of Charm++, 6.10.1, has been released!
    • -
    • This release contains bug fixes.
    • +
    • This release contains many new features, bug fixes, and performance enhancements.

    You can view the release notes and find the source code and binaries for download here. -

    Charm++ Release 6.10.0

    + +

    +

    +Charm++ Release 6.10.0

    02/13/2020
    • The Parallel Programming Laboratory is pleased to announce the next stable version of Charm++, 6.10.0, has been released!
    • @@ -54,7 +133,9 @@

      Charm++ Release 6.10.0

      You can view the release notes and find the source code and binaries for download here. -

      Charm++ Release 6.9.0

      +

      +

      +Charm++ Release 6.9.0

      11/12/2018
      • The Parallel Programming Laboratory is pleased to announce the next stable version of Charm++, 6.9.0, has been released!
      • @@ -62,7 +143,9 @@

        Charm++ Release 6.9.0

      You can view the release notes and find the source code and binaries for download here. -

      Charm++ at SuperComputing 2018

      +

      +

      +Charm++ at SuperComputing 2018

      11/07/2018

      There are several Charm++ related talks and events at SuperComputing 2018, @@ -71,7 +154,9 @@

      Charm++ at SuperComputing 2018

      You can find a list of PPL and Charm++ talks here. -

      Charm++ Release 6.8.2

      +

      +

      +Charm++ Release 6.8.2

      10/26/2017
      • This is a backwards-compatible patch/bug-fix release, containing just a few changes.
      • @@ -79,7 +164,9 @@

        Charm++ Release 6.8.2

      More release notes can be found here. -

      Charm++ at SuperComputing 2017

      +

      +

      +Charm++ at SuperComputing 2017

      10/22/2017

      @@ -89,7 +176,9 @@

      Charm++ at SuperComputing 2017

      You can find a list of PPL and Charm++ talks here. -

      Charm++ Release 6.8.1

      +

      +

      +Charm++ Release 6.8.1

      10/13/2017

      @@ -99,12 +188,15 @@

      Charm++ Release 6.8.1

      In depth release notes as well as full version control change logs can be found here. -

      Charm++ Release 6.8.0

      +

      +

      +Charm++ Release 6.8.0

      Over 900 commits (bugfixes + improvements + cleanups) have been applied across the entire system. Major changes are described below:

      • Charm++ Features
      • -
          +
      +
      1. Calls to entry methods taking a single fixed-size parameter can now automatically be aggregated and routed through the TRAM library by marking them with the [aggregate] attribute.
      2. @@ -183,7 +275,8 @@

        Charm++ Release 6.8.0

      3. More robust derived datatype support, optimizations for truly contiguous types.
      4. ROMIO is now built on AMPI and linked in by ampicc by default.
      5. A version of HDF5 v1.10.1 that builds and runs on AMPI with virtualization - is now available at https://charm.cs.illinois.edu/gerrit/#/admin/projects/hdf5-ampi
      6. + is now available at https://charm.cs.illinois.edu/gerrit/#/admin/projects/hdf5-ampi +
      7. Improved support for performance analysis and visualization with Projections.
    • Platforms and Portability
    • @@ -204,10 +297,11 @@

      Charm++ Release 6.8.0

    • Charmrun can automatically detect rank and node count from Slurm/srun environment variables.
    • -
    +

    The complete list of issues that have been merged/resolved in 6.8.0 can be found here. The associated git commits can be viewed here.

    -

    The 15th Annual Workshop on Charm++ and its Applications (2017)

    +

    +The 15th Annual Workshop on Charm++ and its Applications (2017)

    4/5/2017

    @@ -217,7 +311,9 @@

    The 15th Annual Workshop on Charm++ and its Appli The workshop will be streamed live. You can find the list of talks and webcast here. -

    Charm++ at SuperComputing 2016

    +

    +

    +Charm++ at SuperComputing 2016

    11/14/2016

    @@ -228,7 +324,9 @@

    Charm++ at SuperComputing 2016

    You can find a list of PPL and Charm++ talks here. -

    Stable release of Charm++ version 6.7.1

    +

    +

    +Stable release of Charm++ version 6.7.1

    4/20/2016

    @@ -240,7 +338,9 @@

    Stable release of Charm++ version 6.7.1

    The source code for this release can be downloaded here -

    The 14th Annual Workshop on Charm++ and its Applications (2016)

    +

    +

    +The 14th Annual Workshop on Charm++ and its Applications (2016)

    4/19/2016

    @@ -250,7 +350,9 @@

    The 14th Annual Workshop on Charm++ and its Appli You can find the list of talks and their slides here. -

    Stable release of Charm++ version 6.7.0

    +

    +

    +Stable release of Charm++ version 6.7.0

    12/22/2015

    @@ -263,7 +365,9 @@

    Stable release of Charm++ version 6.7.0

    The source code for this release can be downloaded here -

    Stable release of Charm++ version 6.6.0

    +

    +

    +Stable release of Charm++ version 6.6.0

    09/06/2014

    @@ -275,7 +379,9 @@

    Stable release of Charm++ version 6.6.0

    The source code for this release can be downloaded here -

    Stable release of Charm++ version 6.5.1

    +

    +

    +Stable release of Charm++ version 6.5.1

    07/01/2013

    @@ -293,14 +399,14 @@

    Stable release of Charm++ version 6.5.1

    Oak Ridge National Lab, SDSC, and TACC.

    -

    Charm++ application results featured in Nature

    +

    +Charm++ application results featured in Nature

    05/30/2013

    NAMD, an application developed using Charm++, was recently used in an all-atom molecular dynamics simulation to determine the chemical structure of the HIV -Capsid, as reported in a Nature research article. The simulation +Capsid, as reported in a Nature research article. The simulation involving about 64 million atoms, was carried out on the Blue Waters system at the University of Illinois, and benefited from many features and performance optimizations implemented in Charm++. Results from the simulation @@ -319,15 +425,17 @@

    Charm++ application results featured in Nature

    Theoretical and Computational Biophysics Group led by Prof. Klaus Schulten.

    -

    Charm++ issue tracker now publicly accessible.

    +

    +Charm++ issue tracker now publicly accessible.

    04/03/2013

    -Charm++ issue tracker is now publicly accessible. +Charm++ issue tracker is now publicly accessible.

    -

    Stable release of Charm++ version 6.5.0

    +

    +Stable release of Charm++ version 6.5.0

    03/29/2013

    @@ -348,14 +456,18 @@

    Stable release of Charm++ version 6.5.0

    National Lab, NERSC, NCSA, NICS, Oak Ridge National Lab, SDSC, and TACC. -

    Fernbach Award for Profs. Kale, Schulten

    +

    +

    +Fernbach Award for Profs. Kale, Schulten

    10/10/2012

    Profs. Kale was named one of the winners of the Sidney Fernbach Award, to be presented at Supercomputing 2012. -

    Local SIAM chapter hosting Charm++ Tutorial

    +

    +

    +Local SIAM chapter hosting Charm++ Tutorial

    04/27/2012

    @@ -380,7 +492,9 @@

    Local SIAM chapter hosting Charm++ Tutorial

    -

    First Beta of Charm++ version 6.4.0 released

    +

    +

    + First Beta of Charm++ version 6.4.0 released

    03/12/2012

    @@ -397,3 +511,18 @@

    First Beta of Charm++ version 6.4.0 released

    here, and compiled binaries for our autobuild platforms can be found here. + +

    +
    +
    + + +
    + + + diff --git a/othermedia/index.html b/othermedia/index.html new file mode 100644 index 0000000..21fc58b --- /dev/null +++ b/othermedia/index.html @@ -0,0 +1,152 @@ + + + + + + + Charm++: Other Learning Material + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/ppt_pdfs/03_BasicCharm.pdf b/ppt_pdfs/03_BasicCharm.pdf similarity index 100% rename from content/ppt_pdfs/03_BasicCharm.pdf rename to ppt_pdfs/03_BasicCharm.pdf diff --git a/content/ppt_pdfs/1_IntroAndComputingLandscape.pptx b/ppt_pdfs/1_IntroAndComputingLandscape.pptx similarity index 100% rename from content/ppt_pdfs/1_IntroAndComputingLandscape.pptx rename to ppt_pdfs/1_IntroAndComputingLandscape.pptx diff --git a/content/ppt_pdfs/1_IntroAndComputingLandscapePDF.pdf b/ppt_pdfs/1_IntroAndComputingLandscapePDF.pdf similarity index 100% rename from content/ppt_pdfs/1_IntroAndComputingLandscapePDF.pdf rename to ppt_pdfs/1_IntroAndComputingLandscapePDF.pdf diff --git a/content/ppt_pdfs/2007CharmWkshopProjTutorial.pdf b/ppt_pdfs/2007CharmWkshopProjTutorial.pdf similarity index 100% rename from content/ppt_pdfs/2007CharmWkshopProjTutorial.pdf rename to ppt_pdfs/2007CharmWkshopProjTutorial.pdf diff --git a/content/ppt_pdfs/2_CharmConceptsAndBenefits.pptx b/ppt_pdfs/2_CharmConceptsAndBenefits.pptx similarity index 100% rename from content/ppt_pdfs/2_CharmConceptsAndBenefits.pptx rename to ppt_pdfs/2_CharmConceptsAndBenefits.pptx diff --git a/content/ppt_pdfs/2_CharmConceptsAndBenefitsPDF.pdf b/ppt_pdfs/2_CharmConceptsAndBenefitsPDF.pdf similarity index 100% rename from content/ppt_pdfs/2_CharmConceptsAndBenefitsPDF.pdf rename to ppt_pdfs/2_CharmConceptsAndBenefitsPDF.pdf diff --git a/content/ppt_pdfs/ArraySections.pptx b/ppt_pdfs/ArraySections.pptx similarity index 100% rename from content/ppt_pdfs/ArraySections.pptx rename to ppt_pdfs/ArraySections.pptx diff --git a/content/ppt_pdfs/BasicCharesAndChareArrays.pdf b/ppt_pdfs/BasicCharesAndChareArrays.pdf similarity index 100% rename from content/ppt_pdfs/BasicCharesAndChareArrays.pdf rename to ppt_pdfs/BasicCharesAndChareArrays.pdf diff --git a/content/ppt_pdfs/CharmChapter.pdf b/ppt_pdfs/CharmChapter.pdf similarity index 100% rename from content/ppt_pdfs/CharmChapter.pdf rename to ppt_pdfs/CharmChapter.pdf diff --git a/content/ppt_pdfs/CharmDebug-charmworkshop2009_tutorial.pdf b/ppt_pdfs/CharmDebug-charmworkshop2009_tutorial.pdf similarity index 100% rename from content/ppt_pdfs/CharmDebug-charmworkshop2009_tutorial.pdf rename to ppt_pdfs/CharmDebug-charmworkshop2009_tutorial.pdf diff --git a/content/ppt_pdfs/FuturesAndBareThreads.pptx b/ppt_pdfs/FuturesAndBareThreads.pptx similarity index 100% rename from content/ppt_pdfs/FuturesAndBareThreads.pptx rename to ppt_pdfs/FuturesAndBareThreads.pptx diff --git a/content/ppt_pdfs/LJdynamics_DesignExample.pptx b/ppt_pdfs/LJdynamics_DesignExample.pptx similarity index 100% rename from content/ppt_pdfs/LJdynamics_DesignExample.pptx rename to ppt_pdfs/LJdynamics_DesignExample.pptx diff --git a/content/ppt_pdfs/LiveViz.ppt b/ppt_pdfs/LiveViz.ppt similarity index 100% rename from content/ppt_pdfs/LiveViz.ppt rename to ppt_pdfs/LiveViz.ppt diff --git a/content/ppt_pdfs/MappingThenDebuggingPartOne.pptx b/ppt_pdfs/MappingThenDebuggingPartOne.pptx similarity index 100% rename from content/ppt_pdfs/MappingThenDebuggingPartOne.pptx rename to ppt_pdfs/MappingThenDebuggingPartOne.pptx diff --git a/content/ppt_pdfs/MessagesAndGroups.pptx b/ppt_pdfs/MessagesAndGroups.pptx similarity index 100% rename from content/ppt_pdfs/MessagesAndGroups.pptx rename to ppt_pdfs/MessagesAndGroups.pptx diff --git a/content/ppt_pdfs/MessagesChapter5.pdf b/ppt_pdfs/MessagesChapter5.pdf similarity index 100% rename from content/ppt_pdfs/MessagesChapter5.pdf rename to ppt_pdfs/MessagesChapter5.pdf diff --git a/content/ppt_pdfs/TaskParallelismAndGrainSize.pdf b/ppt_pdfs/TaskParallelismAndGrainSize.pdf similarity index 100% rename from content/ppt_pdfs/TaskParallelismAndGrainSize.pdf rename to ppt_pdfs/TaskParallelismAndGrainSize.pdf diff --git a/content/ppt_pdfs/ThreadedAndSyncMethods.pptx b/ppt_pdfs/ThreadedAndSyncMethods.pptx similarity index 100% rename from content/ppt_pdfs/ThreadedAndSyncMethods.pptx rename to ppt_pdfs/ThreadedAndSyncMethods.pptx diff --git a/content/ppt_pdfs/ThreadedMethods.pdf b/ppt_pdfs/ThreadedMethods.pdf similarity index 100% rename from content/ppt_pdfs/ThreadedMethods.pdf rename to ppt_pdfs/ThreadedMethods.pdf diff --git a/content/ppt_pdfs/charmEncyclopedia.pdf b/ppt_pdfs/charmEncyclopedia.pdf similarity index 100% rename from content/ppt_pdfs/charmEncyclopedia.pdf rename to ppt_pdfs/charmEncyclopedia.pdf diff --git a/content/ppt_pdfs/greedyVsRefineB.pptx b/ppt_pdfs/greedyVsRefineB.pptx similarity index 100% rename from content/ppt_pdfs/greedyVsRefineB.pptx rename to ppt_pdfs/greedyVsRefineB.pptx diff --git a/content/ppt_pdfs/lec5-charearrays.pdf b/ppt_pdfs/lec5-charearrays.pdf similarity index 100% rename from content/ppt_pdfs/lec5-charearrays.pdf rename to ppt_pdfs/lec5-charearrays.pdf diff --git a/content/ppt_pdfs/lec6-sdag.pdf b/ppt_pdfs/lec6-sdag.pdf similarity index 100% rename from content/ppt_pdfs/lec6-sdag.pdf rename to ppt_pdfs/lec6-sdag.pdf diff --git a/content/ppt_pdfs/lec9-LoadBalancing.pdf b/ppt_pdfs/lec9-LoadBalancing.pdf similarity index 100% rename from content/ppt_pdfs/lec9-LoadBalancing.pdf rename to ppt_pdfs/lec9-LoadBalancing.pdf diff --git a/progmodel/index.html b/progmodel/index.html new file mode 100644 index 0000000..181bd02 --- /dev/null +++ b/progmodel/index.html @@ -0,0 +1,194 @@ + + + + + + + Charm++: Programming Model + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    +
    + +

    Programming Model

    + +

    Object-based program design

    +
      +
    • Express algorithms and program designs using objects
    • +
    • Decompose computation into interacting object collections
    • +
    • Write native C++ code
    • +
    • Use all C++ capabilities (OO, generics etc)
    • +
    + +

    Globally addressable objects

    +
      +
    • Some classes are elevated into global visibility
    • +
    • Objects of these classes can be addressed from any processor
    • +
    • Parallel control flow primarily involves these globally visible objects
    • +
    + +

    Globally invocable methods

    +
      +
    • Some methods of globally visible classes are also elevated into global visibility
    • +
    • Only these methods of a globally visible object can be invoked from any processor
    • +
    + +

    Asynchronous methods

    +
      +
    • Objects in computation interact using method invocations
    • +
    • Do not return any data
    • +
    • Method invocation does not block
    • +
    • No promise of immediate execution
    • +
    + +

    Object collections

    +
      +
    • Collections of objects of a given type can be created, managed and addressed collectively
    • +
    • Collections are indexed
    • +
    • Each object in collection is globally visible. can be addressed via the tuple of collection handle and object index.
    • +
    • Method invocations on such collections are implicit broadcasts to all objects
    • +
    + +
    + +
    Figure: User view and system view in Charm++
    +
    + +

    Object placement

    +
      +
    • Easily control placement of objects on processors
    • +
    + +

    Migratable / serializable objects

    +
      +
    • Objects can be migrated
    • +
    • Any data in program can be migrated
    • +
    • Simply needs a serialization function
    • +
    + +

    Decompose data across object collection

    +
      +
    • Typical data decomposition is by decomposing the data across multiple objects of a single class
    • +
    • Massively parallel computations on each portion of the data can be performed by simply invoking methods on the whole collection
    • +
    + +

    Decompose data manipulation across methods

    + +

    Easily task parallelism

    + + +
    +
    + + +
    + + + diff --git a/layouts/default.html b/release/index.html similarity index 74% rename from layouts/default.html rename to release/index.html index 6238039..28e4c9a 100644 --- a/layouts/default.html +++ b/release/index.html @@ -1,14 +1,15 @@ + - Charm++: <%= @item[:title] %> + Charm++: Release Info - - - + + + - - - + + + - + @@ -33,7 +34,7 @@
    + +
+
- <%= yield %> + +

Release Information

+ + +
- + diff --git a/content/stylesheet.css b/stylesheet.css similarity index 100% rename from content/stylesheet.css rename to stylesheet.css diff --git a/tools/index.html b/tools/index.html new file mode 100644 index 0000000..b12ceb6 --- /dev/null +++ b/tools/index.html @@ -0,0 +1,208 @@ + + + + + + + Charm++: Tools + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+

Tools

+
+
+

Parallel Performance Analysis: Projections

+
+
+ Projections is a performance analysis/visualization framework that helps you understand and investigate performance-related problems in your parallel (CHARM++) application. It is a framework with an event tracing component with features that allow you to control the amount of information generated and to a lesser degree the amount of perturbation the tracing activities introduce into the application. It also has a Java-based visualization and analysis component with various views that will help present the performance information in a visually useful manner. The research page can be found here. +
+ + +
+ + The above two figures show the timeline and time-profile view in Projections. In the timeline view, user can see the messages between processors. In the time-profile view, user can observe the usage of the application as time goes by. +
+
+
+
+
+

The latest development version of Projections can be downloaded directly from our source archive. The Git version control system is used, which is available from here.

+
    +
  1. +

    Check out Projections from the repository:

    +
    git clone https://github.com/UIUC-PPL/projections
    +
  2. +
  3. +

    This will create a directory named projections. Move to this directory:

    +
    cd projections
    +
  4. +
  5. +

    And now build Projections:

    +
    make
    +
  6. +
+
+
+
+ The manual can be found here. +
+
+ +
+
+

Parallel Debugging: Charm Debug

+
+
Charm++ offers a variety of parallel debugging options, from the extremely basic to the extremely sophisticated. The traditional debugging methods, such as logging (via the CkPrintf routine) and interactive debugging (via the "++debug" command line option) are supported under Charm++. +
+
+ In addition, Charm++ offers several additional features designed to simplify application development. Linking with "-memory paranoid" checks all dynamic heap allocation calls for common errors, such as double-delete, random-delete, read-after-delete, buffer over- and under-write errors. Charm++, when compiled without "-DCMK_OPTIMIZE", contains hundreds of assertions to catch invalid parameters and uninitialized data passed to API routines. +
+
+ Charm Debug is a sophisticated parallel debugger, with the ability to + set breakpoints, examine variables, objects, and messages across the + entire machine. The design of this debugger is described in the research page. +
+
+
+ +
+

The latest development version of Charm Debug can be downloaded directly from our source archive. The Git version control system is used, which is available from here.

+
    +
  1. +

    Check out Charm Debug from the repository:

    +
    git clone https://github.com/UIUC-PPL/ccs_tools
    +
  2. +
  3. +

    This will create a directory named ccs_tools. Move to this directory:

    +
    cd ccs_tools
    +
  4. +
  5. +

    And now build Charm Debug:

    +
    ant
    +
  6. +
+
+
+
+ The manual can be found here. +
+
+
+ +
+
+ + +
+ + + diff --git a/content/tutorial/ArrayHelloWorld.html b/tutorial/ArrayHelloWorld.html similarity index 60% rename from content/tutorial/ArrayHelloWorld.html rename to tutorial/ArrayHelloWorld.html index 4685916..53e1211 100644 --- a/content/tutorial/ArrayHelloWorld.html +++ b/tutorial/ArrayHelloWorld.html @@ -1,14 +1,117 @@ ---- -title: Tutorial -homec: home -tutorialc: tutorial selected tutorialSelected -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - + + + + + + + Charm++: Tutorial + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+

Array "Hello World": A Slightly More Advanced "Hello World" Program

@@ -81,15 +184,15 @@

How the Array "Hello World" Program Works

- -
- + + -
+
+
Figure: Control Flow of the Array "Hello World" Program
- +

There are two chare classes in this version of the "Hello World" program (aka. the Array @@ -139,7 +242,7 @@

How the Array "Hello World" Program Works

(the Broadcast "Hello World" Program) will actually exhibit parallelism.

-
+

Array "Hello World" Code

@@ -154,18 +257,18 @@

The "Hello" Chare Class

- +
-
+ - +
- + -
Header File (hello.h)Header File (hello.h)
+
#ifndef __HELLO_H__
@@ -173,14 +276,14 @@

The "Hello" Chare Class


class Hello : public CBase_Hello {

-  public:
+  public:

-   /// Constructors ///
-   Hello();
-   Hello(CkMigrateMessage *msg);
+   /// Constructors ///
+   Hello();
+   Hello(CkMigrateMessage *msg);

-   /// Entry Methods ///
-   void sayHi(int from);
+   /// Entry Methods ///
+   void sayHi(int from);
};

#endif //__HELLO_H__ @@ -191,20 +294,20 @@

The "Hello" Chare Class

- +
- + -
Interface File (hello.ci)Interface File (hello.ci)
+
module hello {

-   array [1D] Hello {
-     entry Hello();
-     entry void sayHi(int);
-   };
+   array [1D] Hello {
+     entry Hello();
+     entry void sayHi(int);
+   };

};
@@ -218,12 +321,12 @@

The "Hello" Chare Class

- +
- + -
Source File (hello.C)Source File (hello.C)
+
#include "hello.decl.h"
@@ -236,9 +339,9 @@

The "Hello" Chare Class


Hello::Hello() {
-   // Nothing to do when the Hello chare object is created.
-   // This is where member variables would be initialized
-   // just like in a C++ class constructor.
+   // Nothing to do when the Hello chare object is created.
+   // This is where member variables would be initialized
+   // just like in a C++ class constructor.
}

@@ -250,21 +353,21 @@

The "Hello" Chare Class


void Hello ::sayHi(int from) {

-   // Have this chare object say hello to the user.
-   CkPrintf("\"Hello\" from Hello chare # %d on "
-            "processor %d (told by %d).\n",
-            thisIndex, CkMyPe(), from);
+   // Have this chare object say hello to the user.
+   CkPrintf("\"Hello\" from Hello chare # %d on "
+            "processor %d (told by %d).\n",
+            thisIndex, CkMyPe(), from);

-   // Tell the next chare object in this array of chare objects
-   // to also say hello. If this is the last chare object in
-   // the array of chare objects, then tell the main chare
-   // object to exit the program.
+   // Tell the next chare object in this array of chare objects
+   // to also say hello. If this is the last chare object in
+   // the array of chare objects, then tell the main chare
+   // object to exit the program.
-   if (thisIndex < (numElements - 1))
-     thisProxy[thisIndex + 1].sayHi(thisIndex);
-   else
-     mainProxy.done();
+   if (thisIndex < (numElements - 1))
+     thisProxy[thisIndex + 1].sayHi(thisIndex);
+   else
+     mainProxy.done();
}

#include "hello.def.h" @@ -285,18 +388,18 @@

The "Main" Chare Class

- +
-
+ - +
- + -
Header File (main.h)Header File (main.h)
+
#ifndef __MAIN_H__
@@ -304,14 +407,14 @@

The "Main" Chare Class


class Main : public CBase_Main {

-  public:
+  public:

-   /// Constructors ///
-   Main(CkArgMsg* msg);
-   Main(CkMigrateMessage* msg);
+   /// Constructors ///
+   Main(CkArgMsg* msg);
+   Main(CkMigrateMessage* msg);

-   /// Entry Methods ///
-   void done();
+   /// Entry Methods ///
+   void done();
};

#endif //__MAIN_H__ @@ -322,25 +425,25 @@

The "Main" Chare Class

- +
- + -
Interface File (main.ci)Interface File (main.ci)
+
mainmodule main {

-   readonly CProxy_Main mainProxy;
-   readonly int numElements;
+   readonly CProxy_Main mainProxy;
+   readonly int numElements;

-   extern module hello;
+   extern module hello;

-   mainchare Main {
-     entry Main(CkArgMsg* msg);
-     entry void done();
-   };
+   mainchare Main {
+     entry Main(CkArgMsg* msg);
+     entry void done();
+   };

};
@@ -354,12 +457,12 @@

The "Main" Chare Class

- +
- + -
Source File (main.C)Source File (main.C)
+
#include "main.decl.h"
@@ -373,48 +476,48 @@

The "Main" Chare Class

// Entry point of Charm++ application
Main::Main(CkArgMsg* msg) {

-   numElements = 5; // Default numElements to 5
+   numElements = 5; // Default numElements to 5

-   // There should be 0 or 1 command line arguments.
-   // If there is one, it is the number of "Hello"
-   // chares that should be created.
+   // There should be 0 or 1 command line arguments.
+   // If there is one, it is the number of "Hello"
+   // chares that should be created.
-   if (msg->argc > 1)
-     numElements = atoi(msg->argv[1]);
+   if (msg->argc > 1)
+     numElements = atoi(msg->argv[1]);

-   // We are done with msg so delete it.
+   // We are done with msg so delete it.
-   delete msg;
+   delete msg;

-   // Display some info about this execution
-   // for the user.
+   // Display some info about this execution
+   // for the user.
-   CkPrintf("Running \"Hello World\" with %d elements "
-            "using %d processors.\n",
-            numElements, CkNumPes());
+   CkPrintf("Running \"Hello World\" with %d elements "
+            "using %d processors.\n",
+            numElements, CkNumPes());

-   // Set the mainProxy readonly to point to a
-   // proxy for the Main chare object (this
-   // chare object).
+   // Set the mainProxy readonly to point to a
+   // proxy for the Main chare object (this
+   // chare object).
-   mainProxy = thisProxy;
+   mainProxy = thisProxy;

-   // Create the array of Hello chare objects. NOTE: The
-   // 'helloArray' object that is returned by 'ckNew()' is
-   // actually a Proxy object to the array.
+   // Create the array of Hello chare objects. NOTE: The
+   // 'helloArray' object that is returned by 'ckNew()' is
+   // actually a Proxy object to the array.
-   CProxy_Hello helloArray = CProxy_Hello::ckNew(numElements);
+   CProxy_Hello helloArray = CProxy_Hello::ckNew(numElements);

-   // Invoke the "sayHi()" entry method on the first
-   // element of the helloArray array of chare objects.
+   // Invoke the "sayHi()" entry method on the first
+   // element of the helloArray array of chare objects.
-   helloArray[0].sayHi(-1);
+   helloArray[0].sayHi(-1);
}

@@ -428,7 +531,7 @@

The "Main" Chare Class

// to exit.
void Main::done() {
-   CkExit();
+   CkExit();
}

#include "main.def.h" @@ -454,12 +557,12 @@

Makefile

- +
- + - @@ -510,10 +613,10 @@

Output

-
MakefileMakefile
+
CHARMDIR = [put Charm++ install directory here]
@@ -469,24 +572,24 @@

Makefile

all: hello

hello : main.o hello.o
-    $(CHARMC) -language charm++ -o hello main.o hello.o
+    $(CHARMC) -language charm++ -o hello main.o hello.o

main.o : main.C main.h main.decl.h main.def.h hello.decl.h
-    $(CHARMC) -o main.o main.C
+    $(CHARMC) -o main.o main.C

main.decl.h main.def.h : main.ci
-    $(CHARMC) main.ci
+    $(CHARMC) main.ci

hello.o : hello.C hello.h hello.decl.h hello.def.h main.decl.h
-    $(CHARMC) -o hello.o hello.C
+    $(CHARMC) -o hello.o hello.C

hello.decl.h hello.def.h : hello.ci
-    $(CHARMC) hello.ci
+    $(CHARMC) hello.ci

clean:
-    rm -f main.decl.h main.def.h main.o
-    rm -f hello.decl.h hello.def.h hello.o
-    rm -f hello charmrun +    rm -f main.decl.h main.def.h main.o
+    rm -f hello.decl.h hello.def.h hello.o
+    rm -f hello charmrun
+
- - - - + + - @@ -598,3 +701,17 @@

Output

however, in many parallel applications, the various subtasks in the computation itself are usually free to execute in any order per the dependencies in the calculation.

+ + + + + + + + + diff --git a/tutorial/ArrayMapping.html b/tutorial/ArrayMapping.html new file mode 100644 index 0000000..6ca58e3 --- /dev/null +++ b/tutorial/ArrayMapping.html @@ -0,0 +1,197 @@ + + + + + + + Charm++: Tutorial + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + +

Mapping Chare Array Elements to Physical Processors

+ +

+ For various reasons (performance, etc.) the programmer may wish to control where the initial chare + array elements in a chare array reside (that is, on which physical processor they are located). There + are multiple methods the programmer can use to control the initial placement of chare array elements + in a chare array on the physical processors. +

+ + +

Inserting Individual Chare Array Elements

+ +

+ The most direct method of controlling which processors the chare array elements are located on + initially is to explicitly create the chare array element one-by-one, specifying with processor + it should be located on during creation. This can be done by creating the chare array with a + call to myArrayProxy = CProxy_myArrayClass::CkNew() with no arguments (or the number of elements set to zero + if a CkArrayOptions object is used). Once the chare array has been created, individual chare + array elements can be inserted by using the myArrayProxy[i].insert(pe) function call where i + is the index of the chare array element to create and pe is the processor number on which the + chare array element should be created on. Once all chare array elements have been added to the array, + the myArrayProxy::doneInserting() call must be called to indicate to the Charm++ Runtime System + that the initial elements of the chare array have been added. Additional chare array elements can be + added at a later time followed by an additional call to myArrayProxy::doneInserting(). +

+ + +

Using the CkArrayMap Class

+ +

+ Chare arrays also have an associated CkArrayMap class which maps indexes in the arrays + to specific processors. By default, a round-robin (RRMap) map object is used. + When the chare array is being created, the programmer can specify which map object the array + should use via a call to CkArrayOptions::setMap(). For example, instead of round-robin, + the programmer might use the BlockMap map class to have the objects mapped in a blocked + scheme. +

+ +

+ The programmer may create their own map object to be used for a chare array. Simply create a + child class of the CkArrayMap class. The important member functions are outlined below. Then, + create an instance of the class and associate the map object with the chare array (via CkArrayOptions) + during array creation time. +

+ +

+ CkArrayMap::populateInitial(): This function is responsible for creating all of the + initial array elements located on the physical processor. That is, it is called on every processor + and makes a call to the chare array manager's insertInitial() function for each of the chare + array elements local to that processor (triggering the creation of the actual chare array elements on + the physical processor). This is a virtual function; the child class can provide + its own implementation of this function. However, one is provided by CkArrayMap itself which + simply uses the CkArrayMap::procNum() function to decide where the chare array elements + initially reside. +

+ +

+ CkArrayMap::procNum(): This function simply maps an array index (input) to the number + of the physical processor (output). For example, the round-robin map class's (RRMap) version + of this function simply returns 'index % CkNumPes()'. This function is a pure virtual member + function. The child class must provide an implementation of this function. +

+ +

+ CkArrayMap::homePe(): This function is similar to the procNum() function, however, the value + returned indicates which physical processor is the home processor for the chare array element. + This is a virtual function, the child class can provide its own implementation of this function. However, + one is provided by CkArrayMap itself which simply returns the same value that procNum() returns. +

+
+
+ + +
+ + + diff --git a/tutorial/ArraySections.html b/tutorial/ArraySections.html new file mode 100644 index 0000000..7caf6e9 --- /dev/null +++ b/tutorial/ArraySections.html @@ -0,0 +1,252 @@ + + + + + + + Charm++: Tutorial + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + +

Array Sections

+ +

+ Sometimes only certain elements of a chare array need to have messages sent to them (i.e. their entry + methods invoked). Furthermore, sometimes the same subset of chares in the chare array may need to + have this occur many times throughout the course of the application execution. + Array sections are a way of specifying a arbitrary subset of elements in a chare array. Once the + array section has been defined, it can be used to multicast a message to the members of the chare + array subset. +

+ + +

Defining and Using Chare Array Sections

+ +

+ The first way of creating array sections is to specify a triplet of numbers to the constructor of the + array section proxy's constructor. The triplet contains three values: the starting index, the ending + index, and a stride. One triplet can be given for each dimension of the array. For example, consider + a 1D chare array. To create array sections, one containing all of the even numbered indexes (including + index 0) and one containing all the odd numbered indexes, the following code could be used. +

+ +
+
+
$ ./charmrun +p3 ./hello 10
@@ -531,7 +634,7 @@

Output

+
$ ./charmrun +p3 ./hello 10
@@ -552,12 +655,12 @@

Output

Output for Run 1Output for Run 2Output for Run 1Output for Run 2
+ Figure: Output of the Array "Hello World" Program
+ + + + + + + +
+ + // Create a chare array
+ int arrayLength = ...;
+ CProxy_myArrayClass arrayProxy = CProxy_myArrayClass::ckNew(arrayLength);
+
+ // Create the array section proxies
+ CProxySection_myArrayClass arraySectionProxy_even =
+   CProxySection_myArrayClass::ckNew(arrayProxy, 0, arrayLength - 1, 2);
+ CProxySection_myArrayClass arraySectionProxy_odd =
+   CProxySection_myArrayClass::ckNew(arrayProxy, 1, arrayLength - 1, 2);
+
+ // Invoked entry methods on all of the members of the array sections of myArray
+ arraySectionProxy_even.myEntryMethod(...); // Invoke myEntryMethod() on the even members
+ arraySectionProxy_odd.myEntryMethod1(...); // Invoke myEntryMethod1() on the odd members
+
+
+ Figure 1: Code to create even and odd array sections for a 1D chare array +
+
+ +

+ While the triplet method is a quick and easy way of quickly defining large subsets of chare array elements, + the subsets need to be regular. This is not always sufficient to identify useful subsets. Another method + of defining a subset of elements is to create a vector of indexes and then create the array section using + the vector of indexes. For example, the following code will also create an array section containing all of + the odd index elements in the chare array, however, it will do it by creating a vector with all the odd + indexes. +

+ +
+ + + + + + + + +
+ + // Create a chare array
+ int arrayLength = ...;
+ CProxy_myArrayClass arrayProxy = CProxy_myArrayClass::ckNew(arrayLength);
+
+ // Create the vector of odd indexes
+ CkVec<CkArrayIndex1D> indexVector;
+ for (int i = 0; i < arrayLength; i++)
+   if (i % 2 == 1) // If an odd index, add it to the vector
+     indexVector.push_back(CkArrayIndex1D(i));
+
+ // Create the array section from the vector of indexes
+ CProxySection_myArrayClass arraySectionProxy_odd =
+   CProxySection_myArrayClass::ckNew(arrayProxy, indexVector.getVec(), indexVector.size());
+
+ // Invoke myEntryMethod1() on all of the odd members of myArray
+ arraySectionProxy_odd.myEntryMethod1(...);
+
+
+ Figure 2: Code to create an odd array section for a 1D chare array using a vector of indexes +
+
+ + + + + +
+ + + +
+ Figure 3: Indexing scheme for array proxies and array section proxies +
+ +

Indexing for Individual Elements of Array Sections

+ +

+ The individual elements in the array section can be index individually. Starting with index zero, each + member of the subset of elements (i.e. the array section members) can be individually indexed according + to the scheme presented in Figure 3. +

+ + +

More Information

+ +

+ For more information on callbacks, please see + Section 3.8.13: Array Section of the + The Charm++ Programming Language Manual +

+ +
+ + + + + + + diff --git a/content/tutorial/Basic2DJacobi.html b/tutorial/Basic2DJacobi.html similarity index 55% rename from content/tutorial/Basic2DJacobi.html rename to tutorial/Basic2DJacobi.html index 8aac592..2a12c8c 100644 --- a/content/tutorial/Basic2DJacobi.html +++ b/tutorial/Basic2DJacobi.html @@ -1,25 +1,128 @@ ---- -title: Tutorial -homec: home -tutorialc: tutorial selected tutorialSelected -applicationsc: applications -miniAppsc: miniApps -downloadc: download -toolsc: tools -helpc: help ---- - + + + + + + + Charm++: Tutorial + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+

2D Jacobi Program

- -
+ +
- - -
+ + -
// Assumed variable declarations
@@ -31,68 +134,68 @@

2D Jacobi Program

// Outer-Loop - Keep doing iterations
do {

-   // Reset maxDiff
-   maxDiff = 0.0;
+   // Reset maxDiff
+   maxDiff = 0.0;

-   // Update all values in the matrix ("inner-loop")
-   for (int x = 0; x < N; x++) {
-     for (int y = 0; y < N; y++) {
+   // Update all values in the matrix ("inner-loop")
+   for (int x = 0; x < N; x++) {
+     for (int y = 0; y < N; y++) {

-       // Start with "self" value
-       double sum = inMatrix[x][y];
-       int divisor = 1;
+       // Start with "self" value
+       double sum = inMatrix[x][y];
+       int divisor = 1;

-       // Add the neighbors' values to average calculation
-       if (x > 0)     { sum += inMatrix[x - 1][y]; divisor++; }
-       if (x < N - 1) { sum += inMatrix[x + 1][y]; divisor++; }
-       if (y > 0)     { sum += inMatrix[x][y - 1]; divisor++; }
-       if (y < N - 1) { sum += inMatrix[x][y + 1]; divisor++; }
+       // Add the neighbors' values to average calculation
+       if (x > 0)     { sum += inMatrix[x - 1][y]; divisor++; }
+       if (x < N - 1) { sum += inMatrix[x + 1][y]; divisor++; }
+       if (y > 0)     { sum += inMatrix[x][y - 1]; divisor++; }
+       if (y < N - 1) { sum += inMatrix[x][y + 1]; divisor++; }

-       // Calculate new value, difference, and update maxDiff
-       outMatrix[x][y] = sum / ((double)divisor);
-       double diff = abs(inMatrix[x][y] - outMatrix[x][y]);
-       if (diff > maxDiff) maxDiff = diff;
-     }
-   }
+       // Calculate new value, difference, and update maxDiff
+       outMatrix[x][y] = sum / ((double)divisor);
+       double diff = abs(inMatrix[x][y] - outMatrix[x][y]);
+       if (diff > maxDiff) maxDiff = diff;
+     }
+   }

-   // Swap in and out
-   double* tmp = inMatrix;
-   inMatrix = outMatrix;
-   outMatrix = tmp;
+   // Swap in and out
+   double* tmp = inMatrix;
+   inMatrix = outMatrix;
+   outMatrix = tmp;

- } while (maxDiff > THRESHOLD); + } while (maxDiff > THRESHOLD);
+
Figure 1: C++ Code for 2D Jacobi Calculation
+
- - -
- + + -
+
+
Figure 2: Decomposition of 2D Jacobi (Parallel Data Structure)
+
- -
+ + -
- +
+
Figure 3: Communication Pattern (Single Chare, Single Step)
@@ -137,7 +240,7 @@

Decomposing a Single Outer-Loop Iteration

The main decision is how to decompose the iterations of the inner-loop into sets (with the idea being that a single chare object will perform all inner-loop iterations within a single set). For now, we will ignore the code in the inner-loop that updates maxDiff (i.e. - "if (diff > maxDiff) maxDiff = diff;"). For this example, we will break down + "if (diff > maxDiff) maxDiff = diff;"). For this example, we will break down the matrix into blocks (that is several 2D sub-matrices). Each chare object will have a single 2D sub-matrix and perform the corresponding iterations of the inner-loop on those matrix elements. Figure 2 depicts this decomposition visually for the entire matrix. @@ -189,7 +292,8 @@

Decomposing a Single Outer-Loop Iteration

-

Handling maxDiff

+

Handling maxDiff +

The only challenge to parallelizing the inner-loop iterations is the calculation of the @@ -219,7 +323,8 @@

Implement It

Try implementing the 2D Jacobi calculation in Charm++. To get you started, here are some hints that you might find useful: -