Repository files navigation

PSycloneBench

Various small benchmarks used to inform the development of the PSyclone Domain-Specific Compiler.

Obtaining the Code

The benchmark codes contained in this project use the dl_timer library for execution timing and the dl_esm_inf infrastructure. Some implementation also have FortCL or Kokkos as dependencies. All these packages are included within the PSycloneBench repository as git submodules. As such, when cloning the repository you need to use the --recursive flag in order to get the source code of that submodule, e.g.:

git clone --recursive https://github.com/stfc/PSycloneBench

If you forget to do this then your cloned repository will contain empty PSycloneBench/shared/dl_timer, dl_esm_inf, kokkos and FortCL directories. To populate them you can do:

cd PSycloneBench
git submodule init
git submodule update

Benchmarks

Are contained in directories beneath the benchmarks directory.

NEMOLite2D

benchmarks/nemo/nemolite2d contains various versions of the NEMOLite2D benchmark which is based upon the free-surface component of the NEMO ocean model (www.nemo-ocean.eu). This was originally constructed by Hedong Liu of the National Oceanography Centre, Liverpool, UK.

Manual implementations

The manual_versions directory contains various implementations of NEMOLite2D where the application has been split-up into Algorithm PSy and Kernel layers but the PSy layer has been written manually. See the README.md file in the NemoLite2D manual_versions directory for more information.

(Note that the OpenACC versions are based upon work by Jeremy Appleyard of NVIDIA).

PSyclone code generation

The psykal directory contains the version of NEMOLite2D that uses PSyclone to generate the PSy layer. Currently serial and OpenMP versions may be generated.

NEMO Tracer Advection

The benchmarks/nemo/tracer_advection directory contains various versions of a benchmark based on one of the tracer-advection routines in the NEMO code base. The version in the original directory was supplied by Silvia Mocavero of CMCC.

Shallow

benchmarks/shallow contains various versions of the Shallow benchmark, originally developed by Paul Swarztrauber of NCAR. In summary these are:

  • SEQ/original - original single-file serial version in Fortran.
  • SEQ - PSyKAl version of Shallow including option to build with PSyclone.
  • OMP - manual OpenMP implementation in C.

Please see the README.md files in the individual directories for more information.

Building

The Makefiles for all of the various benchmarks pick-up which compiler to use (and associated flags) from environment variables. Bash scripts to set these variables for a variety of compilers are in the compiler_setup directory. When benchmarking you will need to edit the relevant file and ensure that the compiler flags are set appropriately. The flags that give the best performance for a particular compiler can vary from benchmark to benchmark and even by problem size.

In order to use the settings for a particular compiler, you must source the appropriate Bash script. e.g. for the Intel compiler (assuming you are running a Bash shell):

> . compiler_setup/intel.sh

Again, see the README.md file included with each benchmark.

A top-level Makefile is provided that has targets to build all of the various NEMOLite2D and Shallow benchmarks for CPU:

  • all - build all targets that do not require PSyclone
  • all_gen - build all targets that use PSyclone code generation
  • shallow_cpu - build all CPU versions of Shallow that do not require PSyclone
  • shallow_gen - build Shallow using PSyclone for code generation
  • nemolite_cpu - build all CPU versions of NEMOLite2D that do not require PSyclone
  • nemolite_gen - build NEMOLite2D using PSyclone for code generation

Since the set-up for OpenACC and OpenCL is more involved, it does not attempt to compile the benchmarks using those languages. See the Makefiles in the individual benchmark folders for those cases.

LFRic Small Matrix Vector Multiplication

benchmarks/smallmatvec contains multiple implementations of the matrix-vector multiplication operation done in the LFRic application.

Currently it only contains one manual implementation:

  • openmp - Configurable implementation using OpenMP that test the vectorization and threading capabilities of multiple versions of the kernel and multiple parallel traversing strategies.

Note that this benchmark does not use the compiler_setup settings yet.

About

Various benchmarks used to inform PSyclone optimisations

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

PSycloneBench

Various small benchmarks used to inform the development of the PSyclone Domain-Specific Compiler.

Obtaining the Code

The benchmark codes contained in this project use the dl_timer library for execution timing and the dl_esm_inf infrastructure. Some implementation also have FortCL or Kokkos as dependencies. All these packages are included within the PSycloneBench repository as git submodules. As such, when cloning the repository you need to use the --recursive flag in order to get the source code of that submodule, e.g.:

git clone --recursive https://github.com/stfc/PSycloneBench

If you forget to do this then your cloned repository will contain empty PSycloneBench/shared/dl_timer, dl_esm_inf, kokkos and FortCL directories. To populate them you can do:

cd PSycloneBench
git submodule init
git submodule update

Benchmarks

Are contained in directories beneath the benchmarks directory.

NEMOLite2D

benchmarks/nemo/nemolite2d contains various versions of the NEMOLite2D benchmark which is based upon the free-surface component of the NEMO ocean model (www.nemo-ocean.eu). This was originally constructed by Hedong Liu of the National Oceanography Centre, Liverpool, UK.

Manual implementations

The manual_versions directory contains various implementations of NEMOLite2D where the application has been split-up into Algorithm PSy and Kernel layers but the PSy layer has been written manually. See the README.md file in the NemoLite2D manual_versions directory for more information.

(Note that the OpenACC versions are based upon work by Jeremy Appleyard of NVIDIA).

PSyclone code generation

The psykal directory contains the version of NEMOLite2D that uses PSyclone to generate the PSy layer. Currently serial and OpenMP versions may be generated.

NEMO Tracer Advection

The benchmarks/nemo/tracer_advection directory contains various versions of a benchmark based on one of the tracer-advection routines in the NEMO code base. The version in the original directory was supplied by Silvia Mocavero of CMCC.

Shallow

benchmarks/shallow contains various versions of the Shallow benchmark, originally developed by Paul Swarztrauber of NCAR. In summary these are:

  • SEQ/original - original single-file serial version in Fortran.
  • SEQ - PSyKAl version of Shallow including option to build with PSyclone.
  • OMP - manual OpenMP implementation in C.

Please see the README.md files in the individual directories for more information.

Building

The Makefiles for all of the various benchmarks pick-up which compiler to use (and associated flags) from environment variables. Bash scripts to set these variables for a variety of compilers are in the compiler_setup directory. When benchmarking you will need to edit the relevant file and ensure that the compiler flags are set appropriately. The flags that give the best performance for a particular compiler can vary from benchmark to benchmark and even by problem size.

In order to use the settings for a particular compiler, you must source the appropriate Bash script. e.g. for the Intel compiler (assuming you are running a Bash shell):

> . compiler_setup/intel.sh

Again, see the README.md file included with each benchmark.

A top-level Makefile is provided that has targets to build all of the various NEMOLite2D and Shallow benchmarks for CPU:

  • all - build all targets that do not require PSyclone
  • all_gen - build all targets that use PSyclone code generation
  • shallow_cpu - build all CPU versions of Shallow that do not require PSyclone
  • shallow_gen - build Shallow using PSyclone for code generation
  • nemolite_cpu - build all CPU versions of NEMOLite2D that do not require PSyclone
  • nemolite_gen - build NEMOLite2D using PSyclone for code generation

Since the set-up for OpenACC and OpenCL is more involved, it does not attempt to compile the benchmarks using those languages. See the Makefiles in the individual benchmark folders for those cases.

LFRic Small Matrix Vector Multiplication

benchmarks/smallmatvec contains multiple implementations of the matrix-vector multiplication operation done in the LFRic application.

Currently it only contains one manual implementation:

  • openmp - Configurable implementation using OpenMP that test the vectorization and threading capabilities of multiple versions of the kernel and multiple parallel traversing strategies.

Note that this benchmark does not use the compiler_setup settings yet.

About

Various benchmarks used to inform PSyclone optimisations

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

PSycloneBench

Various small benchmarks used to inform the development of the PSyclone Domain-Specific Compiler.

Obtaining the Code

The benchmark codes contained in this project use the dl_timer library for execution timing and the dl_esm_inf infrastructure. Some implementation also have FortCL or Kokkos as dependencies. All these packages are included within the PSycloneBench repository as git submodules. As such, when cloning the repository you need to use the --recursive flag in order to get the source code of that submodule, e.g.:

git clone --recursive https://github.com/stfc/PSycloneBench

If you forget to do this then your cloned repository will contain empty PSycloneBench/shared/dl_timer, dl_esm_inf, kokkos and FortCL directories. To populate them you can do:

cd PSycloneBench
git submodule init
git submodule update

Benchmarks

Are contained in directories beneath the benchmarks directory.

NEMOLite2D

benchmarks/nemo/nemolite2d contains various versions of the NEMOLite2D benchmark which is based upon the free-surface component of the NEMO ocean model (www.nemo-ocean.eu). This was originally constructed by Hedong Liu of the National Oceanography Centre, Liverpool, UK.

Manual implementations

The manual_versions directory contains various implementations of NEMOLite2D where the application has been split-up into Algorithm PSy and Kernel layers but the PSy layer has been written manually. See the README.md file in the NemoLite2D manual_versions directory for more information.

(Note that the OpenACC versions are based upon work by Jeremy Appleyard of NVIDIA).

PSyclone code generation

The psykal directory contains the version of NEMOLite2D that uses PSyclone to generate the PSy layer. Currently serial and OpenMP versions may be generated.

NEMO Tracer Advection

The benchmarks/nemo/tracer_advection directory contains various versions of a benchmark based on one of the tracer-advection routines in the NEMO code base. The version in the original directory was supplied by Silvia Mocavero of CMCC.

Shallow

benchmarks/shallow contains various versions of the Shallow benchmark, originally developed by Paul Swarztrauber of NCAR. In summary these are:

  • SEQ/original - original single-file serial version in Fortran.
  • SEQ - PSyKAl version of Shallow including option to build with PSyclone.
  • OMP - manual OpenMP implementation in C.

Please see the README.md files in the individual directories for more information.

Building

The Makefiles for all of the various benchmarks pick-up which compiler to use (and associated flags) from environment variables. Bash scripts to set these variables for a variety of compilers are in the compiler_setup directory. When benchmarking you will need to edit the relevant file and ensure that the compiler flags are set appropriately. The flags that give the best performance for a particular compiler can vary from benchmark to benchmark and even by problem size.

In order to use the settings for a particular compiler, you must source the appropriate Bash script. e.g. for the Intel compiler (assuming you are running a Bash shell):

> . compiler_setup/intel.sh

Again, see the README.md file included with each benchmark.

A top-level Makefile is provided that has targets to build all of the various NEMOLite2D and Shallow benchmarks for CPU:

  • all - build all targets that do not require PSyclone
  • all_gen - build all targets that use PSyclone code generation
  • shallow_cpu - build all CPU versions of Shallow that do not require PSyclone
  • shallow_gen - build Shallow using PSyclone for code generation
  • nemolite_cpu - build all CPU versions of NEMOLite2D that do not require PSyclone
  • nemolite_gen - build NEMOLite2D using PSyclone for code generation

Since the set-up for OpenACC and OpenCL is more involved, it does not attempt to compile the benchmarks using those languages. See the Makefiles in the individual benchmark folders for those cases.

LFRic Small Matrix Vector Multiplication

benchmarks/smallmatvec contains multiple implementations of the matrix-vector multiplication operation done in the LFRic application.

Currently it only contains one manual implementation:

  • openmp - Configurable implementation using OpenMP that test the vectorization and threading capabilities of multiple versions of the kernel and multiple parallel traversing strategies.

Note that this benchmark does not use the compiler_setup settings yet.

About

Various benchmarks used to inform PSyclone optimisations

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

PSycloneBench

Various small benchmarks used to inform the development of the PSyclone Domain-Specific Compiler.

Obtaining the Code

The benchmark codes contained in this project use the dl_timer library for execution timing and the dl_esm_inf infrastructure. Some implementation also have FortCL or Kokkos as dependencies. All these packages are included within the PSycloneBench repository as git submodules. As such, when cloning the repository you need to use the --recursive flag in order to get the source code of that submodule, e.g.:

git clone --recursive https://github.com/stfc/PSycloneBench

If you forget to do this then your cloned repository will contain empty PSycloneBench/shared/dl_timer, dl_esm_inf, kokkos and FortCL directories. To populate them you can do:

cd PSycloneBench
git submodule init
git submodule update

Benchmarks

Are contained in directories beneath the benchmarks directory.

NEMOLite2D

benchmarks/nemo/nemolite2d contains various versions of the NEMOLite2D benchmark which is based upon the free-surface component of the NEMO ocean model (www.nemo-ocean.eu). This was originally constructed by Hedong Liu of the National Oceanography Centre, Liverpool, UK.

Manual implementations

The manual_versions directory contains various implementations of NEMOLite2D where the application has been split-up into Algorithm PSy and Kernel layers but the PSy layer has been written manually. See the README.md file in the NemoLite2D manual_versions directory for more information.

(Note that the OpenACC versions are based upon work by Jeremy Appleyard of NVIDIA).

PSyclone code generation

The psykal directory contains the version of NEMOLite2D that uses PSyclone to generate the PSy layer. Currently serial and OpenMP versions may be generated.

NEMO Tracer Advection

The benchmarks/nemo/tracer_advection directory contains various versions of a benchmark based on one of the tracer-advection routines in the NEMO code base. The version in the original directory was supplied by Silvia Mocavero of CMCC.

Shallow

benchmarks/shallow contains various versions of the Shallow benchmark, originally developed by Paul Swarztrauber of NCAR. In summary these are:

  • SEQ/original - original single-file serial version in Fortran.
  • SEQ - PSyKAl version of Shallow including option to build with PSyclone.
  • OMP - manual OpenMP implementation in C.

Please see the README.md files in the individual directories for more information.

Building

The Makefiles for all of the various benchmarks pick-up which compiler to use (and associated flags) from environment variables. Bash scripts to set these variables for a variety of compilers are in the compiler_setup directory. When benchmarking you will need to edit the relevant file and ensure that the compiler flags are set appropriately. The flags that give the best performance for a particular compiler can vary from benchmark to benchmark and even by problem size.

In order to use the settings for a particular compiler, you must source the appropriate Bash script. e.g. for the Intel compiler (assuming you are running a Bash shell):

> . compiler_setup/intel.sh

Again, see the README.md file included with each benchmark.

A top-level Makefile is provided that has targets to build all of the various NEMOLite2D and Shallow benchmarks for CPU:

  • all - build all targets that do not require PSyclone
  • all_gen - build all targets that use PSyclone code generation
  • shallow_cpu - build all CPU versions of Shallow that do not require PSyclone
  • shallow_gen - build Shallow using PSyclone for code generation
  • nemolite_cpu - build all CPU versions of NEMOLite2D that do not require PSyclone
  • nemolite_gen - build NEMOLite2D using PSyclone for code generation

Since the set-up for OpenACC and OpenCL is more involved, it does not attempt to compile the benchmarks using those languages. See the Makefiles in the individual benchmark folders for those cases.

LFRic Small Matrix Vector Multiplication

benchmarks/smallmatvec contains multiple implementations of the matrix-vector multiplication operation done in the LFRic application.

Currently it only contains one manual implementation:

  • openmp - Configurable implementation using OpenMP that test the vectorization and threading capabilities of multiple versions of the kernel and multiple parallel traversing strategies.

Note that this benchmark does not use the compiler_setup settings yet.

About

Various benchmarks used to inform PSyclone optimisations

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

PSycloneBench

Various small benchmarks used to inform the development of the PSyclone Domain-Specific Compiler.

Obtaining the Code

The benchmark codes contained in this project use the dl_timer library for execution timing and the dl_esm_inf infrastructure. Some implementation also have FortCL or Kokkos as dependencies. All these packages are included within the PSycloneBench repository as git submodules. As such, when cloning the repository you need to use the --recursive flag in order to get the source code of that submodule, e.g.:

git clone --recursive https://github.com/stfc/PSycloneBench

If you forget to do this then your cloned repository will contain empty PSycloneBench/shared/dl_timer, dl_esm_inf, kokkos and FortCL directories. To populate them you can do:

cd PSycloneBench
git submodule init
git submodule update

Benchmarks

Are contained in directories beneath the benchmarks directory.

NEMOLite2D

benchmarks/nemo/nemolite2d contains various versions of the NEMOLite2D benchmark which is based upon the free-surface component of the NEMO ocean model (www.nemo-ocean.eu). This was originally constructed by Hedong Liu of the National Oceanography Centre, Liverpool, UK.

Manual implementations

The manual_versions directory contains various implementations of NEMOLite2D where the application has been split-up into Algorithm PSy and Kernel layers but the PSy layer has been written manually. See the README.md file in the NemoLite2D manual_versions directory for more information.

(Note that the OpenACC versions are based upon work by Jeremy Appleyard of NVIDIA).

PSyclone code generation

The psykal directory contains the version of NEMOLite2D that uses PSyclone to generate the PSy layer. Currently serial and OpenMP versions may be generated.

NEMO Tracer Advection

The benchmarks/nemo/tracer_advection directory contains various versions of a benchmark based on one of the tracer-advection routines in the NEMO code base. The version in the original directory was supplied by Silvia Mocavero of CMCC.

Shallow

benchmarks/shallow contains various versions of the Shallow benchmark, originally developed by Paul Swarztrauber of NCAR. In summary these are:

  • SEQ/original - original single-file serial version in Fortran.
  • SEQ - PSyKAl version of Shallow including option to build with PSyclone.
  • OMP - manual OpenMP implementation in C.

Please see the README.md files in the individual directories for more information.

Building

The Makefiles for all of the various benchmarks pick-up which compiler to use (and associated flags) from environment variables. Bash scripts to set these variables for a variety of compilers are in the compiler_setup directory. When benchmarking you will need to edit the relevant file and ensure that the compiler flags are set appropriately. The flags that give the best performance for a particular compiler can vary from benchmark to benchmark and even by problem size.

In order to use the settings for a particular compiler, you must source the appropriate Bash script. e.g. for the Intel compiler (assuming you are running a Bash shell):

> . compiler_setup/intel.sh

Again, see the README.md file included with each benchmark.

A top-level Makefile is provided that has targets to build all of the various NEMOLite2D and Shallow benchmarks for CPU:

  • all - build all targets that do not require PSyclone
  • all_gen - build all targets that use PSyclone code generation
  • shallow_cpu - build all CPU versions of Shallow that do not require PSyclone
  • shallow_gen - build Shallow using PSyclone for code generation
  • nemolite_cpu - build all CPU versions of NEMOLite2D that do not require PSyclone
  • nemolite_gen - build NEMOLite2D using PSyclone for code generation

Since the set-up for OpenACC and OpenCL is more involved, it does not attempt to compile the benchmarks using those languages. See the Makefiles in the individual benchmark folders for those cases.

LFRic Small Matrix Vector Multiplication

benchmarks/smallmatvec contains multiple implementations of the matrix-vector multiplication operation done in the LFRic application.

Currently it only contains one manual implementation:

  • openmp - Configurable implementation using OpenMP that test the vectorization and threading capabilities of multiple versions of the kernel and multiple parallel traversing strategies.

Note that this benchmark does not use the compiler_setup settings yet.

About

Various benchmarks used to inform PSyclone optimisations

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

PSycloneBench

Various small benchmarks used to inform the development of the PSyclone Domain-Specific Compiler.

Obtaining the Code

The benchmark codes contained in this project use the dl_timer library for execution timing and the dl_esm_inf infrastructure. Some implementation also have FortCL or Kokkos as dependencies. All these packages are included within the PSycloneBench repository as git submodules. As such, when cloning the repository you need to use the --recursive flag in order to get the source code of that submodule, e.g.:

git clone --recursive https://github.com/stfc/PSycloneBench

If you forget to do this then your cloned repository will contain empty PSycloneBench/shared/dl_timer, dl_esm_inf, kokkos and FortCL directories. To populate them you can do:

cd PSycloneBench
git submodule init
git submodule update

Benchmarks

Are contained in directories beneath the benchmarks directory.

NEMOLite2D

benchmarks/nemo/nemolite2d contains various versions of the NEMOLite2D benchmark which is based upon the free-surface component of the NEMO ocean model (www.nemo-ocean.eu). This was originally constructed by Hedong Liu of the National Oceanography Centre, Liverpool, UK.

Manual implementations

The manual_versions directory contains various implementations of NEMOLite2D where the application has been split-up into Algorithm PSy and Kernel layers but the PSy layer has been written manually. See the README.md file in the NemoLite2D manual_versions directory for more information.

(Note that the OpenACC versions are based upon work by Jeremy Appleyard of NVIDIA).

PSyclone code generation

The psykal directory contains the version of NEMOLite2D that uses PSyclone to generate the PSy layer. Currently serial and OpenMP versions may be generated.

NEMO Tracer Advection

The benchmarks/nemo/tracer_advection directory contains various versions of a benchmark based on one of the tracer-advection routines in the NEMO code base. The version in the original directory was supplied by Silvia Mocavero of CMCC.

Shallow

benchmarks/shallow contains various versions of the Shallow benchmark, originally developed by Paul Swarztrauber of NCAR. In summary these are:

  • SEQ/original - original single-file serial version in Fortran.
  • SEQ - PSyKAl version of Shallow including option to build with PSyclone.
  • OMP - manual OpenMP implementation in C.

Please see the README.md files in the individual directories for more information.

Building

The Makefiles for all of the various benchmarks pick-up which compiler to use (and associated flags) from environment variables. Bash scripts to set these variables for a variety of compilers are in the compiler_setup directory. When benchmarking you will need to edit the relevant file and ensure that the compiler flags are set appropriately. The flags that give the best performance for a particular compiler can vary from benchmark to benchmark and even by problem size.

In order to use the settings for a particular compiler, you must source the appropriate Bash script. e.g. for the Intel compiler (assuming you are running a Bash shell):

> . compiler_setup/intel.sh

Again, see the README.md file included with each benchmark.

A top-level Makefile is provided that has targets to build all of the various NEMOLite2D and Shallow benchmarks for CPU:

  • all - build all targets that do not require PSyclone
  • all_gen - build all targets that use PSyclone code generation
  • shallow_cpu - build all CPU versions of Shallow that do not require PSyclone
  • shallow_gen - build Shallow using PSyclone for code generation
  • nemolite_cpu - build all CPU versions of NEMOLite2D that do not require PSyclone
  • nemolite_gen - build NEMOLite2D using PSyclone for code generation

Since the set-up for OpenACC and OpenCL is more involved, it does not attempt to compile the benchmarks using those languages. See the Makefiles in the individual benchmark folders for those cases.

LFRic Small Matrix Vector Multiplication

benchmarks/smallmatvec contains multiple implementations of the matrix-vector multiplication operation done in the LFRic application.

Currently it only contains one manual implementation:

  • openmp - Configurable implementation using OpenMP that test the vectorization and threading capabilities of multiple versions of the kernel and multiple parallel traversing strategies.

Note that this benchmark does not use the compiler_setup settings yet.

About

Various benchmarks used to inform PSyclone optimisations

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

PSycloneBench

Various small benchmarks used to inform the development of the PSyclone Domain-Specific Compiler.

Obtaining the Code

The benchmark codes contained in this project use the dl_timer library for execution timing and the dl_esm_inf infrastructure. Some implementation also have FortCL or Kokkos as dependencies. All these packages are included within the PSycloneBench repository as git submodules. As such, when cloning the repository you need to use the --recursive flag in order to get the source code of that submodule, e.g.:

git clone --recursive https://github.com/stfc/PSycloneBench

If you forget to do this then your cloned repository will contain empty PSycloneBench/shared/dl_timer, dl_esm_inf, kokkos and FortCL directories. To populate them you can do:

cd PSycloneBench
git submodule init
git submodule update

Benchmarks

Are contained in directories beneath the benchmarks directory.

NEMOLite2D

benchmarks/nemo/nemolite2d contains various versions of the NEMOLite2D benchmark which is based upon the free-surface component of the NEMO ocean model (www.nemo-ocean.eu). This was originally constructed by Hedong Liu of the National Oceanography Centre, Liverpool, UK.

Manual implementations

The manual_versions directory contains various implementations of NEMOLite2D where the application has been split-up into Algorithm PSy and Kernel layers but the PSy layer has been written manually. See the README.md file in the NemoLite2D manual_versions directory for more information.

(Note that the OpenACC versions are based upon work by Jeremy Appleyard of NVIDIA).

PSyclone code generation

The psykal directory contains the version of NEMOLite2D that uses PSyclone to generate the PSy layer. Currently serial and OpenMP versions may be generated.

NEMO Tracer Advection

The benchmarks/nemo/tracer_advection directory contains various versions of a benchmark based on one of the tracer-advection routines in the NEMO code base. The version in the original directory was supplied by Silvia Mocavero of CMCC.

Shallow

benchmarks/shallow contains various versions of the Shallow benchmark, originally developed by Paul Swarztrauber of NCAR. In summary these are:

  • SEQ/original - original single-file serial version in Fortran.
  • SEQ - PSyKAl version of Shallow including option to build with PSyclone.
  • OMP - manual OpenMP implementation in C.

Please see the README.md files in the individual directories for more information.

Building

The Makefiles for all of the various benchmarks pick-up which compiler to use (and associated flags) from environment variables. Bash scripts to set these variables for a variety of compilers are in the compiler_setup directory. When benchmarking you will need to edit the relevant file and ensure that the compiler flags are set appropriately. The flags that give the best performance for a particular compiler can vary from benchmark to benchmark and even by problem size.

In order to use the settings for a particular compiler, you must source the appropriate Bash script. e.g. for the Intel compiler (assuming you are running a Bash shell):

> . compiler_setup/intel.sh

Again, see the README.md file included with each benchmark.

A top-level Makefile is provided that has targets to build all of the various NEMOLite2D and Shallow benchmarks for CPU:

  • all - build all targets that do not require PSyclone
  • all_gen - build all targets that use PSyclone code generation
  • shallow_cpu - build all CPU versions of Shallow that do not require PSyclone
  • shallow_gen - build Shallow using PSyclone for code generation
  • nemolite_cpu - build all CPU versions of NEMOLite2D that do not require PSyclone
  • nemolite_gen - build NEMOLite2D using PSyclone for code generation

Since the set-up for OpenACC and OpenCL is more involved, it does not attempt to compile the benchmarks using those languages. See the Makefiles in the individual benchmark folders for those cases.

LFRic Small Matrix Vector Multiplication

benchmarks/smallmatvec contains multiple implementations of the matrix-vector multiplication operation done in the LFRic application.

Currently it only contains one manual implementation:

  • openmp - Configurable implementation using OpenMP that test the vectorization and threading capabilities of multiple versions of the kernel and multiple parallel traversing strategies.

Note that this benchmark does not use the compiler_setup settings yet.

About

Various benchmarks used to inform PSyclone optimisations

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

PSycloneBench

Various small benchmarks used to inform the development of the PSyclone Domain-Specific Compiler.

Obtaining the Code

The benchmark codes contained in this project use the dl_timer library for execution timing and the dl_esm_inf infrastructure. Some implementation also have FortCL or Kokkos as dependencies. All these packages are included within the PSycloneBench repository as git submodules. As such, when cloning the repository you need to use the --recursive flag in order to get the source code of that submodule, e.g.:

git clone --recursive https://github.com/stfc/PSycloneBench

If you forget to do this then your cloned repository will contain empty PSycloneBench/shared/dl_timer, dl_esm_inf, kokkos and FortCL directories. To populate them you can do:

cd PSycloneBench
git submodule init
git submodule update

Benchmarks

Are contained in directories beneath the benchmarks directory.

NEMOLite2D

benchmarks/nemo/nemolite2d contains various versions of the NEMOLite2D benchmark which is based upon the free-surface component of the NEMO ocean model (www.nemo-ocean.eu). This was originally constructed by Hedong Liu of the National Oceanography Centre, Liverpool, UK.

Manual implementations

The manual_versions directory contains various implementations of NEMOLite2D where the application has been split-up into Algorithm PSy and Kernel layers but the PSy layer has been written manually. See the README.md file in the NemoLite2D manual_versions directory for more information.

(Note that the OpenACC versions are based upon work by Jeremy Appleyard of NVIDIA).

PSyclone code generation

The psykal directory contains the version of NEMOLite2D that uses PSyclone to generate the PSy layer. Currently serial and OpenMP versions may be generated.

NEMO Tracer Advection

The benchmarks/nemo/tracer_advection directory contains various versions of a benchmark based on one of the tracer-advection routines in the NEMO code base. The version in the original directory was supplied by Silvia Mocavero of CMCC.

Shallow

benchmarks/shallow contains various versions of the Shallow benchmark, originally developed by Paul Swarztrauber of NCAR. In summary these are:

  • SEQ/original - original single-file serial version in Fortran.
  • SEQ - PSyKAl version of Shallow including option to build with PSyclone.
  • OMP - manual OpenMP implementation in C.

Please see the README.md files in the individual directories for more information.

Building

The Makefiles for all of the various benchmarks pick-up which compiler to use (and associated flags) from environment variables. Bash scripts to set these variables for a variety of compilers are in the compiler_setup directory. When benchmarking you will need to edit the relevant file and ensure that the compiler flags are set appropriately. The flags that give the best performance for a particular compiler can vary from benchmark to benchmark and even by problem size.

In order to use the settings for a particular compiler, you must source the appropriate Bash script. e.g. for the Intel compiler (assuming you are running a Bash shell):

> . compiler_setup/intel.sh

Again, see the README.md file included with each benchmark.

A top-level Makefile is provided that has targets to build all of the various NEMOLite2D and Shallow benchmarks for CPU:

  • all - build all targets that do not require PSyclone
  • all_gen - build all targets that use PSyclone code generation
  • shallow_cpu - build all CPU versions of Shallow that do not require PSyclone
  • shallow_gen - build Shallow using PSyclone for code generation
  • nemolite_cpu - build all CPU versions of NEMOLite2D that do not require PSyclone
  • nemolite_gen - build NEMOLite2D using PSyclone for code generation

Since the set-up for OpenACC and OpenCL is more involved, it does not attempt to compile the benchmarks using those languages. See the Makefiles in the individual benchmark folders for those cases.

LFRic Small Matrix Vector Multiplication

benchmarks/smallmatvec contains multiple implementations of the matrix-vector multiplication operation done in the LFRic application.

Currently it only contains one manual implementation:

  • openmp - Configurable implementation using OpenMP that test the vectorization and threading capabilities of multiple versions of the kernel and multiple parallel traversing strategies.

Note that this benchmark does not use the compiler_setup settings yet.

About

Various benchmarks used to inform PSyclone optimisations

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages