Latest commit

History

59 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Poisson Solver

build

This project solve Poisson's equation on a 2D grid using either:

  1. A parallel openMP/openACC implementation of the Gauss-Seidel method
  2. or LAPACK

The goal was to practice openMP and openACC parallelization. This was a learning exercise and is not intended to serve as a comparison between LAPACK and GS method.

There is a build script scripts/build.sh.

The binary bin/solver outputs the discrete grid u_grid to a fort file fort.10. You can check that both methods produce the same answer.

Hardware Requirements

  • I have only tested on NVIDIA GPUs
  • For NVIDIA GPUs and openMP offloading a GPU with Compute Capability >= 7.0 is required

Results

openMP (CPU only)

Intel CPU - ifort compiler

For problem size:

  • ugrid[200,200]
  • tol = 1e-11 (GS only)

For this test run I compiled the code with ifort version 2021.7.0 (oneapi) but the code also works with GNU compiler gfortran.

The test was run on CPU Intel(R) Core(TM) i5-6400 CPU @ 2.70GHz with 16 Gb RAM.

Walltime (s)

ProcsLAPACKGauss-Seidel
182325
243416
426511

Maximum Memory

LAPACKGauss-Seidel
11.6Gb22Mb

Arm CPU - Gnu compiler

The test was run on arm CPU Neoverse-N1 with 512 Gb RAM.

Problem size u_grid dims = [300,300] number of iterations = 192018

CoresTime (s)
8015.4646
6414.1203
3215.4587
1621.6295
838.4833
470.8669
2136.7466
1270.7637

openACC (GPU)

The test was run on nvidia GPU NVIDIA A100 with 40 Gb RAM connected to the arm system above.

Problem size u_grid dims = [300,300] number of iterations = 192018

GPUTime (s)
na17.7678

TODO

Continue to profile openACC version. Check for unneccessary memory transfers.

About

Solve the Poisson Equation on a 2D grid with Gauss-Seidel Algorithm

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

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

Latest commit

History

59 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Poisson Solver

build

This project solve Poisson's equation on a 2D grid using either:

  1. A parallel openMP/openACC implementation of the Gauss-Seidel method
  2. or LAPACK

The goal was to practice openMP and openACC parallelization. This was a learning exercise and is not intended to serve as a comparison between LAPACK and GS method.

There is a build script scripts/build.sh.

The binary bin/solver outputs the discrete grid u_grid to a fort file fort.10. You can check that both methods produce the same answer.

Hardware Requirements

  • I have only tested on NVIDIA GPUs
  • For NVIDIA GPUs and openMP offloading a GPU with Compute Capability >= 7.0 is required

Results

openMP (CPU only)

Intel CPU - ifort compiler

For problem size:

  • ugrid[200,200]
  • tol = 1e-11 (GS only)

For this test run I compiled the code with ifort version 2021.7.0 (oneapi) but the code also works with GNU compiler gfortran.

The test was run on CPU Intel(R) Core(TM) i5-6400 CPU @ 2.70GHz with 16 Gb RAM.

Walltime (s)

ProcsLAPACKGauss-Seidel
182325
243416
426511

Maximum Memory

LAPACKGauss-Seidel
11.6Gb22Mb

Arm CPU - Gnu compiler

The test was run on arm CPU Neoverse-N1 with 512 Gb RAM.

Problem size u_grid dims = [300,300] number of iterations = 192018

CoresTime (s)
8015.4646
6414.1203
3215.4587
1621.6295
838.4833
470.8669
2136.7466
1270.7637

openACC (GPU)

The test was run on nvidia GPU NVIDIA A100 with 40 Gb RAM connected to the arm system above.

Problem size u_grid dims = [300,300] number of iterations = 192018

GPUTime (s)
na17.7678

TODO

Continue to profile openACC version. Check for unneccessary memory transfers.

About

Solve the Poisson Equation on a 2D grid with Gauss-Seidel Algorithm

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

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

Latest commit

History

59 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Poisson Solver

build

This project solve Poisson's equation on a 2D grid using either:

  1. A parallel openMP/openACC implementation of the Gauss-Seidel method
  2. or LAPACK

The goal was to practice openMP and openACC parallelization. This was a learning exercise and is not intended to serve as a comparison between LAPACK and GS method.

There is a build script scripts/build.sh.

The binary bin/solver outputs the discrete grid u_grid to a fort file fort.10. You can check that both methods produce the same answer.

Hardware Requirements

  • I have only tested on NVIDIA GPUs
  • For NVIDIA GPUs and openMP offloading a GPU with Compute Capability >= 7.0 is required

Results

openMP (CPU only)

Intel CPU - ifort compiler

For problem size:

  • ugrid[200,200]
  • tol = 1e-11 (GS only)

For this test run I compiled the code with ifort version 2021.7.0 (oneapi) but the code also works with GNU compiler gfortran.

The test was run on CPU Intel(R) Core(TM) i5-6400 CPU @ 2.70GHz with 16 Gb RAM.

Walltime (s)

ProcsLAPACKGauss-Seidel
182325
243416
426511

Maximum Memory

LAPACKGauss-Seidel
11.6Gb22Mb

Arm CPU - Gnu compiler

The test was run on arm CPU Neoverse-N1 with 512 Gb RAM.

Problem size u_grid dims = [300,300] number of iterations = 192018

CoresTime (s)
8015.4646
6414.1203
3215.4587
1621.6295
838.4833
470.8669
2136.7466
1270.7637

openACC (GPU)

The test was run on nvidia GPU NVIDIA A100 with 40 Gb RAM connected to the arm system above.

Problem size u_grid dims = [300,300] number of iterations = 192018

GPUTime (s)
na17.7678

TODO

Continue to profile openACC version. Check for unneccessary memory transfers.

About

Solve the Poisson Equation on a 2D grid with Gauss-Seidel Algorithm

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

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

Latest commit

History

59 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Poisson Solver

build

This project solve Poisson's equation on a 2D grid using either:

  1. A parallel openMP/openACC implementation of the Gauss-Seidel method
  2. or LAPACK

The goal was to practice openMP and openACC parallelization. This was a learning exercise and is not intended to serve as a comparison between LAPACK and GS method.

There is a build script scripts/build.sh.

The binary bin/solver outputs the discrete grid u_grid to a fort file fort.10. You can check that both methods produce the same answer.

Hardware Requirements

  • I have only tested on NVIDIA GPUs
  • For NVIDIA GPUs and openMP offloading a GPU with Compute Capability >= 7.0 is required

Results

openMP (CPU only)

Intel CPU - ifort compiler

For problem size:

  • ugrid[200,200]
  • tol = 1e-11 (GS only)

For this test run I compiled the code with ifort version 2021.7.0 (oneapi) but the code also works with GNU compiler gfortran.

The test was run on CPU Intel(R) Core(TM) i5-6400 CPU @ 2.70GHz with 16 Gb RAM.

Walltime (s)

ProcsLAPACKGauss-Seidel
182325
243416
426511

Maximum Memory

LAPACKGauss-Seidel
11.6Gb22Mb

Arm CPU - Gnu compiler

The test was run on arm CPU Neoverse-N1 with 512 Gb RAM.

Problem size u_grid dims = [300,300] number of iterations = 192018

CoresTime (s)
8015.4646
6414.1203
3215.4587
1621.6295
838.4833
470.8669
2136.7466
1270.7637

openACC (GPU)

The test was run on nvidia GPU NVIDIA A100 with 40 Gb RAM connected to the arm system above.

Problem size u_grid dims = [300,300] number of iterations = 192018

GPUTime (s)
na17.7678

TODO

Continue to profile openACC version. Check for unneccessary memory transfers.

About

Solve the Poisson Equation on a 2D grid with Gauss-Seidel Algorithm

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

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

Latest commit

History

59 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Poisson Solver

build

This project solve Poisson's equation on a 2D grid using either:

  1. A parallel openMP/openACC implementation of the Gauss-Seidel method
  2. or LAPACK

The goal was to practice openMP and openACC parallelization. This was a learning exercise and is not intended to serve as a comparison between LAPACK and GS method.

There is a build script scripts/build.sh.

The binary bin/solver outputs the discrete grid u_grid to a fort file fort.10. You can check that both methods produce the same answer.

Hardware Requirements

  • I have only tested on NVIDIA GPUs
  • For NVIDIA GPUs and openMP offloading a GPU with Compute Capability >= 7.0 is required

Results

openMP (CPU only)

Intel CPU - ifort compiler

For problem size:

  • ugrid[200,200]
  • tol = 1e-11 (GS only)

For this test run I compiled the code with ifort version 2021.7.0 (oneapi) but the code also works with GNU compiler gfortran.

The test was run on CPU Intel(R) Core(TM) i5-6400 CPU @ 2.70GHz with 16 Gb RAM.

Walltime (s)

ProcsLAPACKGauss-Seidel
182325
243416
426511

Maximum Memory

LAPACKGauss-Seidel
11.6Gb22Mb

Arm CPU - Gnu compiler

The test was run on arm CPU Neoverse-N1 with 512 Gb RAM.

Problem size u_grid dims = [300,300] number of iterations = 192018

CoresTime (s)
8015.4646
6414.1203
3215.4587
1621.6295
838.4833
470.8669
2136.7466
1270.7637

openACC (GPU)

The test was run on nvidia GPU NVIDIA A100 with 40 Gb RAM connected to the arm system above.

Problem size u_grid dims = [300,300] number of iterations = 192018

GPUTime (s)
na17.7678

TODO

Continue to profile openACC version. Check for unneccessary memory transfers.

About

Solve the Poisson Equation on a 2D grid with Gauss-Seidel Algorithm

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

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

Latest commit

History

59 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Poisson Solver

build

This project solve Poisson's equation on a 2D grid using either:

  1. A parallel openMP/openACC implementation of the Gauss-Seidel method
  2. or LAPACK

The goal was to practice openMP and openACC parallelization. This was a learning exercise and is not intended to serve as a comparison between LAPACK and GS method.

There is a build script scripts/build.sh.

The binary bin/solver outputs the discrete grid u_grid to a fort file fort.10. You can check that both methods produce the same answer.

Hardware Requirements

  • I have only tested on NVIDIA GPUs
  • For NVIDIA GPUs and openMP offloading a GPU with Compute Capability >= 7.0 is required

Results

openMP (CPU only)

Intel CPU - ifort compiler

For problem size:

  • ugrid[200,200]
  • tol = 1e-11 (GS only)

For this test run I compiled the code with ifort version 2021.7.0 (oneapi) but the code also works with GNU compiler gfortran.

The test was run on CPU Intel(R) Core(TM) i5-6400 CPU @ 2.70GHz with 16 Gb RAM.

Walltime (s)

ProcsLAPACKGauss-Seidel
182325
243416
426511

Maximum Memory

LAPACKGauss-Seidel
11.6Gb22Mb

Arm CPU - Gnu compiler

The test was run on arm CPU Neoverse-N1 with 512 Gb RAM.

Problem size u_grid dims = [300,300] number of iterations = 192018

CoresTime (s)
8015.4646
6414.1203
3215.4587
1621.6295
838.4833
470.8669
2136.7466
1270.7637

openACC (GPU)

The test was run on nvidia GPU NVIDIA A100 with 40 Gb RAM connected to the arm system above.

Problem size u_grid dims = [300,300] number of iterations = 192018

GPUTime (s)
na17.7678

TODO

Continue to profile openACC version. Check for unneccessary memory transfers.

About

Solve the Poisson Equation on a 2D grid with Gauss-Seidel Algorithm

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

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

Latest commit

History

59 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Poisson Solver

build

This project solve Poisson's equation on a 2D grid using either:

  1. A parallel openMP/openACC implementation of the Gauss-Seidel method
  2. or LAPACK

The goal was to practice openMP and openACC parallelization. This was a learning exercise and is not intended to serve as a comparison between LAPACK and GS method.

There is a build script scripts/build.sh.

The binary bin/solver outputs the discrete grid u_grid to a fort file fort.10. You can check that both methods produce the same answer.

Hardware Requirements

  • I have only tested on NVIDIA GPUs
  • For NVIDIA GPUs and openMP offloading a GPU with Compute Capability >= 7.0 is required

Results

openMP (CPU only)

Intel CPU - ifort compiler

For problem size:

  • ugrid[200,200]
  • tol = 1e-11 (GS only)

For this test run I compiled the code with ifort version 2021.7.0 (oneapi) but the code also works with GNU compiler gfortran.

The test was run on CPU Intel(R) Core(TM) i5-6400 CPU @ 2.70GHz with 16 Gb RAM.

Walltime (s)

ProcsLAPACKGauss-Seidel
182325
243416
426511

Maximum Memory

LAPACKGauss-Seidel
11.6Gb22Mb

Arm CPU - Gnu compiler

The test was run on arm CPU Neoverse-N1 with 512 Gb RAM.

Problem size u_grid dims = [300,300] number of iterations = 192018

CoresTime (s)
8015.4646
6414.1203
3215.4587
1621.6295
838.4833
470.8669
2136.7466
1270.7637

openACC (GPU)

The test was run on nvidia GPU NVIDIA A100 with 40 Gb RAM connected to the arm system above.

Problem size u_grid dims = [300,300] number of iterations = 192018

GPUTime (s)
na17.7678

TODO

Continue to profile openACC version. Check for unneccessary memory transfers.

About

Solve the Poisson Equation on a 2D grid with Gauss-Seidel Algorithm

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

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

Latest commit

History

59 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Poisson Solver

build

This project solve Poisson's equation on a 2D grid using either:

  1. A parallel openMP/openACC implementation of the Gauss-Seidel method
  2. or LAPACK

The goal was to practice openMP and openACC parallelization. This was a learning exercise and is not intended to serve as a comparison between LAPACK and GS method.

There is a build script scripts/build.sh.

The binary bin/solver outputs the discrete grid u_grid to a fort file fort.10. You can check that both methods produce the same answer.

Hardware Requirements

  • I have only tested on NVIDIA GPUs
  • For NVIDIA GPUs and openMP offloading a GPU with Compute Capability >= 7.0 is required

Results

openMP (CPU only)

Intel CPU - ifort compiler

For problem size:

  • ugrid[200,200]
  • tol = 1e-11 (GS only)

For this test run I compiled the code with ifort version 2021.7.0 (oneapi) but the code also works with GNU compiler gfortran.

The test was run on CPU Intel(R) Core(TM) i5-6400 CPU @ 2.70GHz with 16 Gb RAM.

Walltime (s)

ProcsLAPACKGauss-Seidel
182325
243416
426511

Maximum Memory

LAPACKGauss-Seidel
11.6Gb22Mb

Arm CPU - Gnu compiler

The test was run on arm CPU Neoverse-N1 with 512 Gb RAM.

Problem size u_grid dims = [300,300] number of iterations = 192018

CoresTime (s)
8015.4646
6414.1203
3215.4587
1621.6295
838.4833
470.8669
2136.7466
1270.7637

openACC (GPU)

The test was run on nvidia GPU NVIDIA A100 with 40 Gb RAM connected to the arm system above.

Problem size u_grid dims = [300,300] number of iterations = 192018

GPUTime (s)
na17.7678

TODO

Continue to profile openACC version. Check for unneccessary memory transfers.

About

Solve the Poisson Equation on a 2D grid with Gauss-Seidel Algorithm

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages