From 103d3387f6e861c24cc23c0af151f3bb26f1cb0b Mon Sep 17 00:00:00 2001 From: Bruce Hoppe Date: Fri, 10 Mar 2023 13:55:27 -0500 Subject: [PATCH 01/13] preliminary homepage update Bring basic flier card content in and revamp the flex styling --- src/_data/metadata.json | 2 +- src/css/index.css | 3 +- src/img/fib-trace-dark.png | Bin 0 -> 44932 bytes src/img/multicore-simple.png | Bin 0 -> 16172 bytes src/img/opencilk-inside.png | Bin 0 -> 24574 bytes src/img/toolbox.png | Bin 0 -> 20028 bytes src/index.njk | 59 ++++++++++++++++++++--------------- 7 files changed, 36 insertions(+), 28 deletions(-) create mode 100644 src/img/fib-trace-dark.png create mode 100644 src/img/multicore-simple.png create mode 100644 src/img/opencilk-inside.png create mode 100644 src/img/toolbox.png diff --git a/src/_data/metadata.json b/src/_data/metadata.json index 358ad497..d7ea33ed 100644 --- a/src/_data/metadata.json +++ b/src/_data/metadata.json @@ -1,5 +1,5 @@ { - "tagline": "The simple way to make software fast and composable", + "tagline": "An integrated open-source ecosystem for teaching multicore performance engineering", "author": "The OpenCilk Team", "email": "contact@opencilk.org", "attribution": { diff --git a/src/css/index.css b/src/css/index.css index cf5f9d4b..47cc7587 100644 --- a/src/css/index.css +++ b/src/css/index.css @@ -86,8 +86,7 @@ input#__primary:checked ~ .bd-container .bd-sidebar-primary { line-height: normal; } .myCard-lead { - font-size: 1.1rem; - font-weight: 300; + font-size: 1.16rem; line-height: 30px; margin-bottom: 16px; } diff --git a/src/img/fib-trace-dark.png b/src/img/fib-trace-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..a0b81579216d5db12b4e38aaf6f287cc4c1ce2fb GIT binary patch literal 44932 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

YIMzwI$se-Ji7D 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 literal 0 HcmV?d00001 diff --git a/src/img/multicore-simple.png b/src/img/multicore-simple.png new file mode 100644 index 0000000000000000000000000000000000000000..7a0d7d12df728c56bc90ffbb88657b5fc266faaf GIT binary patch literal 16172 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 L)a9#W!D0UkVMOK| literal 0 HcmV?d00001 diff --git a/src/img/opencilk-inside.png b/src/img/opencilk-inside.png new file mode 100644 index 0000000000000000000000000000000000000000..2fe1c2443db22fc1192709dbdc8d1186194057d2 GIT binary patch literal 24574 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 z zqmpjlCUNGv^(+-t-V$PCk+3UPKA)+!5=1hz$;mcH?8(qny zEwK{krmJ!nbV14yksATckUC?Ji*4S;7GC zX5qP7N>Su`8{fzP#Z|k(_LA2>O)wKm`pbJp3$xb58^#m*uanyOMQ0zi4`)k}p1od! zP#Ta}3~&A^C#ko`7l!?sR-0y6;A>x+s-?W7DM;`)Sy(yf1#7C2(NwG(UBv8>MZ|t! zJ^CCq94^xrJm2Vxo2Wt-!;64pYdUy+=f@t78Km|8A>d*TTf#?qfGy_u7-{Z z5AlxAE>!CJ4vK^Z{udS&$Qvzp@f-TN={!oLAmo0%;;?qy;K;qQFN!$r;~lar@wHF) zR`J(c-Dz$#kb;7m7l^x?e^~?+dQiJqE{r9HK?QWrn@q5zQQ$~%`EZ-oH;hz6DR~I8 zTg<0BHPEyuU9h3p++s0NwDDe;UWi{9fDOPwEzN8rkMmQE1A1f=Jo@V;|0P&ld6ch` xEdHelFkRW%{>_lf{ok2?&;Nf$L)s-Rv5NEM*|VW9SJ@t9dRj)BHIM9H{~w^(H&6fo literal 0 HcmV?d00001 diff --git a/src/img/toolbox.png b/src/img/toolbox.png new file mode 100644 index 0000000000000000000000000000000000000000..1294165dc0125b6f1eeff9290500b4c71752f3e2 GIT binary patch literal 20028 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 ZMMqzGtWjM3guDR&SX2KgPW^S%e*r}iq;miO literal 0 HcmV?d00001 diff --git a/src/index.njk b/src/index.njk index 4a758844..0d9db04e 100644 --- a/src/index.njk +++ b/src/index.njk @@ -10,46 +10,54 @@ hero: dark: /img/OpenCilk-Logo-1001-dark.png subtitle: The language of performance engineering features: -- call: Write fast code - call_description: Parallelize C/C++ with OpenCilk. +- call_1: Go + call_2: Multicore call_color: var(--midnight) call_bg: var(--lime) + description: The end of Moore's Law makes software performance engineering a priority for modern computer-science curricula. + description_color: var(--midnight) + description_bg: var(--yellow) button: Install button_link: /doc/users-guide/install/ button_color: var(--yellow) button_bg: var(--blue) - image_bg: var(--yellow) - image: qsort-code-light.png -- call: Performance engineering - call_description: What is it and why does it matter? + image: multicore-simple.png +- call_1: Teach + call_2: Performance call_color: var(--yellow) call_bg: var(--midnight) + description: OpenCilk enables you to teach principles of multicore computing using a state-of-the-art task-parallel platform that is easy to learn. + description_color: var(--midnight) + description_bg: var(--lightteal) button: Learn button_link: /posts/ button_color: var(--yellow) button_bg: var(--blue) - image_bg: var(--midnight) - image: plenty-of-room-at-the-top.png -- call: Teach performance - call_description: OpenCilk provides an ideal introduction. + image: fib-trace-dark.png +- call_1: Lean and + call_2: Modular call_color: var(--safetyyellow) - call_bg: var(--darkteal) + call_bg: var(--midnight) + description: You can readily incorporate OpenCilk components into your own systems. + description_color: var(--safetyyellow) + description_bg: var(--blue) button: Discover button_link: /community/teach-performance/ button_color: var(--midnight) button_bg: var(--yellow) - image_bg: var(--teal) - image: fib-code-multicore.png -- call: Go multicore - call_description: Convert your code to OpenCilk + image: opencilk-inside.png +- call_1: Extensible and + call_2: Open-source call_color: var(--midnight) call_bg: var(--yellow) + description: You can easily adapt the OpenCilk language, compiler, and runtime system to experiment with your own research ideas. + description_color: var(--midnight) + description_bg: var(--safetyyellow) button: Here's how button_link: /doc/users-guide/convert-a-c-program/ button_color: var(--yellow) button_bg: var(--blue) - image_bg: var(--safetyyellow) - image: fib-nocode-trace-dag.png + image: toolbox.png --- @@ -65,16 +73,17 @@ features:

{% for item in features %} -
-
-
-
{{ item.call }}
-
{{ item.call_description }}
-
+
+
+
+
{{ item.call_1 }}
{{ item.call_2 }}
+
-
- +
+ + {{ item.description }}
+
{% endfor %} From 889d203c31f8b8179b0a5a5d2e5b316cb26cf7f9 Mon Sep 17 00:00:00 2001 From: Bruce Hoppe Date: Wed, 5 Apr 2023 15:27:51 -0400 Subject: [PATCH 02/13] update bottom half homepage update bottom half of homepage with content from SC22 flier --- src/_data/metadata.json | 2 +- src/index.njk | 50 ++++++++++++++++++++++++++++------------- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/src/_data/metadata.json b/src/_data/metadata.json index d7ea33ed..67cdbbd3 100644 --- a/src/_data/metadata.json +++ b/src/_data/metadata.json @@ -1,5 +1,5 @@ { - "tagline": "An integrated open-source ecosystem for teaching multicore performance engineering", + "tagline": "An integrated open-source ecosystem for teaching software performance engineering", "author": "The OpenCilk Team", "email": "contact@opencilk.org", "attribution": { diff --git a/src/index.njk b/src/index.njk index 0d9db04e..1c020a60 100644 --- a/src/index.njk +++ b/src/index.njk @@ -1,5 +1,5 @@ --- -title: Write fast code with C/C++ and OpenCilk. +title: OpenCilk makes it easy to layout: layouts/home.njk eleventyNavigation: key: Home @@ -26,7 +26,7 @@ features: call_2: Performance call_color: var(--yellow) call_bg: var(--midnight) - description: OpenCilk enables you to teach principles of multicore computing using a state-of-the-art task-parallel platform that is easy to learn. + description: OpenCilk enables you to teach principles of performance engineering using a state-of-the-art task-parallel platform that is easy to learn. description_color: var(--midnight) description_bg: var(--lightteal) button: Learn @@ -64,22 +64,20 @@ features:
-

{{ metadata.tagline }}

+

{{ metadata.tagline }}

- -
{% for item in features %}
-
-
+
+
{{ item.call_1 }}
{{ item.call_2 }}
-
+
-
+
{{ item.description }}
@@ -98,15 +96,37 @@ features:

{{ title }}

-

OpenCilk is an open-source platform that makes parallel programming a simple extension of serial programming.

-
    -
  • Efficient compiling makes your OpenCilk program faster.
  • -
  • Provably efficient scheduling tunes each execution of your OpenCilk program to its host environment.
  • -
  • Provable race-detection guarantees that your OpenCilk program has a deterministic result.
  • +
      +
    • Write fast parallel code for shared-memory multicores
    • +
    • Analyze and benchmark the parallel scalability of your program
    • +
    • Detect and debug races or prove that your program execution is race-free
-

Featured blog posts

+
+
+ OpenCilk is an open-source software development infrastructure for task-parallel programming that allows for substantial code reuse and easy exploration of design choices in language abstraction, compilation strategy, runtime mechanism, and productivity tool development. +
+
+ OpenCilk provides an ideal environment for developing fast code for applications that run on commodity and cloud multicore computers. It features a simple language, small codebase, and mathematically provable guarantees of good performance. +
+
+
+
+

Measure parallelism and maximize scalability with automated benchmarking

+ With CilkScale you can ensure that your program scales up and down to make the most of any host system. +
+
+

Optimize your code with a compiler that KNOWS parallelism

+ OpenCilk augments the “middle-end” of LLVM to represent parallel control flow and bring every LLVM optimization to bear on your parallelized code. +
+
+ +
+ Join the community of OpenCilk educators to share teaching materials and learn about software performance engineering. +
+ +

Featured blog posts

diff --git a/src/index.njk b/src/index.njk index 3392a305..55897886 100644 --- a/src/index.njk +++ b/src/index.njk @@ -1,5 +1,5 @@ --- -title: Fastcode makes it easy to +title: Explore software performance engineering layout: layouts/home.njk eleventyNavigation: key: Home @@ -9,6 +9,27 @@ hero: light: /img/Fastcode-Logo.png dark: /img/Fastcode-Logo-dark.png subtitle: The language of performance engineering +actioncalls: +- number: 0 + header: From "zero" to "performance engineering" in minutes + description: Get started on Speedcode, where there's nothing to install. + button: Learn more + button_link: https://speedcode.org +- number: 1 + header: Enter the programming competition at PPoPP + description: blingg + button: Learn more + button_link: /contribute +- number: 2 + header: Teach software performance engineering + description: OpenCilk lets you teach multicore computing with a state-of-the-art platform that is easy to learn. + button: Learn more + button_link: https://opencilk.org/community/teach-performance +- number: 3 + header: Join the SPE instructors' community + description: Share your questions and resources on performance engineering with like-minded faculty. + button: Learn more + button_link: https://opencilk.org/community/teach-performance features: - call_1: Go call_2: Multicore @@ -64,38 +85,82 @@ features:
-

{{ metadata.tagline }}

+

{{ metadata.tagline }}

- -
-
- {% for item in features %} -
- -
+ +

{{ title }}

+ +
+
+ {% for item in features %} +
+
+
+
{{ item.call_1 }}
{{ item.call_2 }}
+
+
+
+ + {{ item.description }} +
+ +
+
+ {% endfor %} +
+
+
  • Write fast parallel code for shared-memory multicores
  • Analyze and benchmark the parallel scalability of your program
  • From 224c980ff9fb246f646b03608aae7d564374a4c3 Mon Sep 17 00:00:00 2001 From: Bruce Hoppe Date: Wed, 4 Sep 2024 16:24:43 -0400 Subject: [PATCH 06/13] delete doc folder --- src/doc/doc.11tydata.js | 54 --- src/doc/index.njk | 60 --- src/doc/reference.md | 18 - src/doc/reference/cilkscale.md | 429 ---------------- src/doc/reference/glossary.md | 18 - src/doc/reference/glossary/atomic.md | 11 - .../reference/glossary/chip_multiprocessor.md | 6 - src/doc/reference/glossary/cilk.md | 11 - src/doc/reference/glossary/cilk_1.md | 6 - src/doc/reference/glossary/cilk_5.md | 8 - src/doc/reference/glossary/cilk_for.md | 8 - src/doc/reference/glossary/cilk_plus.md | 7 - src/doc/reference/glossary/cilk_scope.md | 5 - src/doc/reference/glossary/cilk_spawn.md | 8 - src/doc/reference/glossary/cilk_sync.md | 9 - src/doc/reference/glossary/cilkpp.md | 8 - src/doc/reference/glossary/cilksan.md | 7 - .../glossary/commutative_operation.md | 10 - .../reference/glossary/concurrent_agent.md | 8 - src/doc/reference/glossary/core.md | 10 - src/doc/reference/glossary/cpu.md | 7 - .../glossary/critical_path_length.md | 5 - .../reference/glossary/critical_section.md | 5 - src/doc/reference/glossary/data_race.md | 10 - src/doc/reference/glossary/deadlock.md | 9 - .../reference/glossary/determinacy_race.md | 8 - src/doc/reference/glossary/determinism.md | 9 - .../reference/glossary/distributed_memory.md | 10 - src/doc/reference/glossary/execution_time.md | 6 - src/doc/reference/glossary/fake_lock.md | 9 - src/doc/reference/glossary/false_sharing.md | 11 - src/doc/reference/glossary/global_variable.md | 6 - src/doc/reference/glossary/glossary.json | 9 - src/doc/reference/glossary/hyperobject.md | 13 - src/doc/reference/glossary/instruction.md | 5 - src/doc/reference/glossary/knot.md | 15 - src/doc/reference/glossary/linear_speedup.md | 6 - src/doc/reference/glossary/lock.md | 12 - src/doc/reference/glossary/lock_contention.md | 5 - src/doc/reference/glossary/multicore.md | 5 - src/doc/reference/glossary/multiprocessor.md | 5 - src/doc/reference/glossary/mutex.md | 10 - src/doc/reference/glossary/nondeterminism.md | 9 - .../reference/glossary/nonlocal_variable.md | 10 - src/doc/reference/glossary/opencilk.md | 5 - src/doc/reference/glossary/parallel_loop.md | 8 - src/doc/reference/glossary/parallelism.md | 8 - .../glossary/perfect_linear_speedup.md | 6 - src/doc/reference/glossary/process.md | 11 - src/doc/reference/glossary/processor.md | 12 - src/doc/reference/glossary/race_condition.md | 9 - src/doc/reference/glossary/receiver.md | 5 - src/doc/reference/glossary/reducer.md | 15 - src/doc/reference/glossary/response_time.md | 8 - src/doc/reference/glossary/running_time.md | 6 - src/doc/reference/glossary/scale_down.md | 6 - src/doc/reference/glossary/scale_up.md | 7 - .../glossary/sequential_consistency.md | 11 - .../reference/glossary/serial_execution.md | 5 - .../reference/glossary/serial_projection.md | 14 - .../reference/glossary/serial_semantics.md | 8 - src/doc/reference/glossary/serialization.md | 5 - src/doc/reference/glossary/shared_memory.md | 10 - src/doc/reference/glossary/span.md | 11 - src/doc/reference/glossary/spawn.md | 8 - src/doc/reference/glossary/speedup.md | 10 - src/doc/reference/glossary/strand.md | 7 - src/doc/reference/glossary/sync.md | 9 - src/doc/reference/glossary/task-parallel.md | 8 - src/doc/reference/glossary/thread.md | 7 - src/doc/reference/glossary/throughput.md | 5 - src/doc/reference/glossary/view.md | 5 - src/doc/reference/glossary/work.md | 6 - src/doc/reference/glossary/work_stealing.md | 12 - src/doc/reference/glossary/worker.md | 6 - src/doc/reference/reducers.md | 260 ---------- src/doc/reference/reducers.md~ | 257 ---------- src/doc/reference/reference.json | 12 - src/doc/tutorials.md | 12 - .../introduction-to-cilk-programming.md | 226 --------- src/doc/tutorials/keywords.md | 112 ----- src/doc/tutorials/opencilk-concepts.md | 106 ---- src/doc/tutorials/tutorials.json | 12 - src/doc/users-guide.md | 12 - .../users-guide/build-opencilk-from-source.md | 217 --------- src/doc/users-guide/cilkscale.md | 458 ------------------ src/doc/users-guide/convert-a-c++-program.md | 213 -------- src/doc/users-guide/getting-started.md | 275 ----------- src/doc/users-guide/install.md | 200 -------- src/doc/users-guide/users-guide.json | 12 - 90 files changed, 3537 deletions(-) delete mode 100644 src/doc/doc.11tydata.js delete mode 100644 src/doc/index.njk delete mode 100644 src/doc/reference.md delete mode 100644 src/doc/reference/cilkscale.md delete mode 100644 src/doc/reference/glossary.md delete mode 100644 src/doc/reference/glossary/atomic.md delete mode 100644 src/doc/reference/glossary/chip_multiprocessor.md delete mode 100644 src/doc/reference/glossary/cilk.md delete mode 100644 src/doc/reference/glossary/cilk_1.md delete mode 100644 src/doc/reference/glossary/cilk_5.md delete mode 100644 src/doc/reference/glossary/cilk_for.md delete mode 100644 src/doc/reference/glossary/cilk_plus.md delete mode 100644 src/doc/reference/glossary/cilk_scope.md delete mode 100644 src/doc/reference/glossary/cilk_spawn.md delete mode 100644 src/doc/reference/glossary/cilk_sync.md delete mode 100644 src/doc/reference/glossary/cilkpp.md delete mode 100644 src/doc/reference/glossary/cilksan.md delete mode 100644 src/doc/reference/glossary/commutative_operation.md delete mode 100644 src/doc/reference/glossary/concurrent_agent.md delete mode 100644 src/doc/reference/glossary/core.md delete mode 100644 src/doc/reference/glossary/cpu.md delete mode 100644 src/doc/reference/glossary/critical_path_length.md delete mode 100644 src/doc/reference/glossary/critical_section.md delete mode 100644 src/doc/reference/glossary/data_race.md delete mode 100644 src/doc/reference/glossary/deadlock.md delete mode 100644 src/doc/reference/glossary/determinacy_race.md delete mode 100644 src/doc/reference/glossary/determinism.md delete mode 100644 src/doc/reference/glossary/distributed_memory.md delete mode 100644 src/doc/reference/glossary/execution_time.md delete mode 100644 src/doc/reference/glossary/fake_lock.md delete mode 100644 src/doc/reference/glossary/false_sharing.md delete mode 100644 src/doc/reference/glossary/global_variable.md delete mode 100644 src/doc/reference/glossary/glossary.json delete mode 100644 src/doc/reference/glossary/hyperobject.md delete mode 100644 src/doc/reference/glossary/instruction.md delete mode 100644 src/doc/reference/glossary/knot.md delete mode 100644 src/doc/reference/glossary/linear_speedup.md delete mode 100644 src/doc/reference/glossary/lock.md delete mode 100644 src/doc/reference/glossary/lock_contention.md delete mode 100644 src/doc/reference/glossary/multicore.md delete mode 100644 src/doc/reference/glossary/multiprocessor.md delete mode 100644 src/doc/reference/glossary/mutex.md delete mode 100644 src/doc/reference/glossary/nondeterminism.md delete mode 100644 src/doc/reference/glossary/nonlocal_variable.md delete mode 100644 src/doc/reference/glossary/opencilk.md delete mode 100644 src/doc/reference/glossary/parallel_loop.md delete mode 100644 src/doc/reference/glossary/parallelism.md delete mode 100644 src/doc/reference/glossary/perfect_linear_speedup.md delete mode 100644 src/doc/reference/glossary/process.md delete mode 100644 src/doc/reference/glossary/processor.md delete mode 100644 src/doc/reference/glossary/race_condition.md delete mode 100644 src/doc/reference/glossary/receiver.md delete mode 100644 src/doc/reference/glossary/reducer.md delete mode 100644 src/doc/reference/glossary/response_time.md delete mode 100644 src/doc/reference/glossary/running_time.md delete mode 100644 src/doc/reference/glossary/scale_down.md delete mode 100644 src/doc/reference/glossary/scale_up.md delete mode 100644 src/doc/reference/glossary/sequential_consistency.md delete mode 100644 src/doc/reference/glossary/serial_execution.md delete mode 100644 src/doc/reference/glossary/serial_projection.md delete mode 100644 src/doc/reference/glossary/serial_semantics.md delete mode 100644 src/doc/reference/glossary/serialization.md delete mode 100644 src/doc/reference/glossary/shared_memory.md delete mode 100644 src/doc/reference/glossary/span.md delete mode 100644 src/doc/reference/glossary/spawn.md delete mode 100644 src/doc/reference/glossary/speedup.md delete mode 100644 src/doc/reference/glossary/strand.md delete mode 100644 src/doc/reference/glossary/sync.md delete mode 100644 src/doc/reference/glossary/task-parallel.md delete mode 100644 src/doc/reference/glossary/thread.md delete mode 100644 src/doc/reference/glossary/throughput.md delete mode 100644 src/doc/reference/glossary/view.md delete mode 100644 src/doc/reference/glossary/work.md delete mode 100644 src/doc/reference/glossary/work_stealing.md delete mode 100644 src/doc/reference/glossary/worker.md delete mode 100644 src/doc/reference/reducers.md delete mode 100644 src/doc/reference/reducers.md~ delete mode 100644 src/doc/reference/reference.json delete mode 100644 src/doc/tutorials.md delete mode 100644 src/doc/tutorials/introduction-to-cilk-programming.md delete mode 100644 src/doc/tutorials/keywords.md delete mode 100644 src/doc/tutorials/opencilk-concepts.md delete mode 100644 src/doc/tutorials/tutorials.json delete mode 100644 src/doc/users-guide.md delete mode 100644 src/doc/users-guide/build-opencilk-from-source.md delete mode 100644 src/doc/users-guide/cilkscale.md delete mode 100644 src/doc/users-guide/convert-a-c++-program.md delete mode 100644 src/doc/users-guide/getting-started.md delete mode 100644 src/doc/users-guide/install.md delete mode 100644 src/doc/users-guide/users-guide.json diff --git a/src/doc/doc.11tydata.js b/src/doc/doc.11tydata.js deleted file mode 100644 index 9fd586d9..00000000 --- a/src/doc/doc.11tydata.js +++ /dev/null @@ -1,54 +0,0 @@ -require('dotenv').config(); - -const isDevEnv = process.env.ELEVENTY_ENV === 'development'; -const todaysDate = new Date(); - -function showDraft(data) { - const isDraft = 'draft' in data && data.draft !== false; - const isFutureDate = data.page.date > todaysDate; - return isDevEnv || (!isDraft && !isFutureDate); -} - -module.exports = function() { - return { - eleventyComputed: { - eleventyExcludeFromCollections: function(data) { - if(showDraft(data)) { - return data.eleventyExcludeFromCollections; - } - else { - return true; - } - }, - permalink: function(data) { - if(showDraft(data)) { - return data.permalink - } - else { - return false; - } - }, - eleventyNavigation: { - key: function(data) { - if(showDraft(data)) { - return data.title - } - else { - return false; - } - } - }, - sidebar: function(data) { - return 'toc'; - }, - background: function(data) { - if(('draft' in data && data.draft !== false) || (data.page.date > todaysDate)) { - return 'text-white bg-info' - } - else { - return 'bg-white'; - } - } - } - } -} \ No newline at end of file diff --git a/src/doc/index.njk b/src/doc/index.njk deleted file mode 100644 index 5dfd63e0..00000000 --- a/src/doc/index.njk +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: Documentation -layout: layouts/page.njk -eleventyNavigation: - key: Documentation - parent: Home - order: 4 ---- - -

    You can browse the documentation with our curated tags.

    - -

    See also our Fastcode Blog, which puts it all in context with stories about the latest developments in performance engineering.

    - -
    -
    -
    -

    User's guide

    -

    Doing things with OpenCilk

    -
    - {% set items = collections.all | eleventyNavigation("User's guide") %} - -
    - -
    -
    -

    Tutorials

    -

    Learning OpenCilk concepts

    -
    - {% set items = collections.all | eleventyNavigation("Tutorials") %} - -
    - -
    -
    -

    Reference

    -

    Defining OpenCilk specifications

    -
    - {% set items = collections.all | eleventyNavigation("Reference") %} - -
    -
    - diff --git a/src/doc/reference.md b/src/doc/reference.md deleted file mode 100644 index ff14ea87..00000000 --- a/src/doc/reference.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: Reference -eleventyNavigation: - key: Reference - parent: Documentation - order: 3 - url: /doc/ -# permalink: /doc/reference/ ---- - - -Dummy page that exists to provide "reference" nav bread crumb, -which when clicked goes to Documentation landing page - - -OpenCilk reference documentation provides technical specifications describing the OpenCilk language and the run-time support for the language. Together, these documents provide the detail needed to implement a compliant compiler. At this time the following specifications are available: -- [The OpenCilk Language Specification](/doc/reference/language-specification/) -- The OpenCilk Application Binary Interface (XXX Add link) \ No newline at end of file diff --git a/src/doc/reference/cilkscale.md b/src/doc/reference/cilkscale.md deleted file mode 100644 index 22de30a2..00000000 --- a/src/doc/reference/cilkscale.md +++ /dev/null @@ -1,429 +0,0 @@ ---- -title: Cilkscale reference -tags: - - cilkscale - - tools -date: 2022-09-01 -author: Alexandros-Stavros Iliopoulos -eleventyNavigation: - key: Cilkscale reference ---- - -The OpenCilk Cilkscale tool comprises three main components: - -- Infrastructure in the OpenCilk compiler and runtime system for work/span - analysis, -- A C/C++ API for fine-grained analysis of program regions, and -- A Python script that automates scalability analysis, benchmarking on multiple - cores, and visualization of parallel performance results. - -This reference page summarizes the work/span analysis measurements reported by -Cilkscale, and details the interface, options, and output of each component. -To learn more about how to use Cilkscale to analyze the parallel performance of -your Cilk program, see the [Cilkscale user's -guide](/doc/users-guide/cilkscale). - -{% alert %} - -The terminal command examples in this page assume that OpenCilk is -installed within `/opt/opencilk/`, as shown in the [Install -page](/doc/users-guide/install/#example). - -{% endalert %} - - -## Work/span analysis measurements - -Cilkscale work/span analysis reports contain the following measurements for -each analyzed program region. - -- {% defn "Work" %}: the CPU time of the computation when run on one processor, - sometimes denoted $T_1$. The actual wall-clock time it takes to run the - computation in parallel will generally be smaller than the work, since the - latter adds together the time spent on different CPU cores. - -- {% defn "Span" %}: the theoretically fastest CPU time of the computation when - run on an infinite number of parallel processors (discounting overheads for - communication and scheduling), sometimes denoted $T_{\infty}$. The span is - the maximum amount of work along any path in the {% defn "parallel trace" %} - of the computation. - -- {% defn "Parallelism" %}: the ratio of work to span for a computation $(T_1 / - T_{\infty})$. Parallelism can be interpreted as the maximum possible speedup - of the computation, or as the maximum number of processors that could - theoretically yield {% defn "perfect linear speedup" %}. - -- ***Burdened span***: similar to span after accounting for worst-case - scheduling overhead or "burden". The scheduling burden is based on a - heuristic estimate of the costs associated with migrating and synchronizing - parallel tasks among processors. The worst-case scenario is when every time - it is possible for a task to be migrated, the scheduler does migrate it. (In - practice, there are additional factors besides scheduling overhead that can - slow down parallel execution, such as insufficient memory bandwidth, - contention on parallel resources, false sharing, etc.) - -- ***Burdened parallelism***: the ratio of work to burdened span. It can be - interpreted as a lower bound for the parallelism of the computation assuming - worst-case parallel scheduling (and ignoring other possible factors of - parallel slowdown). - -{% alert "note", "References:" %} - -- Y. He, C.E. Leiserson, and W.M. Leiserson, [_The Cilkview scalability - analyzer_](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/cilkview.pdf), - SPAA 2010, pp. 145–156. -- T.B. Schardl, B.C. Kuszmaul, I.T.A. Lee, W.M. Leiserson, and C.E. Leiserson, - [_The Cilkprof scalability - profiler_](http://supertech.csail.mit.edu/papers/cilkprof.pdf), SPAA 2015, - pp. 89–100. - -{% endalert %} - - -## Compiler options - -- `-fcilktool=cilkscale` - Instrument the program to measure work and span in - seconds. Work/span measurements in seconds are non-deterministic. - -- `-fcilktool=cilkscale-instructions` - Instrument the program to measure work and span in LLVM pseudo-instructions: - weighted counts of architecture-independent instructions based on LLVM's - internal representation and cost model. Work/span measurements in - pseudo-instructions are deterministic but introduce higher runtime overhead - than measurements in seconds. - -- `-fcilktool=cilkscale-benchmark` - Instrument the program to measure wall-clock execution time (in seconds) - instead of work and span. - -{% alert "note", "Example:" %} - -```shell-session -$ /opt/opencilk/bin/clang qsort.c -fopencilk -fcilktool=cilkscale -O3 -o qsort_cs -$ /opt/opencilk/bin/clang qsort.c -fopencilk -fcilktool=cilkscale-instructions -O3 -o qsort_csinstr -$ /opt/opencilk/bin/clang qsort.c -fopencilk -fcilktool=cilkscale-benchmark -O3 -o qsort_cs_bench -``` - -{% endalert %} - -{% alert "warning", "Note:" %} - -The Cilkscale instrumentation flags must be used for both -compilation and linking. - -{% endalert %} - - -## Analysis report file - -When a Cilkscale-instrumented program is executed, Cilkscale reports its -measurements by printing them to the standard output stream by default. To -output Cilkscale measurements into a file instead of the standard output, set -the desired file path as the value of the environment variable `CILKSCALE_OUT`. - -{% alert "note", "Example:" %} - -```shell-session -$ CILKSCALE_OUT=qsort_workspan_report.csv ./qsort_cs 100000000 -[...program output without Cilkscale's report...] -$ cat qsort_workspan_report.csv -tag,work (seconds),span (seconds),parallelism,burdened_span (seconds),burdened_parallelism -,26.3454,2.22239,11.8545,2.22271,11.8528 -``` - -{% endalert %} - -{% alert "warning", "Note:" %} - -Cilkscale assumes that the path in `CILKSCALE_OUT` points to a file -in an existing directory. - -- If the directory does not exist, the report is printed to the standard output - instead. -- If the file already exists, the report will overwrite the file's contents. - -{% endalert %} - - -## C/C++ API for fine-grained analysis - -The Cilkscale C/C++ API enables fine-grained analysis of specific code regions. -If the program is compiled with the flag `-fcilktool=cilkscale` or -`-fcilktool=cilkscale-instructions`, the Cilkscale API functions measure work -and span (in seconds or pseudo-instructions, respectively) as described below. -If, however, the program is compiled with the flag -`-fcilktool=cilkscale-benchmark`, then the functions below measure wall-clock -execution time instead of work and span. - -{% alert %} - -Calls to the Cilkscale API functions are elided if the program is -compiled without any of the Cilkscale instrumentation flags. - -{% endalert %} - -### Cilkscale API header file - -```c -#include -``` - -### Work/span measurement type - -```c -wsp_t workspan_measurement_var; -``` - -### Get work/span measurement at point - -```c -wsp_t wsp_getworkspan() -``` - -Return the work and span of the computation from the beginning of the program -up to the point of the `wsp_getworkspan()` function call in the program's -parallel trace. - -### Zero-initialized work/span variable - -```c -wsp_t wsp_zero() -``` - -Return a value with zero work and span measurements. Needed to initialize -work/span accumulation variables. - -### Work/span difference - -```c -wsp_t wsp_sub(wsp_t lhs, wsp_t rhs) -``` - -Return the work/span difference between the `lhs` and `rhs` measurements. -Useful for measuring the work and span of program regions between -`wsp_getworkspan()` calls. - -### Work/span sum - -```c -wsp_t wsp_add(wsp_t lhs, wsp_t rhs) -``` - -Return the work/span sum of the `lhs` and `rhs` measurements. Useful when -accumulating work/span measurements of non-contiguous program regions. - -### Print CSV row of work/span measurements - -```c -void wsp_dump(wsp_t wsp, const char *tag) -``` - -Print a tagged row with the measurements of `wsp` in [CSV -format](https://en.wikipedia.org/wiki/Comma-separated_values). The fields in -the printed row are, in order: the `tag` string, work, span, parallelism, -burdened span, and burdened parallelism. - -See also: [Cilkscale work/span analysis -measurements](#workspan-analysis-measurements). - -### C++ operator overloads - -In C++, the Cilkscale API also defines operator overloads for `wsp_t` -variables: - -- The `-` and `-=` operators correspond to calls to `wsp_sub()`. -- The `+` and `+=` operators correspond to calls to `wsp_add()`. -- The `<<` operator can be used with a prefix argument of type `std::ostream` - or `std::ofstream` to print work/span measurements. The `<<` operator - behaves similarly to `wsp_dump()`, except that (1) it does not print a tag - field, and (2) its output stream is unaffected by the `CILKSCALE_OUT` - environment variable. - -### Examples - -{% alert "note", "Example 1:" %} - -Measure the work and span of a computation in a contiguous -code region. - -```c -wsp_t start = wsp_getworkspan(); -/* ...analyzed computation... */ -wsp_t end = wsp_getworkspan(); -wsp_t elapsed = wsp_sub(end, start); -wsp_dump(elapsed, "my computation"); -``` - -{% endalert %} - -{% alert "note", "Example 2:" %} - -Measure the work and span of an iterative computation. The -analyzed code region is non-contiguous in the program's execution trace. - -```c -wsp_t wsp_iter = wsp_zero(); -while (iteration_condition) { - /* ...non-analyzed code... (e.g., printing to logs, diagnostic computations, etc) */ - wsp_t start = wsp_getworkspan(); - /* ...analyzed iterative computation... */ - wsp_t end = wsp_getworkspan(); - wsp_t elapsed = wsp_sub(end, start); - wsp_iter = wsp_add(wsp_iter, elapsed); -} -wsp_dump(wsp_iter, "iterative computation"); -``` - -{% endalert %} - - -## Benchmarking and visualization Python script - -The Cilkscale benchmarking and visualization Python script is found at -`share/Cilkscale_vis/cilkscale.py` within the OpenCilk installation directory. -It takes as input two Cilkscale-instrumented binaries of the same application -and a number of optional arguments. Its output is a table and set of graphical -plots of parallel performance and scalability measurements. - -{% alert "warning", "Prerequisites:" %} - -To use the `cilkscale.py` script, you need: - -- [Python](https://www.python.org/downloads/) 3.8 or later. -- (Optional) [matplotlib](https://pypi.org/project/matplotlib/) 3.5.0 or later; - only required if producing graphical plots. - -{% endalert %} - -### Running the `cilkscale.py` script - -```shell-session -$ python3 /opt/opencilk/share/Cilkscale_vis/cilkscale.py ARGUMENTS -``` - -#### Arguments - -- `-h`, `--help` - Print usage documentation and exit. - -- `-c BIN_CILKSCALE`, `--cilkscale BIN_CILKSCALE` - _(Required)_ Path to program binary instrumented with `-fcilktool=cilkscale`. - -- `-b BIN_CILKSCALE_BENCH`, `--cilkscale-benchmark BIN_CILKSCALE_BENCH` - _(Required)_ Path to program binary instrumented with - `-fcilktool=cilkscale-benchmark`. - -- `-cpus CPU_COUNTS`, `--cpu-counts CPU_COUNTS` - _(Optional)_ Comma-separated list of how many cores to use when running - empirical performance benchmarks. Cilkscale runs the benchmark binary once - for each core count in the list. For each run, the number of parallel Cilk - workers is equal to the number of cores, and the latter are specified - explicitly by setting the [processor - affinity](https://en.wikipedia.org/wiki/Processor_affinity) of the run. On - systems with [simultaneous multithreading - (SMT)](https://en.wikipedia.org/wiki/Simultaneous_multithreading) (aka - "hyper-threading" on Intel CPUs), Cilkscale only uses distinct physical - cores. On systems with multiple processor nodes with [non-uniform memory - access (NUMA)](https://en.wikipedia.org/wiki/Non-uniform_memory_access), - Cilkscale - selects all cores from one processor before moving on to other processors. - _Default:_ `1,2,...,P`, where `P` is the total number of available physical - cores. - -- `-ocsv OUTPUT_CSV`, `--output-csv OUTPUT_CSV` - _(Optional)_ Path to CSV file for table of work/span and benchmarking measurements. - _Default:_ `out.csv`. - -- `-oplot OUTPUT_PLOT`, `--output-plot OUTPUT_PLOT` - _(Optional)_ Path to PDF file for graphical plots of work/span and - benchmarking measurements. - _Default:_ `plot.pdf` - -- `-rplot ROWS_TO_PLOT`, `--rows-to-plot ROWS_TO_PLOT` - _(Optional)_ Comma-separated list of rows (0-indexed) in the CSV table for - which to generate plots; or `all` to plot all rows. - _Default:_ `all`. - -- `-a ARG1 ARG2 ...`, `--args ARG1 ARG2 ...` - _(Optional)_ Space-separated list of command-line arguments to pass to the - program binary. - _Default:_ no arguments. - -{% alert "note", "Example:" %} - -```shell-session -$ /opt/opencilk/bin/clang qsort.c -fopencilk -fcilktool=cilkscale -O3 -o qsort_cs -$ /opt/opencilk/bin/clang qsort.c -fopencilk -fcilktool=cilkscale-benchmark -O3 -o qsort_cs_bench -$ python3 /opt/opencilk/share/Cilkscale_vis/cilkscale.py \ - -c ./qsort_cs -b ./qsort_cs_bench \ - -ocsv qsort-bench.csv -oplot qsort-scalability-plots.pdf \ - --args 100000000 -Namespace(args=['100000000'], cilkscale='./qsort_cs', cilkscale_benchmark='./qsort_cs_bench', cpu_counts=None, output_csv='qsort-bench.csv', output_plot='qsort-scalability-plots.pdf', rows_to_plot='all') - -\>> STDOUT (./qsort_cilkscale 100000000) -Sorting 100000000 random integers -Sort succeeded -<< END STDOUT - -\>> STDERR (./qsort_cilkscale 100000000) -<< END STDERR - -INFO:runner:Generating scalability data for 8 cpus. -INFO:runner:CILK_NWORKERS=1 taskset -c 0 ./qsort_cilkscale_bench 100000000 -INFO:runner:CILK_NWORKERS=2 taskset -c 0,2 ./qsort_cilkscale_bench 100000000 -INFO:runner:CILK_NWORKERS=3 taskset -c 0,2,4 ./qsort_cilkscale_bench 100000000 -INFO:runner:CILK_NWORKERS=4 taskset -c 0,2,4,6 ./qsort_cilkscale_bench 100000000 -INFO:runner:CILK_NWORKERS=5 taskset -c 0,2,4,6,8 ./qsort_cilkscale_bench 100000000 -INFO:runner:CILK_NWORKERS=6 taskset -c 0,2,4,6,8,10 ./qsort_cilkscale_bench 100000000 -INFO:runner:CILK_NWORKERS=7 taskset -c 0,2,4,6,8,10,12 ./qsort_cilkscale_bench 100000000 -INFO:runner:CILK_NWORKERS=8 taskset -c 0,2,4,6,8,10,12,14 ./qsort_cilkscale_bench 100000000 -INFO:plotter:Generating plot (2 subplots) -``` - -{% endalert %} - -### Performance and scalability analysis plots - -An example set of plots produced by the `cilkscale.py` script is shown -below. In this example, the instrumented application is a parallel quicksort -and the Cilkscale API was used to analyze one program region (tagged as -"sampled_qsort" in the relevant call to `wsp_dump()`) in addition to the whole -program which is always analyzed by Cilkscale. Details on how these plots were -generated can be found in the [Cilkscale user's -guide](/doc/users-guide/cilkscale). - -{% img "/img/qsort-cilkscale-scalability-plots.png", "100%" %} - -The Cilkscale visualization plots are arranged in two columns and as many rows -as calls to the Cilkscale API `wsp_dump()` function (plus one untagged row for -the whole-program execution). - -**Wall-clock execution time.** The left-column plots show wall-clock execution -time in seconds as a function of the number of parallel Cilk workers. -Specifically, these figures plot four types of measurements: - -- Magenta-colored dots show the _observed_ timing measurements for the - benchmarking runs. Benchmarking runs do not involve work/span analysis - measurement overheads. -- A dark green line shows what the execution time would be if the computation - exhibited _perfect linear speedup_, that is, if the time on $P$ cores were to - be $P$ times smaller than the time it took on one core. -- A teal line shows the heuristic _burdened-dag bound_ of the execution time - (the parallel trace of the computation is sometimes also referred to as its - directed acyclic graph or dag). In the absence of other sources of parallel - slowdown such as insufficient memory bandwidth, contention, etc., the - burdened-dag bound serves as a heuristic lower bound for the execution time - if the parallel computation does not exhibit sufficient parallelism and is - not too fine-grained. -- A mustard-yellow horizontal line shows the _span bound_, that is, the minimum - possible execution time if the computation was run on infinitely many - processing cores and there were no additional overheads for parallel - scheduling, etc. - -**Parallel speedup.** The right-column plots contain the same information as -those in the left column, except that the y-axis shows parallel speedup. That -is, all execution time measurements are divided by the execution time of the -computation on one core. The horizontal line for parallelism (serial execution -time divided by span) is not visible in the speedup plots if its value falls -outside the range of the y-axis. diff --git a/src/doc/reference/glossary.md b/src/doc/reference/glossary.md deleted file mode 100644 index 1fcc42bc..00000000 --- a/src/doc/reference/glossary.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: Glossary -stylesheet: glossary.css -attribution: true -eleventyNavigation: - key: Glossary - parent: Reference ---- - -{% for entry in collections.glossary %} - -## {{ entry.data.title }} - -{{ entry.templateContent | markdownify | safe }} - -{% endfor %} - - diff --git a/src/doc/reference/glossary/atomic.md b/src/doc/reference/glossary/atomic.md deleted file mode 100644 index 77da80ef..00000000 --- a/src/doc/reference/glossary/atomic.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Atomic -tags: atomic ---- -Indivisible. An {% defn "instruction" %} sequence -executed by a {% defn "strand" %} is atomic if it -appears at any moment to any other -strand as if either no instructions in the -sequence have been executed or all -instructions in the sequence have been -executed. \ No newline at end of file diff --git a/src/doc/reference/glossary/chip_multiprocessor.md b/src/doc/reference/glossary/chip_multiprocessor.md deleted file mode 100644 index 38ca76a6..00000000 --- a/src/doc/reference/glossary/chip_multiprocessor.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Chip multiprocessor -tags: Chip multiprocessor ---- -A general-purpose {% defn "multiprocessor" %} -implemented as a single {% defn "multicore" %} chip. \ No newline at end of file diff --git a/src/doc/reference/glossary/cilk.md b/src/doc/reference/glossary/cilk.md deleted file mode 100644 index f64e73d1..00000000 --- a/src/doc/reference/glossary/cilk.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Cilk -tags: cilk ---- -An extension to the C and C++ -programming languages that allows a -programmer to express {% defn "task-parallel", "task parallelism" %}. -Important milestones in the history of Cilk include -{% defn "Cilk-1" %}, {% defn "Cilk-5" %}, -{% defn "Cilkpp", "Cilk++" %}, {% defn "Cilk Plus" %}, -and {% defn "OpenCilk" %}. \ No newline at end of file diff --git a/src/doc/reference/glossary/cilk_1.md b/src/doc/reference/glossary/cilk_1.md deleted file mode 100644 index 5a09fa52..00000000 --- a/src/doc/reference/glossary/cilk_1.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Cilk-1 -tags: cilk ---- -The first important milestone in the history of {% defn "Cilk" %}, -Cilk-1 was developed at MIT and provided provably efficient work-stealing runtime support but little linguistic support. \ No newline at end of file diff --git a/src/doc/reference/glossary/cilk_5.md b/src/doc/reference/glossary/cilk_5.md deleted file mode 100644 index cf6c1692..00000000 --- a/src/doc/reference/glossary/cilk_5.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Cilk-5 -tags: cilk ---- -The next important milestone after {% defn "Cilk-1" %} -in the history of {% defn "Cilk" %}, -Cilk-5 was developed at MIT and provided simple -linguistic extensions to ANSI C for multithreading. \ No newline at end of file diff --git a/src/doc/reference/glossary/cilk_for.md b/src/doc/reference/glossary/cilk_for.md deleted file mode 100644 index b0e09979..00000000 --- a/src/doc/reference/glossary/cilk_for.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: cilk_for -tags: cilk_for ---- -A keyword in the Cilk language that -indicates a `for` loop whose iterations -can be executed independently in -parallel. \ No newline at end of file diff --git a/src/doc/reference/glossary/cilk_plus.md b/src/doc/reference/glossary/cilk_plus.md deleted file mode 100644 index 0fe3209d..00000000 --- a/src/doc/reference/glossary/cilk_plus.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Cilk Plus -tags: cilk ---- -An important milestone in the history of {% defn "Cilk" %} -developed by Intel Corporation, Cilk Plus extended {% defn "Cilk++" %} -with transparent interoperability with legacy C/C++ binary executables. \ No newline at end of file diff --git a/src/doc/reference/glossary/cilk_scope.md b/src/doc/reference/glossary/cilk_scope.md deleted file mode 100644 index aa6b4fc1..00000000 --- a/src/doc/reference/glossary/cilk_scope.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: cilk_scope -tags: cilk_scope ---- -A keyword in the Cilk language that indicates that all spawned children within the scoped region must complete before proceeding. \ No newline at end of file diff --git a/src/doc/reference/glossary/cilk_spawn.md b/src/doc/reference/glossary/cilk_spawn.md deleted file mode 100644 index 3fdde6c5..00000000 --- a/src/doc/reference/glossary/cilk_spawn.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: cilk_spawn -tags: cilk_spawn ---- -A keyword in the Cilk language that -indicates that the named subroutine can -execute independently and in parallel -with the caller. \ No newline at end of file diff --git a/src/doc/reference/glossary/cilk_sync.md b/src/doc/reference/glossary/cilk_sync.md deleted file mode 100644 index 1a1a699f..00000000 --- a/src/doc/reference/glossary/cilk_sync.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: cilk_sync -tags: cilk_sync ---- -A keyword in the Cilk language that -indicates that all functions spawned -within the current function must complete -before statements following the -`cilk_sync` can be executed. \ No newline at end of file diff --git a/src/doc/reference/glossary/cilkpp.md b/src/doc/reference/glossary/cilkpp.md deleted file mode 100644 index 91ea4e80..00000000 --- a/src/doc/reference/glossary/cilkpp.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Cilk++ -permalink: /doc/reference/glossary/cilkpp/ -tags: cilk ---- -An important milestone in the history of {% defn "Cilk" %} -developed by CilkArts, Inc., Cilk++ extended {% defn "Cilk-5" %} -to C++ and introduced {% defn "reducer", "reducer hyperobjects" %} as an efficient means for resolving races on nonlocal variables. \ No newline at end of file diff --git a/src/doc/reference/glossary/cilksan.md b/src/doc/reference/glossary/cilksan.md deleted file mode 100644 index d74a0cc1..00000000 --- a/src/doc/reference/glossary/cilksan.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Cilksan -tags: Cilksan ---- -The Cilksan race detector is a tool -provided in OpenCilk for -finding {% defn "race condition" %} defects in Cilk code. \ No newline at end of file diff --git a/src/doc/reference/glossary/commutative_operation.md b/src/doc/reference/glossary/commutative_operation.md deleted file mode 100644 index 969f8789..00000000 --- a/src/doc/reference/glossary/commutative_operation.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Commutative operation -tags: commutative operation ---- -An operation $\circ$ over a type $T$ is -commutative if $a \circ b = b \circ a$ for -any two objects $a$ and $b$ of type $T$. -Integer addition and set union are -commutative, but string concatenation is -not. \ No newline at end of file diff --git a/src/doc/reference/glossary/concurrent_agent.md b/src/doc/reference/glossary/concurrent_agent.md deleted file mode 100644 index 3f85af47..00000000 --- a/src/doc/reference/glossary/concurrent_agent.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Concurrent agent -tags: concurrent agent ---- -A {% defn "processor" %}, {% defn "process" %}, {% defn "thread" %}, {% defn "strand" %}, or other entity that executes a program -instruction sequence in a computing -environment containing other such -entities. \ No newline at end of file diff --git a/src/doc/reference/glossary/core.md b/src/doc/reference/glossary/core.md deleted file mode 100644 index 92f2a273..00000000 --- a/src/doc/reference/glossary/core.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Core -tags: core ---- -A single {% defn "processor" %} unit of a {% defn "multicore" %} -chip. The terms "processor" and "{% defn "CPU" %}" -are often used in place of "core," -although industry usage varies. -*Archaic*: A solid-state memory made of -magnetized toroidal memory elements. \ No newline at end of file diff --git a/src/doc/reference/glossary/cpu.md b/src/doc/reference/glossary/cpu.md deleted file mode 100644 index 796e36a7..00000000 --- a/src/doc/reference/glossary/cpu.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: CPU -tags: cpu ---- -Central Processing Unit. We use this -term as a synonym for "{% defn "core" %}," or a single -processor of a multicore chip. \ No newline at end of file diff --git a/src/doc/reference/glossary/critical_path_length.md b/src/doc/reference/glossary/critical_path_length.md deleted file mode 100644 index 11b131b9..00000000 --- a/src/doc/reference/glossary/critical_path_length.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Critical-path length -tags: span ---- -See {% defn "span" %}. \ No newline at end of file diff --git a/src/doc/reference/glossary/critical_section.md b/src/doc/reference/glossary/critical_section.md deleted file mode 100644 index 8365266c..00000000 --- a/src/doc/reference/glossary/critical_section.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Critical section -tags: critical section ---- -The code executed by a {% defn "strand" %} while holding a {% defn "lock" %}. \ No newline at end of file diff --git a/src/doc/reference/glossary/data_race.md b/src/doc/reference/glossary/data_race.md deleted file mode 100644 index 14784ee4..00000000 --- a/src/doc/reference/glossary/data_race.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Data race -tags: data race ---- -A {% defn "race condition" %} that occurs when two or -more parallel strands, holding no {% defn "lock" %} in -common, access the same memory -location and at least one of the strands -performs a write. Compare with -{% defn "determinacy race" %}. \ No newline at end of file diff --git a/src/doc/reference/glossary/deadlock.md b/src/doc/reference/glossary/deadlock.md deleted file mode 100644 index 7eac250c..00000000 --- a/src/doc/reference/glossary/deadlock.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Deadlock -tags: deadlock ---- -A situation when two or more {% defn "strand", "strands" %} -are each waiting for another to -release a resource, and the "waiting-for" -relation forms a cycle so that none can -ever proceed. \ No newline at end of file diff --git a/src/doc/reference/glossary/determinacy_race.md b/src/doc/reference/glossary/determinacy_race.md deleted file mode 100644 index cecfdd80..00000000 --- a/src/doc/reference/glossary/determinacy_race.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Determinacy race -tags: determincacy race ---- -A {% defn "race condition" %} that occurs when two -logically parallel {% defn "strand", "strands" %} access the same -memory location and at least one strand -performs a write. \ No newline at end of file diff --git a/src/doc/reference/glossary/determinism.md b/src/doc/reference/glossary/determinism.md deleted file mode 100644 index fbb5d886..00000000 --- a/src/doc/reference/glossary/determinism.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Determinism -tags: determinism ---- -The property of a program when it -behaves identically from run to run when -executed on the same inputs. -Deterministic programs are usually -easier to debug. \ No newline at end of file diff --git a/src/doc/reference/glossary/distributed_memory.md b/src/doc/reference/glossary/distributed_memory.md deleted file mode 100644 index 0b3fb701..00000000 --- a/src/doc/reference/glossary/distributed_memory.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Distributed memory -tags: distributed memory ---- -Computer storage that is partitioned -among several {% defn "processors" %}. A distributed-memory {% defn "multiprocessor" %} is a computer in -which processors must send messages -to remote processors to access data in -remote processor memory. Contrast with -{% defn "shared memory" %}. \ No newline at end of file diff --git a/src/doc/reference/glossary/execution_time.md b/src/doc/reference/glossary/execution_time.md deleted file mode 100644 index 4685354c..00000000 --- a/src/doc/reference/glossary/execution_time.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Execution time -tags: execution time ---- -How long a program takes to execute on a given computer system. -Also called {% defn "running time" %}. \ No newline at end of file diff --git a/src/doc/reference/glossary/fake_lock.md b/src/doc/reference/glossary/fake_lock.md deleted file mode 100644 index e91a21bc..00000000 --- a/src/doc/reference/glossary/fake_lock.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Fake lock -tags: fake lock ---- -A construct that `Cilksan` treats as -a lock but which behaves like a no-op -during actual running of the program. A -fake lock can be used to suppress the -reporting of an intentional {% defn "race condition" %}. \ No newline at end of file diff --git a/src/doc/reference/glossary/false_sharing.md b/src/doc/reference/glossary/false_sharing.md deleted file mode 100644 index bb838efd..00000000 --- a/src/doc/reference/glossary/false_sharing.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: False sharing -tags: false sharing ---- -The situation that occurs when two -{% defn "strand", "strands" %} access different memory -locations residing on the same cache -block, thereby contending for the cache -block. For more information, see the -Wikipedia entry -[https://en.wikipedia.org/wiki/False_sharing](https://en.wikipedia.org/wiki/False_sharing). \ No newline at end of file diff --git a/src/doc/reference/glossary/global_variable.md b/src/doc/reference/glossary/global_variable.md deleted file mode 100644 index 81b52e90..00000000 --- a/src/doc/reference/glossary/global_variable.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Global variable -tags: global variable ---- -A variable that is bound outside of all local scopes. -See also {% defn "nonlocal variable" %}. \ No newline at end of file diff --git a/src/doc/reference/glossary/glossary.json b/src/doc/reference/glossary/glossary.json deleted file mode 100644 index 0c27bcb5..00000000 --- a/src/doc/reference/glossary/glossary.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "layout": "layouts/glossary.njk", - "background": "bg-white", - "permalink": "/doc/reference/glossary/{{ title | slugify }}/", - "eleventyNavigation": { - "parent": "Glossary" - }, - "tags": "glossary" -} \ No newline at end of file diff --git a/src/doc/reference/glossary/hyperobject.md b/src/doc/reference/glossary/hyperobject.md deleted file mode 100644 index 41ba6525..00000000 --- a/src/doc/reference/glossary/hyperobject.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Hyperobject -tags: hyperobject ---- -A linguistic construct supported by the -OpenCilk runtime system -that allows many {% defn "strand", "strands" %} -to coordinate in updating a shared -variable or data structure independently -by providing different {% defn "view", "views" %} -of the hyperobject to different strands at -the same time. The {% defn "reducer" %} is the only -hyperobject currently provided by OpenCilk. \ No newline at end of file diff --git a/src/doc/reference/glossary/instruction.md b/src/doc/reference/glossary/instruction.md deleted file mode 100644 index b559073c..00000000 --- a/src/doc/reference/glossary/instruction.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Instruction -tags: instruction ---- -A single operation executed by a {% defn "processor" %}. \ No newline at end of file diff --git a/src/doc/reference/glossary/knot.md b/src/doc/reference/glossary/knot.md deleted file mode 100644 index 0b0e9a42..00000000 --- a/src/doc/reference/glossary/knot.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: Knot -tags: knot ---- -A point at which the end of one {% defn "strand" %} -meets the end of another. If a knot has -one incoming strand and one outgoing -strand, it is a *serial knot*. If it has one -incoming strand and two outgoing -strands, it is a *spawn knot*. If it has -multiple incoming strands and one -outgoing strand, it is a *sync knot*. A -Cilk program does not produce serial -knots or knots with both multiple -incoming and multiple outgoing strands. \ No newline at end of file diff --git a/src/doc/reference/glossary/linear_speedup.md b/src/doc/reference/glossary/linear_speedup.md deleted file mode 100644 index b90d23c0..00000000 --- a/src/doc/reference/glossary/linear_speedup.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Linear speedup -tags: linear speedup ---- -{% defn "Speedup" %} proportional to the {% defn "processor" %} count. -See also {% defn "perfect linear speedup" %}. \ No newline at end of file diff --git a/src/doc/reference/glossary/lock.md b/src/doc/reference/glossary/lock.md deleted file mode 100644 index 512323af..00000000 --- a/src/doc/reference/glossary/lock.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: Lock -tags: lock ---- -A synchronization mechanism for -providing {% defn "atomic" %} operation by limiting -concurrent access to a resource. -Important operations on locks include -acquire (lock) and release (unlock). -Many locks are implemented as a {% defn "mutex" %}, -whereby only one {% defn "strand" %} can hold the -lock at any time. \ No newline at end of file diff --git a/src/doc/reference/glossary/lock_contention.md b/src/doc/reference/glossary/lock_contention.md deleted file mode 100644 index 067119c9..00000000 --- a/src/doc/reference/glossary/lock_contention.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Lock contention -tags: lock contention ---- -The situation wherein multiple {% defn "strand", "strands" %} vie for the same {% defn "lock" %}. \ No newline at end of file diff --git a/src/doc/reference/glossary/multicore.md b/src/doc/reference/glossary/multicore.md deleted file mode 100644 index 6b452825..00000000 --- a/src/doc/reference/glossary/multicore.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Multicore -tags: multicore ---- -A semiconductor chip containing more than one {% defn "processor" %} {% defn "core" %}. diff --git a/src/doc/reference/glossary/multiprocessor.md b/src/doc/reference/glossary/multiprocessor.md deleted file mode 100644 index 30228f03..00000000 --- a/src/doc/reference/glossary/multiprocessor.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Multiprocessor -tags: multiprocessor ---- -A computer containing multiple general-purpose {% defn "processor", "processors" %}. \ No newline at end of file diff --git a/src/doc/reference/glossary/mutex.md b/src/doc/reference/glossary/mutex.md deleted file mode 100644 index 0db35839..00000000 --- a/src/doc/reference/glossary/mutex.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Mutex -tags: mutex ---- -A "mutually exclusive" {% defn "lock" %} that only one -{% defn "strand" %} can acquire at a time, thereby -ensuring that only one strand executes -the {% defn "critical section" %} protected by the -mutex at a time. -For example, Linux* OS supports Pthreads `pthread_mutex_t` objects. \ No newline at end of file diff --git a/src/doc/reference/glossary/nondeterminism.md b/src/doc/reference/glossary/nondeterminism.md deleted file mode 100644 index f514b05d..00000000 --- a/src/doc/reference/glossary/nondeterminism.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Nondeterminism -tags: nondeterminism ---- -The property of a program when it -behaves differently from run to run when -executed on exactly the same inputs. -Nondeterministic programs are usually -hard to debug. \ No newline at end of file diff --git a/src/doc/reference/glossary/nonlocal_variable.md b/src/doc/reference/glossary/nonlocal_variable.md deleted file mode 100644 index bf33ab4d..00000000 --- a/src/doc/reference/glossary/nonlocal_variable.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Nonlocal variable -tags: nonlocal variable ---- -A program variable that is bound outside -of the scope of the function, method, or -class in which it is used. In Cilk -programs, we also use this term to refer -to variables with a scope outside a -`cilk_for` loop. \ No newline at end of file diff --git a/src/doc/reference/glossary/opencilk.md b/src/doc/reference/glossary/opencilk.md deleted file mode 100644 index b1a06f7a..00000000 --- a/src/doc/reference/glossary/opencilk.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: OpenCilk -tags: opencilk ---- -A {% defn "task-parallel" %} programming platform for multicore computers based on {% defn "Cilk" %} technology. \ No newline at end of file diff --git a/src/doc/reference/glossary/parallel_loop.md b/src/doc/reference/glossary/parallel_loop.md deleted file mode 100644 index 1036c26e..00000000 --- a/src/doc/reference/glossary/parallel_loop.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Parallel loop -tags: parallel loop ---- -A `for` loop all of whose iterations can be -run independently in parallel. The -`cilk_for` keyword designates a parallel -loop. \ No newline at end of file diff --git a/src/doc/reference/glossary/parallelism.md b/src/doc/reference/glossary/parallelism.md deleted file mode 100644 index d4fffd42..00000000 --- a/src/doc/reference/glossary/parallelism.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Parallelism -tags: parallelism ---- -The ratio of {% defn "work" %} to {% defn "span" %}, which is the -largest speedup an application could -possibly attain when run on an infinite -number of {% defn "processor", "processors" %}. \ No newline at end of file diff --git a/src/doc/reference/glossary/perfect_linear_speedup.md b/src/doc/reference/glossary/perfect_linear_speedup.md deleted file mode 100644 index 6ef53dff..00000000 --- a/src/doc/reference/glossary/perfect_linear_speedup.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Perfect linear speedup -tags: perfect linear speedup ---- -{% defn "Speedup" %} equal to the {% defn "processor" %} count. -See also {% defn "linear speedup" %}. \ No newline at end of file diff --git a/src/doc/reference/glossary/process.md b/src/doc/reference/glossary/process.md deleted file mode 100644 index 1019352d..00000000 --- a/src/doc/reference/glossary/process.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Process -tags: process ---- -A self-contained {% defn "concurrent agent" %} that by -default executes a serial chain of -{% defn "instruction", "instructions" %}. More than one {% defn "thread" %} may -run within a process, but a process does -not usually share memory with other -processes. Scheduling of processes is -typically managed by the operating system. \ No newline at end of file diff --git a/src/doc/reference/glossary/processor.md b/src/doc/reference/glossary/processor.md deleted file mode 100644 index d6bd868b..00000000 --- a/src/doc/reference/glossary/processor.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: Processor -tags: processor ---- -A processor implements the logic to -execute program {% defn "instruction", "instructions" %} -sequentially; we use the term "{% defn "core" %}" as a -synonym. This document does not use -the term "processor" to refer to multiple -processing units on the same or multiple -chips, although other documents may -use the term that way. \ No newline at end of file diff --git a/src/doc/reference/glossary/race_condition.md b/src/doc/reference/glossary/race_condition.md deleted file mode 100644 index 8d726125..00000000 --- a/src/doc/reference/glossary/race_condition.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Race condition -tags: race condition ---- -A source of {% defn "nondeterminism" %} whereby the -result of a concurrent computation -depends on the timing or relative order of -the execution of instructions in each -individual {% defn "strand" %}. \ No newline at end of file diff --git a/src/doc/reference/glossary/receiver.md b/src/doc/reference/glossary/receiver.md deleted file mode 100644 index 6d226386..00000000 --- a/src/doc/reference/glossary/receiver.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Receiver -tags: receiver ---- -A variable to receive the result of a function call. \ No newline at end of file diff --git a/src/doc/reference/glossary/reducer.md b/src/doc/reference/glossary/reducer.md deleted file mode 100644 index 4d5840ce..00000000 --- a/src/doc/reference/glossary/reducer.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: Reducer -tags: reducer ---- -A {% defn "hyperobject" %} with a defined (usually -associative) `reduce()` binary operator -which the OpenCilk runtime system uses to -combine the each {% defn "view" %} of each separate -{% defn "strand" %}. -A reducer must have two methods: -- A default constructor which initializes the -reducer to its identity value -- A `reduce()` method which merges the -value of right reducer into the left (this) -reducer. \ No newline at end of file diff --git a/src/doc/reference/glossary/response_time.md b/src/doc/reference/glossary/response_time.md deleted file mode 100644 index 0b345009..00000000 --- a/src/doc/reference/glossary/response_time.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Response time -tags: response time ---- -The time it takes to execute a -computation from the time a human user -provides an input to the time the user -gets the result. \ No newline at end of file diff --git a/src/doc/reference/glossary/running_time.md b/src/doc/reference/glossary/running_time.md deleted file mode 100644 index db1b0ba8..00000000 --- a/src/doc/reference/glossary/running_time.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Running time -tags: running time ---- -How long a program takes to execute on a given computer system. -Also called {% defn "execution time" %}. \ No newline at end of file diff --git a/src/doc/reference/glossary/scale_down.md b/src/doc/reference/glossary/scale_down.md deleted file mode 100644 index 25cce075..00000000 --- a/src/doc/reference/glossary/scale_down.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Scale down -tags: scale down ---- -The ability of a parallel application to run efficiently on one -or a small number of {% defn "processor", "processors" %}. \ No newline at end of file diff --git a/src/doc/reference/glossary/scale_up.md b/src/doc/reference/glossary/scale_up.md deleted file mode 100644 index 411417c3..00000000 --- a/src/doc/reference/glossary/scale_up.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Scale up -tags: scale up ---- -The ability of a parallel application to run efficiently -on a large number of {% defn "processors" %}. -See also {% defn "linear speedup" %}. \ No newline at end of file diff --git a/src/doc/reference/glossary/sequential_consistency.md b/src/doc/reference/glossary/sequential_consistency.md deleted file mode 100644 index d7899248..00000000 --- a/src/doc/reference/glossary/sequential_consistency.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Sequential consistency -tags: sequential consistency ---- -The memory model for concurrency -wherein the effect of {% defn "concurrent agents" %} is -as if their operations on {% defn "shared memory" %} -were interleaved in a global order -consistent with the orders in which each -agent executed them. This model was -advanced in 1976 by [Leslie Lamport](https://research.microsoft.com/en-us/um/people/lamport/). \ No newline at end of file diff --git a/src/doc/reference/glossary/serial_execution.md b/src/doc/reference/glossary/serial_execution.md deleted file mode 100644 index 5ea931a3..00000000 --- a/src/doc/reference/glossary/serial_execution.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Serial execution -tags: serial execution ---- -Execution of the {% defn "serial projection" %} of a Cilk program. \ No newline at end of file diff --git a/src/doc/reference/glossary/serial_projection.md b/src/doc/reference/glossary/serial_projection.md deleted file mode 100644 index aea60582..00000000 --- a/src/doc/reference/glossary/serial_projection.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: Serial projection -tags: serial projection ---- -The C or C++ program that results from -stubbing out the keywords of a Cilk -program, where `cilk_spawn`, `cilk_scope`, and -`cilk_sync` are elided and `cilk_for` is -replaced with an ordinary `for`. The -serial projection can be used for debugging -and, in the case of a converted C/C++ -program, will behave exactly as the -original C/C++ program. The terms "*serialization*" and "*serial elision*" are used in some of the literature. -Also, see "{% defn "serial semantics" %}". \ No newline at end of file diff --git a/src/doc/reference/glossary/serial_semantics.md b/src/doc/reference/glossary/serial_semantics.md deleted file mode 100644 index bd842fd7..00000000 --- a/src/doc/reference/glossary/serial_semantics.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Serial semantics -tags: serial semantics ---- -The behavior of a Cilk program when executed as the -{% defn "serial projection" %} of the program. -See the following article: -Four Reasons Why Parallel Programs Should Have Serial Semantics. \ No newline at end of file diff --git a/src/doc/reference/glossary/serialization.md b/src/doc/reference/glossary/serialization.md deleted file mode 100644 index 11a070d1..00000000 --- a/src/doc/reference/glossary/serialization.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Serialization -tags: serial projection ---- -See {% defn "serial projection" %}. \ No newline at end of file diff --git a/src/doc/reference/glossary/shared_memory.md b/src/doc/reference/glossary/shared_memory.md deleted file mode 100644 index c1b6be19..00000000 --- a/src/doc/reference/glossary/shared_memory.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Shared memory -tags: shared memory ---- -Computer storage that is shared among -several processors. A shared-memory -{% defn "multiprocessor" %} is a computer in which -each {% defn "processor" %} can directly address any -memory location. Contrast with -{% defn "distributed memory" %}. \ No newline at end of file diff --git a/src/doc/reference/glossary/span.md b/src/doc/reference/glossary/span.md deleted file mode 100644 index 6383dfca..00000000 --- a/src/doc/reference/glossary/span.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Span -tags: span ---- -The theoretically fastest execution time -for a parallel program when run on an -infinite number of {% defn "processor", "processors" %}, -discounting overheads for -communication and scheduling. Often -denoted by $T_{\infty}$ in the literature, and -sometimes called *critical-path length*. \ No newline at end of file diff --git a/src/doc/reference/glossary/spawn.md b/src/doc/reference/glossary/spawn.md deleted file mode 100644 index bda60de5..00000000 --- a/src/doc/reference/glossary/spawn.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Spawn -tags: spawn ---- -To call a function without waiting for it to -return, as in a normal call. The caller can -continue to execute in parallel with the -called function. See also {% defn "cilk_spawn" %}. \ No newline at end of file diff --git a/src/doc/reference/glossary/speedup.md b/src/doc/reference/glossary/speedup.md deleted file mode 100644 index 4a0d05d4..00000000 --- a/src/doc/reference/glossary/speedup.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Speedup -tags: speedup ---- -How many times faster a program is -when run in parallel than when run on -one {% defn "processor" %}. Speedup can be -computed by dividing the running time $T_P$ -of the program on $P$ processors by its -running time $T_1$ on one processor. \ No newline at end of file diff --git a/src/doc/reference/glossary/strand.md b/src/doc/reference/glossary/strand.md deleted file mode 100644 index 23a89361..00000000 --- a/src/doc/reference/glossary/strand.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Strand -tags: strand ---- -A serial chain of executed {% defn "instruction", "instructions" %} without any parallel -control (such as a {% defn "spawn" %}, {% defn "sync" %}, return -from a spawn, etc.) \ No newline at end of file diff --git a/src/doc/reference/glossary/sync.md b/src/doc/reference/glossary/sync.md deleted file mode 100644 index 3dd62b7a..00000000 --- a/src/doc/reference/glossary/sync.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Sync -tags: sync ---- -To wait for a set of {% defn "spawn", "spawned" %} functions to -return before proceeding. The current -function is dependent upon the spawned -functions and cannot proceed in parallel -with them. See also {% defn "cilk_sync" %}. \ No newline at end of file diff --git a/src/doc/reference/glossary/task-parallel.md b/src/doc/reference/glossary/task-parallel.md deleted file mode 100644 index 7427d15a..00000000 --- a/src/doc/reference/glossary/task-parallel.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Task-parallel -tags: [task-parallel] ---- - -*Task-parallel platforms* provide a layer of software on top of {% defn "thread", "threads" %} to coordinate, schedule, and manage the {% defn "processor", "processors" %} of a {% defn "multicore" %}. Some task-parallel platforms are built as runtime libraries, but others provide full-fledged parallel languages with compiler and runtime support. - -*Task-parallel programming* allows parallelism to be specified in a "processor-oblivious" fashion, where the programmer identifies what computational tasks may run in parallel but does not indicate which thread or processor performs the task. Thus, the programmer is freed from worrying about communication protocols, load balancing, and other vagaries of thread programming. The task-parallel platform contains a scheduler, which automatically load-balances the tasks across the processors, thereby greatly simplifying the programmer’s chore. Task-parallel algorithms provide a natural extension to ordinary serial algorithms, allowing performance to be reasoned about mathematically using "work/span analysis." \ No newline at end of file diff --git a/src/doc/reference/glossary/thread.md b/src/doc/reference/glossary/thread.md deleted file mode 100644 index 717fde3e..00000000 --- a/src/doc/reference/glossary/thread.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Thread -tags: thread ---- -A thread executes a serial {% defn "instruction" %} chain. -Scheduling of threads is typically managed by the operating -system. \ No newline at end of file diff --git a/src/doc/reference/glossary/throughput.md b/src/doc/reference/glossary/throughput.md deleted file mode 100644 index c13888ce..00000000 --- a/src/doc/reference/glossary/throughput.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Throughput -tags: throughput ---- -A number of operations performed per unit time. \ No newline at end of file diff --git a/src/doc/reference/glossary/view.md b/src/doc/reference/glossary/view.md deleted file mode 100644 index 7ffd53dc..00000000 --- a/src/doc/reference/glossary/view.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: View -tags: view ---- -The state of a {% defn "hyperobject" %} as seen by a given {% defn "strand" %}. \ No newline at end of file diff --git a/src/doc/reference/glossary/work.md b/src/doc/reference/glossary/work.md deleted file mode 100644 index 86a989e9..00000000 --- a/src/doc/reference/glossary/work.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Work -tags: work ---- -The running time of a program when run on one {% defn "processor" %}, -sometimes denoted by $T_1$. \ No newline at end of file diff --git a/src/doc/reference/glossary/work_stealing.md b/src/doc/reference/glossary/work_stealing.md deleted file mode 100644 index 67a2113d..00000000 --- a/src/doc/reference/glossary/work_stealing.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: Work stealing -tags: work stealing ---- -A scheduling strategy where {% defn "processor", "processors" %} -post parallel work locally and, when a -processor runs out of local work, it steals -work from another processor. Work-stealing schedulers are notable for their efficiency, because they incur no -communication or synchronization -overhead when there is ample -{% defn "parallelism" %}. The OpenCilk runtime system -employs a work-stealing scheduler. \ No newline at end of file diff --git a/src/doc/reference/glossary/worker.md b/src/doc/reference/glossary/worker.md deleted file mode 100644 index 623bdfd2..00000000 --- a/src/doc/reference/glossary/worker.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Worker -tags: worker ---- -A {% defn "thread" %} that, together with other workers, -implements the OpenCilk runtime system's {% defn "work stealing" %} scheduler. \ No newline at end of file diff --git a/src/doc/reference/reducers.md b/src/doc/reference/reducers.md deleted file mode 100644 index 42271afc..00000000 --- a/src/doc/reference/reducers.md +++ /dev/null @@ -1,260 +0,0 @@ ---- -title: Reducers -author: John F. Carr ---- - -# Reducers - -_Reducers_ are a new data type to help programmers avoid _{% defn -"data race", "data races" %}_. Data races happen when one thread -modifies an object while a second thread is using it. According to -the C and C++ language standards a race is undefined behavior. A -program can give incorrect results, crash, or worse. A counter may -not increment reliably or a linked list may become corrupt. - -A reducer is a special case of a more general type known as a -_hyperobject_. Different types of hyperobjects are used depending on -the desired semantics. - -Reducers are used when the final value in a variable is built up from -a series of independent modifications, such as adding a number to an -accumulator or appending an item to a list. As long as the operation -is _associative_ (`A ⊕ (B ⊕ C) = (A ⊕ B) ⊕ C`) the final result will -be correct. - -Formally, a reducer is a mathematical object called a _{% defn -"monoid" %}_, meaning it has the following components: -* a type (e.g `double`), -* an _identity_ value (`0.0`), and -* an associative binary operation (`+`). - -The operation does not need to be commutative. A reducer can hold a -list with the binary operation being concatenation. Associativity is -essential. - -## Reducers and views - -OpenCilk ensures that every reference to a reducer uses a private -copy, called a _view_. The address of the current view can change at -any spawn or sync, including the implicit spawns and syncs associated -with `cilk_for` and `cilk_scope`. The address operator `&` returns -the address of the current view, so the address of a reducer can -change when the address of a normal variable would be constant over -its lifetime. Be careful about saving the address of a reducer. The -race detector (Cilk sanitizer) can be used to check for improper -retention of a pointer to a view. - -Views are created and merged using programmer-provided callback -functions commonly named `identity` and `reduce`. The identity -callback takes a pointer to the value to be initialized (cast to -`void` `*`). The reduce callback takes two pointer arguments -pointing to the two values to be combined. The value pointed to by -the second argument should be merged into the value pointed to by the -first argument, and storage held by the second argument should be -freed. Even if the operation is commutative, the result should be -stored in the first argument. - -There is a total order on views, the order in which they would have -been created in a {% defn "serial projection", "serial" %} program. -The older of any pair of views is conventionally called the _left_ -view and the younger of the pair is called the _right_ view. The left -view is the first argument to the reduce callback. The variable -declared by the programmer is the _leftmost_ view. The programmer -needs to initialize or construct the variable just like any other. -See `` for an example where the leftmost view -does not get the identity value. - -## Declaring a reducer - -A reducer is declared with the `cilk_reducer` keyword, with the -identity and reduce functions as arguments. - -For example, to declare a reducer holding sums of `double`s -one can write - -```c -void zero_double(void *view) { *(double *)view = 0.0; } -void add_double(void *left, void *right) - { *(double *)left += *(double *)right; } -double cilk_reducer(zero_double, add_double) sum; -``` - -When necessary the runtime calls the identity callback (constructor) -to create a new view. All views created by the runtime will -eventually be combined with an older view using the reduction -operation. Any information that needs to be saved should be merged -into the left view. This may be as simple as adding two numbers. -Arbitrarily complicated data manipulation is possible. (When the -right view is discarded without saving its contents the hyperobject is -called a _holder_. Holders act as a form of thread-local storage that -does not remain valid across a spawn or sync.) - -The memory occupied by the view itself is allocated by and owned by -the runtime. In C++ `operator new` is not called. If the type has a -C++ constructor, use placement `new` in the identity function. If it -has a destructor, call the destructor explicitly instead of using -`delete`: - -```cpp -void identity(void *view) -{ - new (view) Type(); -} -void reduce(void *left, void *right) -{ - // Here data moves from the right view to the left view. - static_cast(left)->reduce(static_cast(right)); - static_cast(right)->~Type(); - // The right view will be freed on return from this function. -} -Type cilk_reducer(identity, reduce) var; // var is a reducer -``` - -If the data type requires a custom allocator a level of indirection -can be added by using a pointer type: - -```cpp -void identity(void *view) -{ - // Type::operator new will be used, if defined. - *static_cast(view) = new Type(); -} -void reduce(void *left, void *right) -{ - (*static_cast(left))->reduce(*static_cast(right)); - delete *static_cast(right); -} -Type *cilk_reducer(identity, reduce) var; -``` - -Formally, the `cilk_reducer` keyword is part of the type of the -variable rather than an attribute of the variable itself. It binds -much like `*`. In particular, - -```c -Type cilk_reducer(identity, reduce) a, b; -``` - -declares a reducer and a non-reducer variable, like - -```c -Type *a, b; -``` - -declares a pointer and a non-pointer. A `typedef` can be used -for more pleasing declarations: - -```c -typedef Type cilk_reducer(identity, reduce) TypeReducer; -TypeReducer a, b; -``` - -Modifications to a reducer should be consistent with the binary -operator. For example, if the reduction adds two views then all -modifications of the reducer should use `+=`. At least, the total of -all modifications between a `cilk_spawn` and the next `cilk_sync` -should be equivalent to `+=` (or whatever the `reduce` function does). -This is because the value of a reducer is unpredictable in parallel -code. It may become the identity at any `cilk_spawn` or change -abruptly at any `cilk_sync`. The runtime ensures that the sum (for -example) is always correct at the end, but not in the middle. - -Declaring a variable to be a reducer does not change its size. In the -current implementation all views allocated by the runtime are aligned -to the size of a cache line (64 bytes on supported platforms). This -alignment avoids {% defn "false sharing" %} on reducer accesses. If -greater alignment is required a level of indirection must be added. - -Because reducers are types, pointers to reducers are possible. Use -`__builtin_addressof` to get a pointer to a reducer treated as a -reducer instead of a view. This pointer can be passed to -reducer-aware code. - -```c -extern long f(int index); -// The argument is a pointer to a reducer. -void compute_sum(long cilk_reducer(zero, add) *sum) -{ - cilk_for (int i = 0; i < 10000000; ++i) - *sum += f(i); // dereferenced pointer converts to current view -} -long provide_reducer() -{ - long cilk_reducer(zero, add) sum = 0L; // must be initialized - compute_sum(__builtin_address(sum)); - return sum; -} -``` - -## Limitations - -In OpenCilk 2.0 a reducer must be a variable. Reducers may not be -dynamically allocated and may not be members of structures or arrays. -This limitation is planned to be removed in a future version of OpenCilk. - -Reducers may not contain reducers. - -Callback functions should not spawn. - -Callback functions should be passed by name to `cilk_reduce`. Two -reducers have the same type if they have the same data type and -equivalent callback functions. If the callback functions are -expressions other than the names of functions the compiler does not -know whether they are equivalent and may give spurious errors about -type incompatibility. Proving expression equivalence is an unsolvable -problem in the general case. - -In C++, reducers are not implicitly converted to views when binding -references. This limitation is planned to be removed in a future -version of OpenCilk. As a workaround, take the address of the -reducer, yielding a pointer to the current view, and dereference the -pointer. - -```cpp -extern void f(int &, int _Hyperobject &); -void g(int _Hyperobject *p) -{ - f(*&*p, *p); // ideally you could write f(*p, *p); -} -``` - -## Porting from Cilk Plus - -The macros used by Intel Cilk Plus are no longer required. -The example from former `` - -```c -CILK_C_DECLARE_REDUCER(int) my_add_int_reducer = - CILK_C_INIT_REDUCER(int, - add_int_reduce, - add_int_identity, - 0, - 0); -``` - -becomes - -```c -int cilk_reducer(add_int_identity, add_int_reduce) my_add_int_reducer; -``` - -Where Cilk Plus allowed up to five callback functions, OpenCilk has -only two and they have different signatures. - -* The identity and reduce functions lose their first argument, -which was a pointer to the hyperobject itself. - -* The destructor is no longer a separate function. The right operand -to reduce is always destroyed immediately after reduction and no -functionality is added by having a separate destructor. Cilk Plus -reduce functions may need to have a destructor call added to work as -OpenCilk reduce functions. - -* Custom memory allocation functions are not supported by OpenCilk. -Memory for the view is provided by the runtime. Reducers may allocate -their own additional storage. - -As noted above, heap-allocated reducers are not supported in -OpenCilk 2.0. - - diff --git a/src/doc/reference/reducers.md~ b/src/doc/reference/reducers.md~ deleted file mode 100644 index 6c8de1d6..00000000 --- a/src/doc/reference/reducers.md~ +++ /dev/null @@ -1,257 +0,0 @@ ---- -title: Reducers -author: John F. Carr ---- - -# Reducers - -_Reducers_ are a new data type to help programmers avoid _{% defn -"data race", "data races" %}_. Data races happen when one thread -modifies an object while a second thread is using it. According to -the C and C++ language standards a race is undefined behavior. A -program can give incorrect results, crash, or worse. A counter may -not increment reliably or a linked list may become corrupt. - -A reducer is a special case of a more general type known as a -_hyperobject_. Different types of hyperobjects are used depending on -the desired semantics. - -Reducers are used when the final value in a variable is built up from -a series of independent modifications. The modifications should all -be of the same kind, such as by adding a number to an accumulator or -appending an item to a list. As long as the operation is -_associative_ (`A ⊕ (B ⊕ C) = (A ⊕ B) ⊕ C`) the final result will be -correct. - -Formally, a reducer is a mathematical object called a _{% defn -"monoid" %}_. A reducer has a type (e.g., `double`), an _identity_ -value (`0.0`), and an associative binary operation (`+`). The -operation does not need to be commutative. A reducer can hold a list -with the binary operation being concatenation. - -## Reducers and views - -OpenCilk ensures that every reference to a reducer uses a private -copy, called a _view_. The address of the current view can change at -any spawn or sync, including the implicit spawns and syncs associated -with `cilk_for` and `cilk_scope`. The address operator `&` returns -the address of the current view, so the address of a reducer can -change when the address of a normal variable would be constant over -its lifetime. Be careful about saving the address of a reducer. The -race detector (Cilk sanitizer) can be used to check for improper -retention of a pointer to a view. - -Views are created and merged using programmer-provided callback -functions commonly named `identity` and `reduce`. The identity -callback takes a pointer to the value to be initialized (cast to -`void` `*`). The reduce callback takes two pointer arguments -pointing to the two values to be combined. The value pointed to by -the second argument should be merged into the value pointed to by the -first argument, and storage held by the second argument should be -freed. Even if the operation is commutative, the result should be -stored in the first argument. - -There is a total order on views, the order in which they would have -been created in a {% defn "serial projection", "serial" %} program. -The older of any pair of views is conventionally called the _left_ -view and the younger of the pair is called the _right_ view. The left -view is the first argument to the reduce callback. The variable -declared by the programmer is the _leftmost_ view. The programmer -needs to initialize or construct the variable just like any other. -See `` for an example where the leftmost view -does not get the identity value. - -## Declaring a reducer - -A reducer is declared with the `cilk_reducer` keyword, with the -identity and reduce functions as arguments. - -For example, to declare a reducer holding sums of `double`s -one can write - -```c - void zero_double(void *view) { *(double *)view = 0.0; } - void add_double(void *left, void *right) - { *(double *)left += *(double *)right; } - double cilk_reducer(zero_double, add_double) sum; -``` - -When necessary the runtime calls the identity callback (constructor) -to create a new view. All views created by the runtime will -eventually be combined with an older view using the reduction -operation. Any information that needs to be saved should be merged -into the left view. This may be as simple as adding two numbers. -Arbitrarily complicated data manipulation is possible. (When the -right view is discarded without saving its contents the hyperobject is -called a _holder_. Holders act as a form of thread-local storage that -does not remain valid across a spawn or sync.) - -The memory occupied by the view itself is allocated by and owned by -the runtime. In C++ `operator new` is not called. If the type has a -C++ constructor, use placement `new` in the identity function. If it -has a destructor, call the destructor explicitly instead of using -`delete`: - -```cpp - void identity(void *view) - { - new (view) Type(); - } - void reduce(void *left, void *right) - { - // Here data moves from the right view to the left view. - static_cast(left)->reduce(static_cast(right)); - static_cast(right)->~Type(); - // The right view will be freed on return from this function. - } - Type cilk_reducer(identity, reduce) var; // var is a reducer -``` - -If the data type requires a custom allocator a level of indirection -can be added by using a pointer type: - -```cpp - void identity(void *view) - { - // Type::operator new will be used, if defined. - *static_cast(view) = new Type(); - } - void reduce(void *left, void *right) - { - (*static_cast(left))->reduce(*static_cast(right)); - delete *static_cast(right); - } - Type *cilk_reducer(identity, reduce) var; -``` - -Formally, the `cilk_reducer` keyword is part of the type of the -variable rather than an attribute of the variable itself. It binds -much like `*`. In particular, - -```c - Type cilk_reducer a, b; -``` - -declares a reducer and a non-reducer variable, like - -```c - Type *a, b; -``` - -declares a pointer and a non-pointer. A `typedef` can be used -for more pleasing declarations: - -```c - typedef Type cilk_reducer TypeReducer; - TypeReducer a, b; -``` - -Modifications to a reducer should be consistent with the binary -operator. For example, if the reduction adds two views then all -modifications of the reducer should use `+=`. At least, the total of -all modifications between a `cilk_spawn` and the next `cilk_sync` -should be equivalent to `+=` (or whatever the `reduce` function does). -This is because the value of a reducer is unpredictable in parallel -code. It may become the identity at any `cilk_spawn` or change -abruptly at any `cilk_sync`. The runtime ensures that the sum (for -example) is always correct at the end, but not in the middle. - -Declaring a variable to be a reducer does not change its size. In the -current implementation all views allocated by the runtime are aligned -to the size of a cache line (64 bytes on supported platforms). This -alignment avoids {% defn "false sharing" %} on reducer accesses. If -greater alignment is required a level of indirection must be added. - -Because reducers are types, pointers to reducers are possible. Use -`__builtin_addressof` to get a pointer to a reducer treated as a -reducer instead of a view. This pointer can be passed to -reducer-aware code. - -```c - extern long f(int index); - // The argument is a pointer to a reducer. - void compute_sum(long cilk_reducer(zero, add) *reducer) - { - cilk_for (int i = 0; i < 10000000; ++i) - *sum += f(i); // dereferenced pointer converts to current view - } - long provide_reducer() - { - long cilk_reducer(zero, add) sum = 0L; // must be initialized - compute_sum(__builtin_address(sum)); - return sum; - } -``` - -## Limitations - -In OpenCilk 2.0 a reducer must be a variable. Reducers may not be -dynamically allocated and may not be members of structures or arrays. -This limitation is planned to be removed in a future version of OpenCilk. - -Reducers may not contain reducers. - -Callback functions should not spawn. - -Callback functions should be passed by name to `cilk_reduce`. Two -reducers have the same type if they have the same data type and -equivalent callback functions. If the callback functions are -expressions other than the names of functions the compiler does not -know whether they are equivalent and may give spurious errors about -type incompatibility. Proving expression equivalence is an unsolvable -problem in the general case. - -In C++, reducers are not implicitly converted to views when binding -references. This limitation is planned to be removed in a future -version of OpenCilk. As a workaround, take the address of the -reducer, yielding a pointer to the current view, and dereference the -pointer. - -```cpp -extern void f(int &, int _Hyperobject &); -void g(int _Hyperobject *p) -{ - f(*&*p, *p); // ideally you could write f(*p, *p); -} -``` - -## Porting from Cilk Plus - -The macros used by Intel Cilk Plus are no longer required. -The example from former `` - -```c - CILK_C_DECLARE_REDUCER(int) my_add_int_reducer = - CILK_C_INIT_REDUCER(int, - add_int_reduce, - add_int_identity, - 0, - 0); -``` - -becomes - -```c - int cilk_reducer(add_int_identity, add_int_reduce) my_add_int_reducer; -``` - -Where Cilk Plus allowed up to five callback functions, OpenCilk has -only two and they have different signatures. - -* The identity and reduce functions lose their first argument, -which was a pointer to the hyperobject itself. - -* The destructor is no longer a separate function. The right operand -to reduce is always destroyed immediately after reduction and no -functionality is added by having a separate destructor. Cilk Plus -reduce functions may need to have a destructor call added to work as -OpenCilk reduce functions. - -* Custom memory allocation functions are not supported by OpenCilk. -Memory for the view is provided by the runtime. Reducers may allocate -their own additional storage. - -As noted above, heap-allocated reducers are not supported in -OpenCilk 2.0. - - diff --git a/src/doc/reference/reference.json b/src/doc/reference/reference.json deleted file mode 100644 index baa87fba..00000000 --- a/src/doc/reference/reference.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "layout": "layouts/page.njk", - "stylesheet": "users-guide.css", - "background": "bg-white", - "permalink": "/doc/reference/{{ page.fileSlug | slugify }}/", - "eleventyNavigation": { - "parent": "Reference" - }, - "tags": [ - "reference" - ] -} \ No newline at end of file diff --git a/src/doc/tutorials.md b/src/doc/tutorials.md deleted file mode 100644 index 991b7867..00000000 --- a/src/doc/tutorials.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: Tutorials -eleventyNavigation: - key: Tutorials - parent: Documentation - order: 2 - url: /doc/ -# permalink: /doc/tutorials/ ---- - -Dummy page that exists to provide "Tutorials" nav bread crumb, -which when clicked goes to Documentation landing page \ No newline at end of file diff --git a/src/doc/tutorials/introduction-to-cilk-programming.md b/src/doc/tutorials/introduction-to-cilk-programming.md deleted file mode 100644 index 8989e3cc..00000000 --- a/src/doc/tutorials/introduction-to-cilk-programming.md +++ /dev/null @@ -1,226 +0,0 @@ ---- -layout: layouts/page.njk -title: |- - Introduction to Cilk programming 1: parallel tasks -tagline: With a few Cilk keywords, OpenCilk extends C/C++ to support fork-join - parallel programming, a simple and efficient model for writing fast code for - multicore computers. -author: Bruce Hoppe -date: 2022-07-15T18:13:01.322Z -image: /img/fib-code-multicore.png -tags: - - task-parallelism - - spawn -attribution: true -eleventyNavigation: - order: -3 ---- - -## Task-parallel programming - -{% defn "parallel algorithms", "Parallel programming" %} involves writing -instructions that can be executed on different processors simultaneously. -Compared to serial programs, whose instructions (logically) execute -one-at-a-time on a single processor, parallel programs can utilize multiple -processing units to reduce the runtime of a computation. Historically, -parallel programming has been considered substantially more difficult and -error-prone than serial programming. {% defn "OpenCilk" %} aims to bridge this -gap. OpenCilk supports the {% defn "Cilk" %} language extensions to C and C++, -which make it easy to write parallel programs that are both correct and fast. - -OpenCilk is a {% defn "task-parallel-platforms-programming-and-algorithms", -"task-parallel platform" %} that provides language abstractions for {% defn -"shared-memory" %} parallel computations on {% defn "multicores", "multicore" -%} systems. As a Cilk programmer, you are only responsible for expressing the -{% defn "logical parallelism" %} in your application, that is, which tasks -*may* run in parallel. (With Cilk, there are no tasks which *must* run in -parallel.) The OpenCilk compiler produces optimized parallel code, and the -OpenCilk runtime system schedules and load-balances your computation onto the -available processors in a way that is provably close to optimal. - -{% img "/img/fib-code-multicore-wide.png", "1200px" %} - -When using the OpenCilk platform, you write code in the Cilk language, which -extends C and C++ with a just few keywords to support task-parallel -programming. Specifically, Cilk supports {% defn "fork-join parallelism" %}, a -simple and effective form of task parallelism. Cilk provides linguistic -mechanisms for {% defn "spawning" %} and {% defn "parallel loops" %}. - -In this tutorial, we'll introduce spawning parallel tasks. Upcoming tutorials -will also cover the following: - -- How to use parallel loops. -- How to ensure your program is free of {% defn "determinacy-race", "race bugs" - %} using the {% defn "Cilksan" %} tool. -- How to determine the {% defn "scalability" %} of your program on multiple - processors using the {% defn "Cilkscale" %} tool. -- How OpenCilk runs your program to achieve good performance. - -## Adding parallelism with `cilk_scope` and `cilk_spawn` - -You may think of a task or computation as a piece of code which contains serial -and parallel regions. A serial region contains no parallelism and its tasks -are executed in sequence, as usual. A parallel region has two distinguishing -characteristics: - -1. Within the parallel region, functions may be {% defn "spawning", "spawned" - %}, i.e., they may be run in parallel with the caller. -2. At the end of the parallel region, all functions that were spawned within it - are {% defn "syncing", "synced" %}, i.e., they have finished executing. - -Functions within either a serial or parallel region may themselves contain -serial and parallel regions, allowing for {% defn "nested parallelism" %}. - -You can add parallelism to your program with just two keywords: - -- To indicate that a function may be spawned, put the `cilk_spawn` keyword - before the function call. The `cilk_spawn` keyword tells the OpenCilk - runtime system that the function may (but is not required to) run in parallel - with the caller. -- To delineate a parallel region, use the `cilk_scope` keyword before a [*block - scope*](https://en.cppreference.com/w/c/language/scope). The OpenCilk - runtime system will ensure that execution will continue past the `cilk_scope` - only after all functions that were spawned within it have returned, waiting - if necessary. - -For example, consider the C code below, which shows a parallel implementation -for recursive computation of Fibonacci numbers. The `cilk_scope` creates a -parallel region spanning lines 6–7. In line 6 the `cilk_spawn` keyword -indicates that `p_fib(n-1)` may be executed at the same time as the rest of the -parallel region (that is, the call to `p_fib(n-2)` in line 7). The end of the -`cilk_scope` in line 8 guarantees that the spawned function has finished before -the return statement in line 9 is executed. - -```cilkc# -int p_fib(int n) { - if (n < 2) - return n; // base case - int x, y; - cilk_scope { // begin lexical scope of parallel region - x = cilk_spawn p_fib(n-1); // don't wait for function to return - y = p_fib(n-2); // may run in parallel with spawned function - } // wait for spawned function if needed - return x + y; -} -``` - -A spawned function is called a {% defn "child" %} of the function that spawned -it. Conversely, the function that executes the `cilk_spawn` statement is known -as the {% defn "parent" %} of the spawned function. The code in the parent -function that follows a spawn statement in a parallel region is called the -parent {% defn "continuation" %} of the spawn. - -Input arguments to a spawned function are passed as they normally would in -serial code and are evaluated _before_ the function is spawned. That is, the -parent continuation may not start executing until the spawned child arguments -have been evaluated. - -{% alert %} - -Any expression that is or can be converted to a function can be -spawned. For instance, you can spawn a computation using a function pointer or -member function pointer, as in: - -```cilkc -var = cilk_spawn (object.*pointer)(arg1, arg2); -``` - -{% endalert %} - -## Common pitfalls and how to avoid them - -If you spawn a function that returns a value, make sure the spawned function -has finished executing before using its returned value. The same is true for -any state that may change as a side-effect of a spawned function. - -{% alert "error", "Incorrect:" %} - -```cilkc -cilk_scope { - x = cilk_spawn p_fib(n-1); - y = p_fib(n-2); - return x + y; // value of x is indeterminate -} -``` - -{% endalert %} - -{% alert "tip", "Correct:" %} - -```cilkc -cilk_scope { - x = cilk_spawn p_fib(n-1); - y = p_fib(n-2); -} -return x + y; // value of x is p_fib(n-1) -``` - -{% endalert %} - -On a related note, if you spawn a function that returns a value, be sure to -declare the variable which will receive the returned value before the -`cilk_scope` block that uses it. Otherwise, that variable won't be defined -outside the `cilk_scope` block (which is where its value is assigned). - -{% alert "error", "Incorrect:" %} - -```cilkc -cilk_scope { - int x = cilk_spawn p_fib(n-1); - int y = p_fib(n-2); -} -return x + y; // x and y are not defined -``` - -This pitfall may seem benign as it would typically lead to a compilation error, -but note that it may introduce a subtle logical bug if the `cilk_scope` is -nested within another scope that also uses `x` and `y` identifiers. - -{% endalert %} - -{% alert "tip", "Correct:" %} - -```cilkc -int x, y; -cilk_scope { - x = cilk_spawn p_fib(n-1); - y = p_fib(n-2); -} -return x + y; // x and y are defined -``` - -{% endalert %} - -Be careful to ensure that pass-by-reference and pass-by-address arguments to a -spawned function do not expire within the function's `cilk_scope` block, or -else the function may outlive the arguments and attempt to use them after they -have been destroyed. (Note that this is an example of a {% defn "data race" %} -which would be caught by Cilksan.) - -## Serializing your parallel program - -If you remove the `cilk_spawn` and `cilk_scope` keywords from a correct Cilk -program, the result is a valid and correct serial program. For example, if you -do this with the `p_fib()` function code above, you end up with the following -function, which we call `fib()`: - -```cilkc# -int fib(int n) { - if (n < 2) - return n; - int x, y; - { - x = fib(n-1); - y = fib(n-2); - } - return x + y; -} -``` - -Function `fib()` is the {% defn "serial projection" %} of `p_fib()`, which -means it computes exactly the same result but without running any tasks -simultaneously. So why bother with parallelism? Because of the difference in -*how* `fib()` and `p_fib()` compute their (identical) results. For many -computations, allowing tasks to run in parallel significantly reduces the -runtime. We will see this in an upcoming tutorial, where we will analyze the -performance of `p_fib()` compared to `fib()`. diff --git a/src/doc/tutorials/keywords.md b/src/doc/tutorials/keywords.md deleted file mode 100644 index b861020a..00000000 --- a/src/doc/tutorials/keywords.md +++ /dev/null @@ -1,112 +0,0 @@ ---- -permalink: false -eleventyExcludeFromCollections: true ---- - -title: OpenCilk keywords -eleventyNavigation: - order: -2 - -The Cilk programming language provides a simple extension to the C and -C++ languages that allow programmers to expose logically parallel -tasks. Cilk extends C and C++ with three keywords: `cilk_spawn`, -`cilk_sync`, and `cilk_for`. This page describes the Cilk language -extension. - -## Spawn and sync - -Let us first examine the task-parallel keywords `cilk_spawn` and -`cilk_sync`. Consider the following example code for a `fib` routine, -which uses these keywords to parallelize the computation of the -$n$th Fibonacci number. - -```c -int64_t fib(int64_t n) { - if (n < 2) - return n; - int64_t x, y; - x = cilk_spawn fib(n - 1); - y = fib(n - 2); - cilk_sync; - return x + y; -} -``` - -### "Note to the algorithms police" -The example `fib` routine is a terribly inefficient code for -computing Fibonacci numbers. This `fib` routine computes the $n$th -Fibonacci number using $\Theta(\phi^n)$ work, where $\phi$ denotes -the golden ratio, while in fact this number can be computed using -$\Theta(\lg n)$ work. We use this example `fib` code simply for -didactic purposes. - - -In the simplest usage of `cilk_spawn`, parallel work is created when -`cilk_spawn` precedes the invocation of a function, thereby causing -the function to be ***spawned***. The semantics of spawning differ from -a C/C++ function or method call only in that the parent -***continuation*** -- the code immediately following the spawn -- is -allowed to execute in parallel with the child, instead of waiting for -the child to complete as is done in C/C++. In the example `fib` -function, the `cilk_spawn` spawns the recursive invocation of -`fib(n-1)`, allowing it to execute in parallel with its continuation, -which calls `fib(n-2)`. - -A function cannot safely use the values returned by its spawned -children until it executes a `cilk_sync` statement, which suspends the -function until all of its spawned children return. The `cilk_sync` is -a local "barrier," not a global one as, for example, is used in -message-passing programming. In `fib`, the `cilk_sync` prevents the -execution of `fib` from continuing past the `cilk_sync` until the -spawned invocation of `fib(n-1)` has returned. - -Together, a programmer can use the `cilk_spawn` and `cilk_sync` -keywords to expose logical fork-join parallelism within a program. -The `cilk_spawn` keyword creates a parallel ***task***, which is not -*required* to execute in parallel, but simply *allowed* to do so. The -`fib` example also demonstrates that the `cilk_spawn` and `cilk_sync` -keywords are ***composable***: a spawned subcomputation can itself -spawn and sync child subcomputations. The scheduler in the runtime -system takes the responsibility of scheduling parallel tasks on -individual processor cores of a multicore computer and synchronizing -their returns. - -## Parallel loops - -A `for` loop can be parallelized by replacing the `for` with the -`cilk_for` keyword, as demonstrated by the following code to compute -$y = ax + y$ from two given vectors $x$ and -$y$ and a given scalar value $a$: - -```c -void daxpy(int64_t n, double a, double *x, double *y) { - cilk_for (int64_t i = 0; i < n; ++i) { - y[i] = a * x[i] + y[i]; - } -} -``` - -The `cilk_for` parallel-loop construct indicates that all iterations -of the loop are allowed to execute in parallel. At runtime, these -iterations can execute in any order, at the discretion of the runtime -scheduler. - -The `cilk_for` construct is composable, allowing for simple -parallelization of nested loops. The `mm` routine in the following -code example demonstrates how nested `cilk_for` loops can be used to -parallelize a simple code to compute the matrix product -$C = A\cdot B$ where $A$, $B$, and -$C$ are $n\times n$ matrices in row-major order: - -```c -void mm(const double *restrict A, const double *restrict B, - double *restrict C, int64_t n) { - cilk_for (int64_t i = 0; i < n; ++i) { - cilk_for (int64_t j = 0; j < n; ++j) { - for (int64_t k = 0; k < n; ++k) { - C[i*n + j] += A[i*n + k] * B[k*n + j]; - } - } - } -} -``` diff --git a/src/doc/tutorials/opencilk-concepts.md b/src/doc/tutorials/opencilk-concepts.md deleted file mode 100644 index c17eb6d5..00000000 --- a/src/doc/tutorials/opencilk-concepts.md +++ /dev/null @@ -1,106 +0,0 @@ ---- -title: OpenCilk concepts -eleventyNavigation: - order: -1 -tags: [strands, knots, work, span, parallelism] ---- - -OpenCilk programming is a bit of a departure from traditional serial programming, and requires a somewhat different "world scale" in order to write OpenCilk programs that perform and scale well. In this section, we will introduce and explain some concepts that are fundamental to OpenCilk programming, and indeed, important for any parallel programmer to understand. -First, we will introduce a way to describe the structure of a OpenCilk program as a graph of *strands* and *knots*. Next, we will discuss how to analyze the expected performance of an OpenCilk program in terms of *work*, *span*, and *parallelism*. - -## Strands and knots - -Traditional serial programs are often described using call graphs or class hierarchies. Parallel programming adds another layer on top of the serial analysis. In order to diagram, understand and analyze the parallel performance of an OpenCilk program, we will distinguish only between sections of code that run serially, and sections that may run in parallel. - -We will use the word *strand* to describe a serial section of the program. More precisely, we define a strand as "any sequence of instructions without any parallel control structures." - -Note that according to this definition, a serial program could be made up of many sequential strands as short as a single instruction each, a single strand consisting of the entire program, or any other partitioning. We will assume that sequential strands are always combined to make a single, longer strand. - -In addition, we will define a *knot* as the point at which three or more strands meet. An OpenCilk program will have two kinds of knots - a *spawn knot* and a *sync knot*. Here's a picture illustrating 4 strands (1, 2, 3, 4), a spawn knot (A) and a sync knot (B). - -Here, only strands (2) and (3) may execute in parallel. - -![](/img/strands-2-and-3.png) - -A Cilk++ program fragment that has this structure is: - -```c -do_stuff_1(); // execute strand 1 -cilk_spawn func_3(); // spawn strand 3 at knot A -do_stuff_2(); // execute strand 2 -cilk_sync; // sync at knot B -do_stuff_4(); // execute strand 4 -``` - -In these illustrations, the strands are represented by lines and arcs, while the knots are represented by the circular nodes. We will refer to a strand/knot diagram as a Directed Acyclic Graph (DAG) that represents the serial/parallel structure of an OpenCilk program. - -Note: In some published literature (including some papers about Cilk and Cilk++), you will see similar diagrams in which the work is done in the nodes rather than the arcs. - -In a Cilk++ program, a *spawn knot* has exactly one input strand and two output strands. A *sync knot* has two or more input strands and exactly one output strand. Here is a DAG with two spawns (labeled A and B) and one sync (labeled C). In this program, the strands labeled (2) and -(3) may execute in parallel, while strands (3), (4), and (5) may execute in parallel. - -![](/img/spawn-and-sync-knots.png) - -A DAG represents the serial/parallel structure of the execution of an OpenCilk program. With different input, the same OpenCilk program may have a different DAG. For example, a spawn may execute conditionally. -However, the DAG does NOT depend on the number of processors on which the program runs, and in fact the DAG can be determined by running the OpenCilk program on a single processor. -Later, we will describe the execution model, and explain how work is divided among the number of available processors. - -## Work and span - -Now that we have a way of describing the serial/parallel structure of an OpenCilk program, we can begin to analyze the performance and scalability. -Consider a more complex OpenCilk program, represented in the following diagram. - -![](/img/work-and-span-dag-1.png) - -This DAG represents the parallel structure of some Cilk++ program. The ambitious reader might like to try to construct a OpenCilk program that has this DAG. - -Let's add labels to the strands to indicate the number of milliseconds it takes to execute each strand: - -![](/img/work-and-span-dag-2.png) - -### Work - -The total amount of processor time required to complete the program is the sum of all these numbers. We call this the *work*. - -In this DAG, the work is 181 milliseconds for the 25 strands shown, and if the program is run on a single processor, the program should run for 181 milliseconds. - -### Span - -Another useful concept is the *span*, sometimes called the *critical path length*. The span is the most expensive path that goes from the beginning to the end of the program. In this DAG, the span is 68 milliseconds, as shown below: - -![](/img/work-and-span-dag-3.png) - -In ideal circumstances (e.g., if there is no scheduling overhead) then, if an unlimited number of processors are available, this program should run for 68 milliseconds. -With these definitions, we can use the work and span to predict how an OpenCilk program will speedup and scale on multiple processors. The math is fairly simple, but we'll change the names a bit to confuse you. -When analyzing a OpenCilk program, we like to talk about the running time of the program on various numbers of processors. We'll use $T(P)$ to denote the execution time of the program on $P$ processors. Thus, using the descriptions of Work and Span: - -- $T(1)$ is the Work -- $T(\infty)$ is the Span - -Note that on 2 processors, the execution time can never be less than -$T(1) / 2$. In general, we can state the Work Law: -$$ -T(P) \ge \frac{T(1)}{P} -$$ -Similarly, for P processors, the execution time is never less than the execution time on an infinite number of processorrs, hence the Span Law: -$$ -T(P) \ge T(\infty) -$$ - -### Speedup and parallelism - -Intuitively, if a program runs twice as fast on 2 processors, then the speedup is 2. We formalize this by defining the *speedup* on P processors as: -$$ - T(1) / T(P) -$$ -The maximum possible speedup would occur using an infinite number of processors. Thus, we define the *parallelism* as: -$$ - T(1) / T(\infty) -$$ - -### Estimating performance and scalability -So what good is all this? Well, if we had some way to measure $T(1)$ and -$T(\infty)$, then we could predict how much speedup we would expect on $P$ processors, and estimate how well the program scales - that is, the maximum number of processors that might continue to yield a performance improvement. -This is what `Cilkscale` does. Measuring the work $T(1)$ is of course easy -- simply run the program on one processor. If we had a machine with an infinite number of processors available, then it would be easy to directly measure $T(\infty)$. Unfortunately, those are hard to come by. - -For the rest of us, `Cilkscale` reports the parallelism by combining its knowledge of the DAG with measurements of the time spent executing each strand. Using these and other measurements, `Cilkscale` provides a speedup estimate and other information that provides valuable insights into the behavior of an OpenCilk program. \ No newline at end of file diff --git a/src/doc/tutorials/tutorials.json b/src/doc/tutorials/tutorials.json deleted file mode 100644 index 355bd6f3..00000000 --- a/src/doc/tutorials/tutorials.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "layout": "layouts/page.njk", - "stylesheet": "users-guide.css", - "background": "bg-white", - "permalink": "/doc/tutorials/{{ page.fileSlug }}/", - "eleventyNavigation": { - "parent": "Tutorials" - }, - "tags": [ - "tutorial" - ] -} \ No newline at end of file diff --git a/src/doc/users-guide.md b/src/doc/users-guide.md deleted file mode 100644 index 34e4f2be..00000000 --- a/src/doc/users-guide.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: User's guide -eleventyNavigation: - key: User's guide - parent: Documentation - order: 1 - url: /doc/ -# permalink: /doc/users-guide/ ---- - -Dummy page that exists to provide a nav bread crumb "User's guide," -which when clicked goes to Documentation landing page \ No newline at end of file diff --git a/src/doc/users-guide/build-opencilk-from-source.md b/src/doc/users-guide/build-opencilk-from-source.md deleted file mode 100644 index b725779f..00000000 --- a/src/doc/users-guide/build-opencilk-from-source.md +++ /dev/null @@ -1,217 +0,0 @@ ---- -title: Build OpenCilk from source -author: Tao B. Schardl -date: 2022-07-18T18:51:45.651Z -tags: install ---- - -This page describes how to download and build OpenCilk from source. -OpenCilk is available as source code in -[three Git repositories](https://github.com/OpenCilk). We provide an -[infrastructure facilities repository](https://github.com/OpenCilk/infrastructure) -with scripts for downloading and building OpenCilk from source. -OpenCilk 2.1 is only guaranteed to support 64-bit x86 on Linux and other Unix-like -operating systems, although prototype support for 64-bit ARM is -included. - -## Requirements - -The build requirements for OpenCilk are largely consistent with those -for LLVM. In summary, to build OpenCilk on a modern system running -Linux or macOS, you will need the following: -- A relatively recent version of Git. -- A relatively modern C/C++ compiler, such as GCC or Clang, that is -capable of building LLVM. Any compiler you are likely to have -installed on a modern multicore system should work. -- CMake version 3.13.4 or newer. -- Approximately 1.5 GB of space for the source code (mostly LLVM) plus -2.5 GB of space to build, for a total of 4 GB. - -More details on build requirements for LLVM can be found here: - - -## Quick start - -In most cases, the following three steps suffice to build OpenCilk from -source on a compatible system with prerequisite software installed. - -1. Clone the OpenCilk infrastructure repository: - -```shell-session -$ git clone -b opencilk/v2.1 https://github.com/OpenCilk/infrastructure -``` - -2. Run the `get` script to get the OpenCilk source code: - -```shell-session -$ infrastructure/tools/get $(pwd)/opencilk -``` - -3. Run the `build` script to build OpenCilk: - -```shell-session -$ infrastructure/tools/build $(pwd)/opencilk $(pwd)/build -``` - -You should now be ready to use OpenCilk. Skip to [Usage](#usage) now, or read -on for more explicit directions on building OpenCilk from source. - -## Obtaining the OpenCilk source code (detailed instructions) - -Clone the OpenCilk compiler, runtime, and productivity-tool repositories. The -Cheetah runtime and OpenCilk tool repositories must be cloned into specific -subdirectories of the OpenCilk project directory: - -```shell-session -$ git clone -b opencilk/v2.1 https://github.com/OpenCilk/opencilk-project -$ git clone -b opencilk/v2.1 https://github.com/OpenCilk/cheetah opencilk-project/cheetah -$ git clone -b opencilk/v2.1 https://github.com/OpenCilk/productivity-tools opencilk-project/cilktools -``` - -Note that, because these commands clone specific tags of the OpenCilk -repositories, it is normal for Git to report that each clone is in a -'detached HEAD' state after cloning. - -Clone the OpenCilk infrastructure repository, which contains the OpenCilk build -script: - -```shell-session -$ git clone -b opencilk/v2.1 https://github.com/OpenCilk/infrastructure -``` - -## Building OpenCilk (detailed instructions) - -Run the `infrastructure/tools/build` script with two or three arguments. The -1st argument is the absolute pathname to the `opencilk-project` repository -directory. The 2nd argument is the absolute pathname of a directory to build -OpenCilk. The 3rd argument, if present, tells the build system how many -parallel jobs to run. Default parallelism is equal to the number of logical -cores, or 10 if the number of cores is not detected. - -For example: - -```shell-session -# ...git clone as above... -$ infrastructure/tools/build $(pwd)/opencilk-project $(pwd)/build -``` - -Alternatively, to explicitly build OpenCilk using 8 build threads: - -```shell-session -# ...git clone as above... -$ infrastructure/tools/build $(pwd)/opencilk-project $(pwd)/build 8 -``` - -OpenCilk takes a few CPU-hours to build on a modern system --- less than 10 -minutes on a 24-core Ryzen with a fast disk. It might take all day -single-threaded on an older machine. - -To echo the OpenCilk build script call syntax, use the `--help` switch: - -```shell-session -$ infrastructure/tools/build --help -``` - -If you encounter problems during the build process, see [Troubleshooting](#troubleshooting) for guidance on fixing common problems, or contact us via the [OpenCilk issue tracker](https://github.com/OpenCilk/opencilk-project/issues) or by emailing us at [contact@opencilk.org](mailto:contact@opencilk.org). - -{% alert "note", "Advanced build options:" %} -If you wish, you can customize your -build of OpenCilk beyond what the script provides --- e.g., to build -additional LLVM subprojects --- by running the necessary CMake -commands yourself. When run, the `infrastructure/tools/build` -script will print out the `cmake` commands it runs to build OpenCilk -from source. OpenCilk supports many of the same CMake build options -as standard LLVM, which are documented here: -. If you wish to customize your -OpenCilk build with these options, we recommend keeping `clang` in -the list passed to `-DLLVM_ENABLE_PROJECTS` and `cheetah;cilktools` -in the list passed to `-DLLVM_ENABLE_RUNTIMES`. -{% endalert %} - -## Usage - -You can run the OpenCilk C compiler out of its build tree, adding -`/bin/clang` to the build directory name. Similarly, add -`/bin/clang++` to the build-directory path to run the OpenCilk C++ -compiler. - -To run on x86, you must have a chip with Intel's Advanced Vector -Instructions (AVX). This includes Sandy Bridge and newer Intel -processors (released starting in 2011), and Steamroller and newer AMD -processors (released starting in 2014). - -OpenCilk should work on any 64-bit ARM via its experimental ARM -support. In particular, OpenCilk has been tested on Apple's M1 processor. It -may be helpful to try different values of the `CILK_NWORKERS` -environment variable on chips like the M1 that mix low- and high-power -cores. - -On macOS, you will need a -[XCode](https://developer.apple.com/support/xcode/) or -[XCode Command Line Tools](https://mac.install.guide/commandlinetools/index.html) -installed to provide standard system libraries and header files for clang. To run -clang with those header files and libraries, invoke the clang binary -with `xcrun`; for example: - -```shell-session -$ xcrun $(pwd)/build/bin/clang -``` - -## Optional: Installing OpenCilk - -You can install OpenCilk into the system directory `/opt/opencilk-2` using the following command: - -```shell-session -$ cmake --build build --target install -``` - -Note that you may need superuser privileges to perform this installation, in order to write to the system directory. - -If you don't have superuser privileges or would prefer not to install OpenCilk into a system directory, you can instead install OpenCilk locally in a directory of your choosing by running the `cmake_install.cmake` script in the build -directory. For example, the following command will install OpenCilk into your -home directory, specifically, under `$HOME/.local/opencilk`: - -```shell-session -$ cmake -DCMAKE_INSTALL_PREFIX=$HOME/.local/opencilk -P build/cmake_install.cmake -``` - -After either of these installation steps, you will need to add the -`bin` directory within the OpenCilk installation --- e.g., -`/opt/opencilk-2/bin` or `$HOME/.local/opencilk/bin` --- to your -`$PATH` in order to run the OpenCilk binary executables without -specifying the path to those binaries, e.g., by simply running `clang` -or `clang++` (or, on macOS, by running `xcrun clang` or `xcrun -clang++`). To verify that `clang` refers to the OpenCilk compier, run -`which clang` and verify that the output matches the path to the -`clang` binary in your OpenCilk installation, e.g., -`/opt/opencilk-2/bin/clang` or `$HOME/.local/opencilk/bin/clang`. - -## Troubleshooting - -Here are a few common problems encountered when building from source, -along with suggested workarounds. - -- The build fails with the error message, `collect2: error: ld returned 1 exit status`. - -This error typically occurs when the build process exhausts the -physical memory available on the system. Building OpenCilk from -source with many parallel build threads can consume a large amount of -physical memory, roughly speaking, in the tens of gigabytes. - -**Fix:** Try reducing the number of parallel threads for building -OpenCilk. Alternatively, try building OpenCilk from source using -`clang` and LLVM's linker, `lld`, which tends to consume less physical -memory than `ld`. - -- The build fails with the error message, `unrecognized argument to '-fno-sanitize=' option: 'safe-stack'`. - -This error typically occurs when the C and C++ compilers on the -system are mismatched, e.g., if `gcc` and `g++` refer to different -compiler versions on the system. - -**Fix:** Make sure that the versions of `gcc` and `g++` installed on the -system are consistent. - -Don't see your issue here? Please contact us via the [OpenCilk issue -tracker](https://github.com/OpenCilk/opencilk-project/issues) or by -emailing us at [contact@opencilk.org](mailto:contact@opencilk.org). \ No newline at end of file diff --git a/src/doc/users-guide/cilkscale.md b/src/doc/users-guide/cilkscale.md deleted file mode 100644 index 45a250fe..00000000 --- a/src/doc/users-guide/cilkscale.md +++ /dev/null @@ -1,458 +0,0 @@ ---- -title: Cilkscale — scalability analysis & benchmarking tool -image: /img/qsort-cilkscale-scalability-plots-sample-qsort-only.png -tags: - - cilkscale - - tools -attribution: false -author: Alexandros-Stavros Iliopoulos -date: 2022-08-31 -eleventyNavigation: - order: 0 ---- - -Cilkscale can help you reason about the parallel performance and scalability of -your Cilk program. Cilkscale enables you to: - -- Collect statistics of parallel performance for your application. -- Measure the {% defn "work" %}, {% defn "span" %}, and {% defn "parallelism" - %} of your (sub-)computations and predict how their performance will scale on - multiple processors. -- Automatically benchmark your program on different numbers of processors. -- Produce tables and graphical plots with the above performance and scalability - measurements. - -This guide will walk you through the basic steps of profiling the parallel -performance and scalability of your Cilk application with Cilkscale. By the -end of this guide, you will know how to generate performance and scalability -tables and plots like the ones shown below and have a basic understanding of -how to use them to diagnose parallel performance limitations of your -application. For details on the Cilkscale components, user options, and output -information, see the [Cilkscale reference page](/doc/reference/cilkscale). - -{% img "/img/qsort-cilkscale-scalability-plots-sample-qsort-only.png", "100%" %} - -{% alert "warning", "Note:" %} - -This guide assumes that OpenCilk is installed within -`/opt/opencilk/` and that the OpenCilk C++ compiler can be invoked from the -terminal as `/opt/opencilk/bin/clang++`, as shown in [this -example](/doc/users-guide/install/#example). - -{% endalert %} - -{% alert "note", "System setup for reported performance measurements:" %} - -All timings reported -in this page are measured on a laptop with an 8-core Intel Core i7-10875H CPU, -using OpenCilk 2.0.1 on Ubuntu 20.04 (via the Windows Subsystem for Linux v2 on -Windows 10). - -{% endalert %} - - -## Example application - -We shall illustrate how to use the various components of Cilkscale with a -Cilk/C++ application that implements a parallel divide-and-conquer -[quicksort](https://en.wikipedia.org/wiki/Quicksort). The source code for our -simple program, `qsort.cpp`, is shown below. - -```cilkcpp# -{% include 'code/qsort.cpp' %} -``` - -The `qsort.cpp` program simply generates a vector of pseudorandom numbers, -sorts it in parallel with the `sample_qsort()` function, and verifies the -result. We can compile and run it as follows. - -```shell-session -$ /opt/opencilk/bin/clang++ qsort.cpp -fopencilk -O3 -o qsort -$ ./qsort 100000000 -Sorting 100000000 random integers -Sort succeeded -``` - - -## Benchmarking and work/span analysis - -Cilkscale instruments your Cilk program to collect performance measurements -during its execution. Cilkscale instrumentation operates in one of two modes: - -- _Benchmarking_ mode: Cilkscale measures the wall-clock execution time of your - program. -- _Work/span analysis_ mode: Cilkscale measures the {% defn "work" %}, {% defn - "span" %}, and {% defn "parallelism" %} of your program. - -In either mode, you can use Cilkscale with two simple steps: - -1. Pass a [Cilkscale instrumentation - flag](/doc/reference/cilkscale/#compiler-options-for-cilkscale-instrumentation) - to the OpenCilk compiler when you compile and link your program. The result - is a Cilkscale-instrumented binary. -2. Run the instrumented binary. Cilkscale collects performance measurements - and prints them to the standard output. (To output the report to a file, - set the - [`CILKSCALE_OUT`](/doc/reference/cilkscale/#cilkscale-report-output-file) - environment variable.) Your program otherwise runs as it normally would. - -By default, Cilkscale only reports performance results for whole-program -execution. We will see how to perform fine-grained analyses of specific -sub-computations in the next section, after we show how to use Cilkscale in -benchmarking and work/span analysis mode. - -### Benchmarking instrumentation - -To benchmark your application with Cilkscale, pass the -`-fcilktool=cilkscale-benchmark` flag to the OpenCilk compiler: - -```shell-session -$ /opt/opencilk/bin/clang++ qsort.cpp -fopencilk -fcilktool=cilkscale-benchmark -O3 -o qsort_cs_bench -``` - -Running the instrumented binary now produces the program output as before, -followed by two lines with timing results in [CSV -format](https://en.wikipedia.org/wiki/Comma-separated_values): - -```shell-session -$ ./qsort_cs_bench 100000000 -[...] -tag,time (seconds) -,2.29345 -``` - -The report table above contains a single, untagged row with the execution time -for the entire program. We will see shortly that if we use the Cilkscale API -for [fine-grained analysis](#fine-grained-analysis), then the report table will -contain additional rows. - -### Work/span analysis instrumentation - -To analyze the parallel scalability of your application with Cilkscale, pass -the `-fcilktool=cilkscale` flag to the OpenCilk compiler: - -```shell-session -$ /opt/opencilk/bin/clang++ qsort.cpp -fopencilk -fcilktool=cilkscale -O3 -o qsort_cs -``` - -When you run the instrumented binary, the program output is followed by the -Cilkscale work/span analysis report in CSV format: - -```shell-session -$ ./qsort_cs 100000000 -[...] -tag,work (seconds),span (seconds),parallelism,burdened_span (seconds),burdened_parallelism -,26.9397,2.29954,11.7153,2.29986,11.7136 -``` - -The work, span, and parallelism measurements in the report depend on your -program's input and {% defn "logical parallelism" %} but not on the number of -processors on which it is run. The Cilkscale reference page describes the -[specific quantities reported by -Cilkscale](/doc/reference/cilkscale/#workspan-analysis-measurements-reported-by-cilkscale). - -As before, the reported measurements above are untagged and refer to -whole-program execution. - -{% alert %} - -The Cilkscale-instrumented binary in work/span analysis mode is -slower than its non-instrumented counterpart. The slowdown is generally no -larger than 10x and typically less than 2x. In the examples above, `qsort` and -`qsort_cs_bench` took 2.3s while `qsort_cs` took 3.4s (slowdown = 1.5x). - -{% endalert %} - - -## Fine-grained analysis - -Cilkscale provides a [C/C++ -API](/doc/reference/cilkscale/#cc++-api-for-fine-grained-workspan-analysis) for -benchmarking or analyzing specific regions in a program. The Cilkscale API -allows you to focus on and distinguish between specific parallel regions of -your computation when measuring its parallel performance and scalability. -Using the Cilkscale API is similar to using common C/C++ APIs for timing -regions of interest (such as the C++ `std::chrono` library or the POSIX -`clock_gettime()` function). - -Let's see how we can use the Cilkscale API to analyze the execution of -`sample_qsort()` function in our example quicksort application. That is, we -want to exclude the computations for initializing a random vector of integers -or verifying the sort correctness, which are all executed serially anyway. To -achieve this, make the following three changes to the code. - -1. Include the Cilkscale API header file. E.g., after line 4 in `qsort.cpp`: - - ```cpp - #include - ``` - -2. Create work-span snapshots using calls to `wsp_getworkspan()` around the - region we want to analyze. E.g., around the call to `sample_qsort()` in - line 35 in `qsort.cpp`: - - ```cpp - wsp_t start = wsp_getworkspan(); - sample_qsort(a.data(), a.data() + a.size()); - wsp_t end = wsp_getworkspan(); - ``` - -3. Evaluate the work and span between the relevant snapshots and print the - analysis results with a descriptive tag. E.g., just before the program - terminates in line 39 in `qsort.cpp`: - - ```cpp - wsp_t elapsed = wsp_sub(end, start); - wsp_dump(elapsed, "qsort_sample"); - ``` - -Then, save the edited program (here, we save it as `qsort_wsp.cpp`), compile it -with Cilkscale instrumentation as before, and run it: - -```shell-session -$ /opt/opencilk/bin/clang++ qsort_wsp.cpp -fopencilk -fcilktool=cilkscale -O3 -o qsort_wsp_cs -$ ./qsort_wsp_cs 100000000 -[...] -tag,work (seconds),span (seconds),parallelism,burdened_span (seconds),burdened_parallelism -sample_qsort,26.1502,1.08122,24.1859,1.08153,24.1788 -,27.3133,2.24433,12.1699,2.24465,12.1682 -``` - -Notice that the Cilkscale report above now contains an additional row tagged -`sample_qsort`, which was output by the corresponding call to `wsp_dump()`: - -```shell-session -sample_qsort,26.1502,1.08122,24.1859,1.08153,24.1788 -``` - -The last row in the Cilkscale report is always untagged and corresponds to -the execution of the whole program. - -{% alert %} - -If you compile your code without a Cilkscale instrumentation flag, -calls to the Cilkscale API are effectively ignored with zero overhead. - -{% endalert %} - -For more detailed information on the Cilkscale C/C++ API, as well as an example -of how to aggregate work/span analysis measurements from disjoint code regions, -see the relevant section of the [Cilkscale reference -page](/doc/reference/cilkscale/#cc++-api-for-fine-grained-workspan-analysis). - - -## Automatic scalability benchmarks and visualization - -Cilkscale includes a Python script which automates the process of benchmarking -and analyzing the scalability of your Cilk program. Specifically, the -Cilkscale Python script helps you do the following: - -1. Collect work/span analysis measurements for your program. -2. Benchmark your program on different numbers of processors and collect - empirical scalability measurements. -3. Store the combined analysis and benchmarking results in a CSV table. -4. Visualize the analysis and benchmarking results with informative execution - time and speedup plots. - -The Cilkscale Python script is found at `share/Cilkscale_vis/cilkscale.py` -within the OpenCilk installation directory. - -{% alert "warning", "Prerequisites:" %} - -To use the Cilkscale Python script, you need: - -- [Python](https://www.python.org/downloads/) 3.8 or later. -- (Optional) [matplotlib](https://pypi.org/project/matplotlib/) 3.5.0 or later; - only required if producing graphical plots. - -{% endalert %} - -### How to run - -To use the `cilkscale.py` script, you must pass it two Cilkscale-instrumented -binaries of your program — one with `-fcilktool=cilkscale-benchmark` and one with -`-fcilktool=cilkscale` — along with a number of optional arguments. -For a description of the `cilkscale.py` script's arguments, see the [Cilkscale reference page](/doc/reference/cilkscale/). - -Let's now see an example of using the `cilkscale.py` script to analyze and -benchmark our `qsort_wsp.cpp` program, which uses the Cilkscale API to profile -the `sample_qsort()` function. First, we build the two Cilkscale-instrumented -binaries: - -```shell-session -$ /opt/opencilk/bin/clang++ qsort_wsp.cpp -fopencilk -fcilktool=cilkscale-benchmark -O3 -o qsort_cs_bench -$ /opt/opencilk/bin/clang++ qsort_wsp.cpp -fopencilk -fcilktool=cilkscale -O3 -o qsort_cs -``` - -Then, we run `cilkscale.py` with our instrumented binaries on a sequence of -100,000,000 random integeres, and specify the output paths for the resulting -CSV table and PDF document of visualization plots: - -```shell-session -$ python3 /opt/opencilk/share/Cilkscale_vis/cilkscale.py \ - -c ./qsort_cs -b ./qsort_cs_bench \ - -ocsv cstable_qsort.csv -oplot csplots_qsort.pdf \ - --args 100000000 -``` - -### Terminal output - -The `cilkscale.py` script first echoes the values for all of its parameters, -including unspecified parameters with default values: - -```shell-session -Namespace(args=['100000000'], cilkscale='./qsort_cs', cilkscale_benchmark='./qsort_cs_bench', cpu_counts=None, output_csv='cstable_qsort.csv', output_plot='csplots_qsort.pdf', rows_to_plot='all') -``` - -Then, it runs the instrumented binary for work/span analysis on all available -cores and prints its standard output and standard error streams. You should -make sure that the program output is as expected. - -```shell-session ->> STDOUT (./qsort_cs 100000000) -Sorting 100000000 random integers -Sort succeeded -<< END STDOUT - ->> STDERR (./qsort_cs 100000000) -<< END STDERR -``` - -Once the work/span analysis pass is done, `cilkscale.py` runs the instrumented -binary for benchmarking on different numbers of processors. The number of -benchmarking runs and corresponding numbers of processors are determined by the -`-cpus` arguments to `cilkcsale.py`. (If this argument is not specified, the -program will run on $1, 2, \ldots, P$ processors, where $P$ is the number of -available physical cores in the system.) - -```shell-session -INFO:runner:Generating scalability data for 8 cpus. -INFO:runner:CILK_NWORKERS=1 taskset -c 0 ./qsort_cs_bench 100000000 -INFO:runner:CILK_NWORKERS=2 taskset -c 0,2 ./qsort_cs_bench 100000000 -INFO:runner:CILK_NWORKERS=3 taskset -c 0,2,4 ./qsort_cs_bench 100000000 -INFO:runner:CILK_NWORKERS=4 taskset -c 0,2,4,6 ./qsort_cs_bench 100000000 -INFO:runner:CILK_NWORKERS=5 taskset -c 0,2,4,6,8 ./qsort_cs_bench 100000000 -INFO:runner:CILK_NWORKERS=6 taskset -c 0,2,4,6,8,10 ./qsort_cs_bench 100000000 -INFO:runner:CILK_NWORKERS=7 taskset -c 0,2,4,6,8,10,12 ./qsort_cs_bench 100000000 -INFO:runner:CILK_NWORKERS=8 taskset -c 0,2,4,6,8,10,12,14 ./qsort_cs_bench 100000000 -``` - -In this example, the program is benchmarked on up to 8 CPU cores with IDs 0, 2, -4, …. This is because `cilkscale.py` only uses distinct *physical* cores by -default. In the computer used for this example, core IDs 1, 3, 5, … correspond -to *logical* cores used in [simultaneous -multithreading](https://en.wikipedia.org/wiki/Simultaneous_multithreading) or -"hyper-threading". - -Finally, `cilkscale.py` processes the collected benchmarking and work/span -analysis measurements and generates runtime and speedup plots for each analyzed -region (and the entire program). - -```shell-session -INFO:plotter:Generating plot (2 subplots) -``` - -The Cilkscale benchmarking and scalability analysis reports are returned in -tabular and graphical form. - -### Tabular output - -The raw measurements are output as a CSV table in the file pointed to by the -`-ocsv` argument to `cilkscale.py`. The CSV table contains, for each analyzed -region, the work/span analysis results and benchmark times for all numbers of -processors. - -For example, the above run produced the following table: - -```shell-session -$ cat cstable_qsort.csv -tag,work (seconds),span (seconds),parallelism,burdened_span (seconds),burdened_parallelism,1c time (seconds),2c time (seconds),3c time (seconds),4c time (seconds),5c time (seconds),6c time (seconds),7c time (seconds),8c time (seconds) -sample_qsort,26.5126,0.986602,26.8726,0.986927,26.8638,8.67705,4.6205,3.3648,2.75881,2.43091,2.1171,1.93193,1.7941 -,27.6918,2.16583,12.7858,2.16616,12.7839,9.68071,5.52596,4.26341,3.65358,3.32762,3.02633,2.82155,2.67563 -``` - -To see the table contents more clearly, you can import `cstable_qsort.csv` into -a spreadsheet (e.g., with [LibreOffice](https://www.libreoffice.org/)) or -[pretty-print it with command-line -tools](https://chrisjean.com/view-csv-data-from-the-command-line/): - -```shell-session -$ cat cstable_qsort.csv | sed -e 's/^,/ ,/g' | column -s, -t | less -#5 -N -S -1 tag work (seconds) span (seconds) parallelism burdened_span (seconds) burdened_parallelism 1c time (seconds) . . . -2 sample_qsort 26.5126 0.986602 26.8726 0.986927 26.8638 8.67705 . . . -3 27.6918 2.16583 12.7858 2.16616 12.7839 9.68071 . . . -``` - -### Scalability plots - -Cilkscale produces a set of scalability plots from the raw measurements in its -reported table. These plots are stored the PDF file pointed to by the `-oplot` -argument to `cilkscale.py`. Specifically, Cilkscale produces two figures for -each analyzed region (i.e., row in the CSV table): one which plots execution -time and one which plots parallel speedup. For a more detailed description of -these plots' contents, see the [Cilkscale reference -page](/doc/reference/cilkscale/#performance-and-scalability-analysis-plots). - -Here are the plots in `csplots_qsort.pdf` for the above example: - -{% img "/img/qsort-cilkscale-scalability-plots.png", "100%" %} - - -## Discussion: diagnosing performance limitations - -We have seen how to measure and explore the parallel performance and -scalability of a Cilk program. So... what next? How can we translate the -Cilkscale results into actionable insights on how to _improve_ performance? As -with serial-program profiling, the answer varies somewhat depending on the -program at hand. We will return to this question with forthcoming -documentation and blog posts. Please [let us know](/contribute/contact/) if -you'd like to be notified about important updates to OpenCilk and its -documentation. - -In the meantime, we offer a brief discussion regarding the parallel scalability -of our `qsort.cpp` example, specifically the `sample_qsort()` function. - -We observe the following: - -- Our program shows sub-linear scalability. With 8 processor cores, the - parallel speedup is only about 4.9x. -- The observed performance roughly follows the burdened-dag bound and falls - short of it as the number of cores increases. -- The parallelism of `sample_qsort()` is about 27, which is just over three - times as large as the amount of cores on the laptop where the experiments - were run. - -A main issue with our parallel `sample_qsort()` is that it does not exhibit -sufficient parallelism. The parallelism of a computation upper-bounds the -number of processors that may productively work in parallel. Moreover, -computations with insufficient {% defn "parallel slackness" %} are typically -impacted adversely by scheduling and migration overheads. As a rule of thumb, -the parallelism of a computation is deemed sufficient if it is about 10x larger -(or more) than the number of available processors. On the other hand, if the -parallelism is too high — say, several orders of magnitude higher than the -number of processors — then the overhead for spawning tasks that are too -fine-grained may become substantial. In our case, the parallelism is low and -exhibits sufficient slackness for only 2–3 cores. - -An additional issue is that the memory bandwidth of the laptop that was used in -these experiments becomes insufficient as more processing cores are used. This -is often the case for computations with low {% defn "arithmetic intensity" %} -when the observed parallel speedup falls below the burdened-dag speedup bound. -(Another possible cause for speedup below the burdened-dag bound is {% defn -"contention" %} of parallel resources.) The memory bandwidth ceiling was -measured at about 24 GB/s with the -[STREAM](https://www.cs.virginia.edu/stream/) "copy" benchmark in either serial -or parallel mode. - -If we want to improve the parallel performance of `sample_qsort()`, it appears -that our efforts, at least initially, are best spent increasing its -parallelism. One way to do that might be to undo the {% defn "coarsening" %} -of the base case (e.g., setting `BASE_CASE_LENGTH = 1`) but that makes the -recursion too fine-grained and introduces unnecessary spawning overhead — that -is, we may get better parallel speedup but slower execution overall. The one -remaining option then is to parallelize `std::partition()`, which is currently -serial and whose cost is linear with respect to the size of the input array. - -We will not cover parallel partition algorithms for quicksort here, but warn -that designing and implementing efficient parallel partitions is an interesting -and nontrivial exercise! diff --git a/src/doc/users-guide/convert-a-c++-program.md b/src/doc/users-guide/convert-a-c++-program.md deleted file mode 100644 index bc194eeb..00000000 --- a/src/doc/users-guide/convert-a-c++-program.md +++ /dev/null @@ -1,213 +0,0 @@ ---- -title: Convert a C++ program ---- - -{% alert %} -This page will be updated soon to include `cilk_scope`, introduced with OpenCilk 2.0. -{% endalert %} - -## Overview - -Here is the sequence of steps to create a parallel program using OpenCilk. - -* Typically, you will start with a serial C or C++ program that implements the basic - functions or algorithms that you want to parallelize. You will likely - be most successful if the serial program is correct to begin with! - Any bugs in the serial program will occur in the parallel program, but - they will be more difficult to identify and fix. -* Next, identify the program regions that will benefit from parallel - operation. Operations that are relatively long-running and which can - be performed independently are prime candidates. -* Use the three OpenCilk keywords to identify tasks that can execute in - parallel: - * `cilk_spawn` indicates a call to a function (a "child") that can proceed in parallel with the caller (the "parent").* - `cilk_sync` indicates that all spawned children must complete before proceeding. - * `cilk_for` identifies a loop for which all iterations can execute in parallel. -* Build the program: - - * **Linux* OS:** Use the `clang` or `clang++` compiler command. -* Run the program. If there are no ***race conditions***, the parallel program will produce the same result - as the serial program. -* Even if the parallel and serial program results are the same, there - may still be race conditions. Run the program under the ***cilksan - race detector*** to identify possible race - conditions introduced by parallel operations. -* ***Correct any race conditions*** with ***reducers***, locks, or recode to resolve - conflicts. -* Note that a traditional debugger can debug the *serialization* of a parallel program, which you can create - easily with OpenCilk. - -We will walk through this process in detail using a sort program as an example. - -## Start with a serial program - -We'll demonstrate how to use write an OpenCilk program by parallelizing -a simple implementation of ***Quicksort*** -([http://en.wikipedia.org/wiki/Quicksort](http://en.wikipedia.org/wiki/Quicksort)). - -Note that the function name `sample_qsort` avoids confusion with the -Standard C Library `qsort` function. - -```c -#include -#include -#include -#include - -// Sort the range between begin and end. -// "end" is one past the final element in the range. -// This is pure C++ code before Cilk++ conversion. -void sample_qsort(int * begin, int * end) -{ - if (begin != end) { - --end; // Exclude last element (pivot) - int * middle = std::partition(begin, end, - std::bind2nd(std::less`" statement to the source. `cilk.h` - declares all the entry points to the OpenCilk runtime. - -The result is an OpenCilk program that has no parallelism yet. - -Compile the program to ensure that the OpenCilk SDK development -environment is setup correctly. - -Typically, OpenCilk programs are built with optimized code for best -performance. - -##### Linux* OS - -```shell -> clang++ qsort.cpp -o qsort –O3 -fopencilk -``` - -## Add parallelism using `cilk_spawn` - -We are now ready to introduce parallelism into our `qsort` program. - -The `cilk_spawn` keyword indicates that a function (the *child*) may be -executed in parallel with the code that follows the `cilk_spawn` -statement (the *parent*). Note that the keyword *allows* but does not -*require* parallel operation. The OpenCilk scheduler will dynamically -determine what actually gets executed in parallel when multiple -processors are available. The `cilk_sync` statement indicates that the -function may not continue until all `cilk_spawn` requests in the same -function have completed. `cilk_sync` does not affect parallel strands -spawned in other functions. - -```c -void sample_qsort(int * begin, int * end) -{ - if (begin != end) { - --end; // Exclude last element (pivot) - int * middle = std::partition(begin, end, - std::bind2nd(std::less(),*end)); - std::swap(*end, *middle); // pivot to middle - cilk_spawn sample_qsort(begin, middle); - sample_qsort(++middle, ++end); // Exclude pivot - cilk_sync; - } -} -``` - -In line 8, we spawn a recursive invocation of `sample_qsort` that can -execute asynchronously. Thus, when we call `sample_qsort` again in line 9, the call at line 8 might not have completed. The `cilk_sync` -statement at line 10 indicates that this function will not continue -until all `cilk_spawn` requests in the same function have completed. - -There is an implicit `cilk_sync` at the end of every function that waits -until all tasks spawned in the function have returned, so the `cilk_sync` here is redundant, but written explicitly for clarity. - -The above change implements a typical divide-and-conquer strategy for -parallelizing recursive algorithms. At each level of recursion, we have -two-way parallelism; the parent strand (line 9) continues executing the -current function, while a child strand executes the other recursive -call. This recursion can expose quite a lot of parallelism. - -## Build, execute, and test - -With these changes, you can now build and execute the OpenCilk version -of the qsort program. Build and run the program exactly as we did with -the previous example: - -##### Linux* OS: - -```shell -> clang++ qsort.cpp -o qsort –O3 -fopencilk -``` - -### Run qsort from the command line - -```shell -> qsort -Sorting 10000000 integers -5.641 seconds -Sort succeeded. -``` - -By default, an OpenCilk program will query the operating system and use -all available cores. You can control the number of workers by setting -the CILK_NWORKERS environment variable: - -```shell -CILK_NWORKERS=8 ./qsort -``` - -### Observe speedup on a multicore system - -Run qsort using one and then two cores: - -```powershell -> CILK_NWORKERS=1 qsort -Sorting 10000000 integers -2.909 seconds Sort succeeded. - -> CILK_NWORKERS=2 qsort -Sorting 10000000 integers -1.468 seconds Sort succeeded. -``` - -Alternately, run cilkscale to get a more detailed performance graph. \ No newline at end of file diff --git a/src/doc/users-guide/getting-started.md b/src/doc/users-guide/getting-started.md deleted file mode 100644 index bc7e28aa..00000000 --- a/src/doc/users-guide/getting-started.md +++ /dev/null @@ -1,275 +0,0 @@ ---- -title: Getting started -tagline: This guide overviews the components of OpenCilk and walks through the basic steps of building, running, and testing a Cilk program with OpenCilk. -eleventyNavigation: - order: -2 ---- - -## Prerequisites - -### OpenCilk installation - -See the [install page](/doc/users-guide/install) for detailed instructions on -installing the latest version of OpenCilk. -We assume you have installed OpenCilk as shown in [this example](/doc/users-guide/install/#example), -so that the OpenCilk files are in `/opt/opencilk`, -and the OpenCilk C/C++ compiler can be invoked from the terminal as `/opt/opencilk/bin/clang` or `/opt/opencilk/bin/clang++`. - -### Example Cilk programs - -Download the example Cilk codes in the [OpenCilk -tutorial](https://github.com/OpenCilk/tutorial) GitHub repository and enter the -cloned directory: - -```shell-session -$ git clone https://github.com/OpenCilk/tutorial -$ cd tutorial -``` - - -## Using the compiler - -To compile a Cilk program with OpenCilk, pass the `-fopencilk` flag to the -compiler. For example: - -```shell-session -$ /opt/opencilk/bin/clang -fopencilk -O3 fib.c -o fib -``` - -{% alert %} - -Pass the `-fopencilk` flag to the compiler both when compiling and -linking the Cilk program. During compilation, the flag ensures that the Cilk -keywords are recognized and compiled. During linking, it ensures the program -is properly linked with the OpenCilk runtime library. - -{% alert "danger", "Former users of Intel Cilk Plus with GCC:" %} - -Do **not** include the `-lcilkrts` flag when linking. - -{% endalert %} - -{% endalert %} - -{% alert "note", "macOS users:" %} - -On macOS, `clang` needs the standard system libraries and -headers that are provided by -[XCode](https://developer.apple.com/support/xcode/) or the [XCode Command Line -Tools](https://mac.install.guide/commandlinetools/index.html). To run the -OpenCilk compiler with those libraries and headers, invoke `clang` with -`xcrun`. For example: - -```shell-session -$ xcrun /opt/opencilk/bin/clang -fopencilk -O3 fib.c -o fib -``` - -{% endalert %} - -The OpenCilk compiler is based on a recent stable version of the LLVM `clang` -compiler. In addition to OpenCilk-specific options, the OpenCilk compiler -supports all flags and features of LLVM `clang`, including optimization-level -flags, debug-information flags, and target-dependent compilation options. See -the [LLVM Clang -documentation](https://releases.llvm.org/14.0.0/tools/clang/docs/ClangCommandLineReference.html) -for more information on the command-line arguments. - - -## Running the program on multiple cores - -A Cilk program compiled with OpenCilk will automatically execute in parallel, -using all available cores. For example, on a laptop with an 8-core Intel Core -i7-10875H CPU: - -```shell-session -$ ./fib 40 -fib(40) = 102334155 -Time(fib) = 0.368499700 sec -``` - -To explicitly set the number of parallel Cilk workers for a program execution, -set the `CILK_NWORKERS` environment variable. For example, to execute `fib` -using only 2 parallel cores: - -```shell-session -$ CILK_NWORKERS=2 ./fib 40 -fib(40) = 102334155 -Time(fib) = 1.459649400 sec -``` - - -## Using Cilksan - -Use the OpenCilk Cilksan race detector to verify that your -parallel Cilk program is deterministic. Cilksan instruments a program to -detect {% defn "determinacy race" %} bugs at runtime. Cilksan is guaranteed to -find any and all determinacy races that arise in a given program execution. If -there are no races, Cilksan will report that the execution was race-free. - -To check for determinacy races with Cilksan, add the `-fsanitize=cilk` flag -during compilation and linking. We also recommend the `-Og -g` flags for -debugging: - -```shell-session -$ /opt/opencilk/bin/clang -fopencilk -fsanitize=cilk -Og -g nqueens.c -o nqueens -``` - -The `nqueens.c` code in this example contains a subtle determinacy race bug. -Running the Cilksan-instrumented `nqueens` program produces the following -output which shows us how two parallel strands attempt to read from and write -to the same memory address (through variables `a` and `b`, respectively). - -```shell-session -$ ./nqueens 12 -Running Cilksan race detector. -Running ./nqueens with n = 12. -Race detected on location 7f515c3f34f6 -* Read 4994b3 nqueens /home/user/opencilk/tutorial/nqueens.c:62:3 -| `-to variable a (declared at /home/user/opencilk/tutorial/nqueens.c:48) -+ Call 499da5 nqueens /home/user/opencilk/tutorial/nqueens.c:67:29 -+ Spawn 4995b3 nqueens /home/user/opencilk/tutorial/nqueens.c:67:29 -|* Write 499586 nqueens /home/user/opencilk/tutorial/nqueens.c:65:10 -|| `-to variable b (declared at /home/user/opencilk/tutorial/nqueens.c:50) -\| Common calling context - + Call 499da5 nqueens /home/user/opencilk/tutorial/nqueens.c:67:29 - + Spawn 4995b3 nqueens /home/user/opencilk/tutorial/nqueens.c:67:29 -[...output truncated...] - Allocation context - Stack object b (declared at /home/user/opencilk/tutorial/nqueens.c:50) - Alloc 499493 in nqueens /home/user/opencilk/tutorial/nqueens.c:61:16 - Call 499da5 nqueens /home/user/opencilk/tutorial/nqueens.c:67:29 - Spawn 4995b3 nqueens /home/user/opencilk/tutorial/nqueens.c:67:29 -[...output truncated...] - -Time(nqueens) = 2.325475944 sec -Total number of solutions : 14200 - -Cilksan detected 1 distinct races. -Cilksan suppressed 3479367 duplicate race reports. -``` - -Programs instrumented with Cilksan are always run serially, regardless of the -number of processors that are available or specified. The instrumented program -is expected to run up to several times slower than its non-instrumented serial -counterpart. - -{% alert "note", "macOS users:" %} -On macOS, the compiled `nqueens.c` binary uses builtins that -Cilksan does not currently recognize. To work around this behavior, add the -flag `–D_FORTIFY_SOURCE=0` when compiling: - -```shell-session -$ xcrun /opt/opencilk/bin/clang -fopencilk -fsanitize=cilk -Og -g -D_FORTIFY_SOURCE=0 nqueens.c -o nqueens -``` -{% endalert %} - - -## Using Cilkscale - -Use the OpenCilk [Cilkscale scalability analyzer](/doc/users-guide/cilkscale) script to measure -the work, span, and parallelism of your Cilk program, and to benchmark -its parallel speedup on different numbers of cores. - -To measure work and span with Cilkscale, add the `-fcilktool=cilkscale` -flag during compilation and linking: - -```shell-session -$ /opt/opencilk/bin/clang -fopencilk -fcilktool=cilkscale -O3 qsort.c -o qsort -``` - -Running the Cilkscale-instrumented program will output work, span, and -parallelism measurements in CSV format at the end of the execution. For -example: - -```shell-session -$ ./qsort 10000000 -Sorting 10000000 integers -All sorts succeeded -Time(sample_qsort) = 0.721748768 sec -tag,work (seconds),span (seconds),parallelism,burdened_span (seconds),burdened_parallelism -,7.32019,0.168512,43.4402,0.168877,43.3462 -``` - -To output the Cilkscale measurements to a file, set the `CILKSCALE_OUT` -environment variable: - -```shell-session -$ CILKSCALE_OUT=qsort_workspan.csv ./qsort 10000000 -Sorting 10000000 integers -All sorts succeeded -Time(sample_qsort) = 0.711326910 sec -$ cat qsort_workspan.csv -tag,work (seconds),span (seconds),parallelism,burdened_span (seconds),burdened_parallelism -,7.15883,0.168538,42.4761,0.168909,42.3828 -``` - -{% alert "note", "Work-span analysis of specific program regions:" %} - -By default, Cilkscale -will only analyze whole-program execution. To analyze specific regions of your -Cilk program, use the [Cilkscale work-span API](/doc/reference/cilkscale/#cc++-api-for-fine-grained-analysis). - -***Example:*** -The tutorial program `qsort_wsp.c` shows how to modify the code -of `qsort.c` to measure the work and span of the core function -`sample_qsort()`. Compiling `qsort_wsp.c` with Cilkscale and running the -instrumented binary will output an additional row in Cilkscale's CSV table with -the analysis results for `sample_qsort()`. - - -{% endalert %} - -### Scalability benchmarking and visualization - -Cilkscale also provides facilities to benchmark and plot the execution time of -your program (and each analyzed region) on different numbers of processors. - -First, build your program twice, once with `-fcilktool=cilkscale` and once with -`-fcilktool=cilkscale-benchmark`: - -```shell-session -$ /opt/opencilk/bin/clang -fopencilk -fcilktool=cilkscale -O3 qsort_wsp.c -o qsort_wsp -$ /opt/opencilk/bin/clang -fopencilk -fcilktool=cilkscale-benchmark -O3 qsort_wsp.c -o qsort_wsp_bench -``` - -Then, run the program with the Cilkscale benchmarking and visualizer Python -script, which is found at `share/Cilkscale_vis/cilkscale.py` within the -OpenCilk installation directory. For example: - -```shell-session -$ python3 /opt/opencilk/share/Cilkscale_vis/cilkscale.py -c ./qsort_wsp -b ./qsort_wsp_bench --args 10000000 -Namespace(args=['10000000'], cilkscale='./qsort_wsp', cilkscale_benchmark='./qsort_wsp_bench', -cpu_counts=None, output_csv='out.csv', output_plot='plot.pdf', rows_to_plot='all') - ->> STDOUT (./qsort_wsp 10000000) -Sorting 10000000 integers -All sorts succeeded -Time(sample_qsort) = 0.713108289 sec -<< END STDOUT - ->> STDERR (./qsort_wsp 10000000) -<< END STDERR - -INFO:runner:Generating scalability data for 8 cpus. -INFO:runner:CILK_NWORKERS=1 taskset -c 0 ./qsort_wsp_bench 10000000 -INFO:runner:CILK_NWORKERS=2 taskset -c 0,2 ./qsort_wsp_bench 10000000 -INFO:runner:CILK_NWORKERS=3 taskset -c 0,2,4 ./qsort_wsp_bench 10000000 -INFO:runner:CILK_NWORKERS=4 taskset -c 0,2,4,6 ./qsort_wsp_bench 10000000 -INFO:runner:CILK_NWORKERS=5 taskset -c 0,2,4,6,8 ./qsort_wsp_bench 10000000 -INFO:runner:CILK_NWORKERS=6 taskset -c 0,2,4,6,8,10 ./qsort_wsp_bench 10000000 -INFO:runner:CILK_NWORKERS=7 taskset -c 0,2,4,6,8,10,12 ./qsort_wsp_bench 10000000 -INFO:runner:CILK_NWORKERS=8 taskset -c 0,2,4,6,8,10,12,14 ./qsort_wsp_bench 10000000 -INFO:plotter:Generating plot -``` - -Running the `cilkscale.py` script as above does the following: - -1. Measures the work, span, and parallelism of `qsort_wsp` with argument - `10000000`. -2. Runs and times the program with $1$, $2$, ..., $P$ parallel Cilk workers, - where $P$ is the number of available physical cores (in this case, $P = 8$) -3. Outputs the analysis and benchmarking results as a CSV table (`out.csv`) and - as plots in a PDF document (`plot.pdf`). - -For more information on the Cilkscale scalability analysis and visualization -script, see the [Cilkscale documentation page](/doc/users-guide/cilkscale). \ No newline at end of file diff --git a/src/doc/users-guide/install.md b/src/doc/users-guide/install.md deleted file mode 100644 index 734aea5e..00000000 --- a/src/doc/users-guide/install.md +++ /dev/null @@ -1,200 +0,0 @@ ---- -title: Install OpenCilk -tags: install -eleventyNavigation: - order: -3 -download: - host: https://github.com/OpenCilk/opencilk-project/ - release: opencilk/v2.1 - ubuntu_2204_aarch64: - shell: opencilk-2.1.0-aarch64-linux-gnu-ubuntu-22.04.sh - binary: opencilk-2.1.0-aarch64-linux-gnu-ubuntu-22.04.tar.gz - size: 1.04 GB - ubuntu_2204_x86: - shell: opencilk-2.1.0-x86_64-linux-gnu-ubuntu-22.04.sh - binary: opencilk-2.1.0-x86_64-linux-gnu-ubuntu-22.04.tar.gz - size: 1.07 GB - macos_x86: - shell: opencilk-2.1.0-x86_64-apple-darwin21.6.0.sh - binary: opencilk-2.1.0-x86_64-apple-darwin21.6.0.tar.gz - size: 1.04 GB - macos_arm: - shell: opencilk-2.1.0-arm64-apple-darwin21.6.0.sh - binary: opencilk-2.1.0-arm64-apple-darwin21.6.0.tar.gz - size: 979 MB - docker: - binary: docker-opencilk-v2.1.tar.gz - size: 1.17 GB ---- - -## System requirements - -OpenCilk 2.1 runs on Intel x86 64-bit processors (Haswell and newer), AMD x86 -64-bit processors (Excavator and newer), and various 64-bit ARM processors, including Apple M1 and M2. It has been tested on the following operating systems: - - - Recent versions of Ubuntu, including via the Windows Subsystem for Linux v2 (WSL2) on Windows 10 - - Recent versions of macOS - - FreeBSD 13 - - Recent versions of Fedora - -{% alert "note", "Prerequisites:" %} -The OpenCilk binaries assume that system header files and system libraries -are already installed on the system. -- On Linux, we recommend installing GCC (or equivalent) to provide these necessary system files. -- On macOS, you must install [XCode](https://developer.apple.com/support/xcode/) or -the [XCode Command Line Tools](https://mac.install.guide/commandlinetools/index.html) to get -the necessary system files. -{% endalert %} - -## Methods of installation - -Precompiled binaries for OpenCilk 2.1 can be installed in several ways: -- Using a [shell archive (`.sh`)](#installing-using-a-shell-archive) built for the target hardware and operating system. -- Using a [tarball (`.tar.gz`)](#installing-using-a-tarball) built for the target hardware and operating system. -- Using a [docker image](#docker-image). - -You can also [build OpenCilk from source](../build-opencilk-from-source), -which is the recommended approach for Ubuntu 18.04 and other operating systems for -which precompiled binaries are not available. - -## Installing using a shell archive - -To install OpenCilk 2.1 using a shell archive, first download the appropriate shell -archive for your system, then follow the installation instructions. - -### Download - -Download the appropriate shell archive for your system using one of the following links: - -***Linux:*** - - [{{ download.ubuntu_2204_aarch64.shell }}]({{ download.host }}releases/download/{{ download.release }}/{{ download.ubuntu_2204_aarch64.shell }}) - ({{ download.ubuntu_2204_aarch64.size }}) - - [{{ download.ubuntu_2204_x86.shell }}]({{ download.host }}releases/download/{{ download.release }}/{{ download.ubuntu_2204_x86.shell }}) - ({{ download.ubuntu_2204_x86.size }}) - -***macOS:*** - - [{{ download.macos_arm.shell }}]({{ download.host }}releases/download/{{ download.release }}/{{ download.macos_arm.shell }}) - ({{ download.macos_arm.size }}) - - [{{ download.macos_x86.shell }}]({{ download.host }}releases/download/{{ download.release }}/{{ download.macos_x86.shell }}) - ({{ download.macos_x86.size }}) - -### Install - -Execute the shell script to extract OpenCilk 2.1 into the current directory. For example: - -```shell-session -$ sh opencilk-2.1.0-x86_64-linux-gnu-ubuntu-22.04.sh -``` - -You will be prompted to accept the OpenCilk license and whether or not to -append a version-specific subdirectory to the installation prefix (by default -the current directory). - -Optionally, you can select a different installation directory by passing the -option `--prefix=/path/to/install/dir` to the script. (You will need to make -sure that installation directory exists before running the shell archive with -`--prefix`.) To see all options, pass -the `--help` argument to the script. - -The OpenCilk C (or C++) compiler can be invoked via `bin/clang` (or -`bin/clang++`) from within the installation directory. -Optionally, you can configure your system so that `clang` and `clang++` point to the OpenCilk C and C++ -compilers (e.g., by setting your `PATH` environment variable or installing system-wide symbolic links). - -{% alert "Note", "Example:" %} - -The following example shows the -process on Ubuntu 22.04 to install OpenCilk into `/opt/opencilk` without adding -a version-specific subdirectory. The installation and setup process is -analogous for macOS and other Linux systems. - -- Download the precompiled [OpenCilk shell -archive](/doc/users-guide/install/#installing-using-a-shell-archive) for your -system. -- Make directory `/opt/opencilk` if it does not already exist, and execute the shell script to install OpenCilk into the directory. - -```shell-session -$ mkdir -p /opt/opencilk -$ sh opencilk-2.1.0-x86_64-linux-gnu-ubuntu-22.04.sh --prefix=/opt/opencilk --exclude-subdir -OpenCilk Installer Version: 2.1.0, Copyright (c) OpenCilk -This is a self-extracting archive. -The archive will be extracted to: /opt/opencilk -Using target directory: /opt/opencilk -Extracting, please wait... -Unpacking finished successfully -``` - -- The OpenCilk C/C++ compiler can now be run as `/opt/opencilk/bin/clang` or `/opt/opencilk/bin/clang++`. -- Optionally, set `clang` and `clang++` to point to the OpenCilk C and C++ -compilers. This can be achieved in numerous ways, such as by setting your -`PATH` environment variable to look in `/opt/opencilk/bin/` or by installing -system-wide symbolic links. -{% endalert %} - -## Installing using a tarball - -To install OpenCilk 2.1 using a tarball, first download the appropriate tarball -for your system, then follow the installation instructions. - -### Download - -Download the appropriate tarball for your system using one of the following links: - -***Linux:*** - - {{ download.ubuntu_2204_aarch64.binary }} - ({{ download.ubuntu_2204_aarch64.size }}) - - {{ download.ubuntu_2204_x86.binary }} - ({{ download.ubuntu_2204_x86.size }}) - -***macOS:*** - - {{ download.macos_arm.binary }} - ({{ download.macos_arm.size }}) - - {{ download.macos_x86.binary }} - ({{ download.macos_x86.size }}) - -### Install - -Extract OpenCilk 2.1 from the downloaded tarball. For example: -```shell-session -$ tar xvzf opencilk-2.1.0-x86_64-linux-gnu-ubuntu-22.04.tar.gz -``` -will extract the OpenCilk installation into a subdirectory -`opencilk-2.1.0-x86_64-linux-gnu-ubuntu-22.04/` within the current working directory. - -{% alert "Note", "Note:" %} -Extracting the tarball as above is equivalent to running the corresponding -shell archive with options `--skip-license --include-subdir`. Installing using this method, -or by passing `--skip-license` to the shell archive, implies that you accept OpenCilk's -software license. -{% endalert %} - -## Docker image - -OpenCilk 2.1 is also available as a [docker](https://www.docker.com/) image based on Ubuntu 22.04. -You can download the docker image here: - -- {{ download.docker.binary }} - ({{ download.docker.size }}) - -The OpenCilk C and C++ compilers are available as `clang` and `clang++` in the -image. To use the OpenCilk 2.1 Docker image, download the -`docker-opencilk-v2.1.tar.gz` file, load the image, and run a container. For -example: - -```shell-session -$ docker load -i docker-opencilk-v2.1.tar.gz -$ docker run -it opencilk:v2.1 /bin/bash -``` - -## Next steps - -The OpenCilk 2.1 installation includes LLVM 16 with the following OpenCilk -components: - - - OpenCilk compiler (with the `clang` and `clang++` front-ends) - - OpenCilk runtime library - - Cilksan race detector - - Cilkscale scalability analyzer and visualization script - -See [Getting started](/doc/users-guide/getting-started) for steps to verify -that your installation is working and to start using OpenCilk. diff --git a/src/doc/users-guide/users-guide.json b/src/doc/users-guide/users-guide.json deleted file mode 100644 index 6ecbce04..00000000 --- a/src/doc/users-guide/users-guide.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "layout": "layouts/page.njk", - "stylesheet": "users-guide.css", - "background": "bg-white", - "permalink": "/doc/users-guide/{{ page.fileSlug | slugify }}/", - "eleventyNavigation": { - "parent": "User's guide" - }, - "tags": [ - "users guide" - ] -} \ No newline at end of file From 2fe2d58ef4b5905c1e42c63de32ffae1a3593ea4 Mon Sep 17 00:00:00 2001 From: Bruce Hoppe Date: Wed, 4 Sep 2024 16:25:55 -0400 Subject: [PATCH 07/13] delete contribute folder --- src/contribute.md | 63 --------------------------- src/contribute/contact.md | 43 ------------------ src/contribute/contribute.11tydata.js | 54 ----------------------- src/contribute/contribute.json | 9 ---- src/contribute/join-us-dummy.md | 10 ----- src/contribute/open-projects.md | 23 ---------- 6 files changed, 202 deletions(-) delete mode 100644 src/contribute.md delete mode 100644 src/contribute/contact.md delete mode 100644 src/contribute/contribute.11tydata.js delete mode 100644 src/contribute/contribute.json delete mode 100644 src/contribute/join-us-dummy.md delete mode 100644 src/contribute/open-projects.md diff --git a/src/contribute.md b/src/contribute.md deleted file mode 100644 index 7a9aa4c3..00000000 --- a/src/contribute.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -layout: layouts/page.njk -background: bg-white -sidebar: toc -title: Contribute to OpenCilk -eleventyNavigation: - key: Contribute - parent: Home - order: 7 ---- -{% alert "note", "Part of Fastcode" %} -The OpenCilk team is part of Fastcode, an open-source community dedicated to advancing software performance engineering -- making software run fast or otherwise consume few resources such as time, storage, and energy. [Join us](/community/join-us). -{% endalert %} - -The OpenCilk project welcomes your expertise and enthusiasm. A few specific opportunities are listed below. If you see anything interesting, or have ideas that we haven't thought of, please [contact us](/contribute/contact/). - -## Teaching - -{% imgLeft "/img/owl.png", "60px" %} -Are you teaching with OpenCilk? - -We hope you'll join our [community of educators](/community/teach-performance) who are developing resources for teaching topics in software performance engineering. - -## Documenting -Are you doing something with performance engineering that you want people to hear about? Are you writing how-tos or tutorials to help students with OpenCilk? We would love to hear! Have you prepared a presentation, video, or other educational materials about OpenCilk? Let us know! If you’re unsure where to start or how your skills fit in, [reach out](/contribute/contact/)! - -## Open projects -We are looking for people to help us with several OpenCilk projects, including develping an OpenCilk language server, improving Cilksan reporting, and fixing relevant debuggers to interface properly with the OpenCilk runtime system. See [open projects](./open-projects) for more. - -## Testing -We are interested in your experiences or issues in installing and writing code and running OpenCilk programs. -We are also interested in collecting performance figures for different computer systems. -- Please report compiler bugs at https://github.com/OpenCilk/opencilk-project/issues -- Please report runtime bugs at https://github.com/OpenCilk/cheetah/issues -- Please report website and documentation bugs at https://github.com/OpenCilk/www.opencilk.org/issues - -## Porting and scripting -You can help by porting OpenCilk to other platforms, and writing scripts to automate release testing. - -## Coding -Want to customize your own compiler or runtime environment? Check out OpenCilk code that's maintained in these GitHub repositories: - -- [Infrastructure](https://github.com/OpenCilk/infrastructure): OpenCilk build scripts and instructions reside here. (See also the [Build from source](/doc/users-guide/build-opencilk-from-source/) page.) -- [OpenCilk project](https://github.com/OpenCilk/opencilk-project): Forked from [LLVM](https://github.com/llvm/llvm-project), the compiler code resides here. -- [Cheetah](https://github.com/OpenCilk/cheetah): Code for the runtime system resides here. -- [Productivity tools](https://github.com/OpenCilk/productivity-tools): Code for Cilksan, Cilkscale, and other tools lives here. - -In addition to developing the OpenCilk codebase, we need your help extending existing code libraries to run in parallel with OpenCilk. Notable opportunities include the C++ Standard Template Library (STL) and the [GraphBLAS](https://graphblas.org/) Graph Linear Algebra API. Also improving the productivity tools. - -## Postdoc Positions - -The Supertech research group in the MIT Computer Science and Artificial Intelligence Laboratory seeks multiyear Postdoctoral Associates to join the OpenCilk development team led by Professor Charles E. Leiserson, Dr. Tao B. Schardl, and Research Scientist Dorothy Curtis. The open-source OpenCilk software platform, a new implementation of the Cilk parallelprogramming platform, will feature a superior compiler based on the Tapir/LLVM compiler (Best Paper, PPoPP 2017), a new work-stealing runtime system, and a suite of parallelprogramming productivity tools. Candidates should be recent Ph.D. graduates in computer science and engineering with excellent C/C++ programming skills and publications in one or more of the following areas: -- parallel computing (particularly multicore); -- language runtime systems and compilers (especially LLVM); -- software productivity tools; -- user interface design and implementation; -- software performance engineering (writing fast code); -- algorithms and data structures; -- software engineering, testing, benchmarking, and/or release management; -- cloud environments and operating systems. - -Please see additional details here: -[PostdocFlyer.pdf](https://github.com/OpenCilk/www.opencilk.org/files/8886546/PostdocFlyer.pdf) \ No newline at end of file diff --git a/src/contribute/contact.md b/src/contribute/contact.md deleted file mode 100644 index 781918d0..00000000 --- a/src/contribute/contact.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -layout: layouts/page.njk -title: Contact us -eleventyNavigation: - key: Contact - order: 2 ---- - -Do you have questions or comments about OpenCilk, our open-source community, or software performance engineering? - -We would love to hear from you. Please use the form below or email `contact@opencilk.org`. Thank you! - -
    -
    -
    -
    - - -
    -
    -
    -
    - - -
    We'll never share your email with anyone else.
    -
    -
    -
    -
    - - -
    -
    - - -
    -
    - -(See also [Community](/community/) and [Contribute](/contribute/).) \ No newline at end of file diff --git a/src/contribute/contribute.11tydata.js b/src/contribute/contribute.11tydata.js deleted file mode 100644 index 9fd586d9..00000000 --- a/src/contribute/contribute.11tydata.js +++ /dev/null @@ -1,54 +0,0 @@ -require('dotenv').config(); - -const isDevEnv = process.env.ELEVENTY_ENV === 'development'; -const todaysDate = new Date(); - -function showDraft(data) { - const isDraft = 'draft' in data && data.draft !== false; - const isFutureDate = data.page.date > todaysDate; - return isDevEnv || (!isDraft && !isFutureDate); -} - -module.exports = function() { - return { - eleventyComputed: { - eleventyExcludeFromCollections: function(data) { - if(showDraft(data)) { - return data.eleventyExcludeFromCollections; - } - else { - return true; - } - }, - permalink: function(data) { - if(showDraft(data)) { - return data.permalink - } - else { - return false; - } - }, - eleventyNavigation: { - key: function(data) { - if(showDraft(data)) { - return data.title - } - else { - return false; - } - } - }, - sidebar: function(data) { - return 'toc'; - }, - background: function(data) { - if(('draft' in data && data.draft !== false) || (data.page.date > todaysDate)) { - return 'text-white bg-info' - } - else { - return 'bg-white'; - } - } - } - } -} \ No newline at end of file diff --git a/src/contribute/contribute.json b/src/contribute/contribute.json deleted file mode 100644 index f4d6188c..00000000 --- a/src/contribute/contribute.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "layout": "layouts/page.njk", - "sidebar": "toc", - "background": "bg-white", - "permalink": "/contribute/{{ page.fileSlug | slugify }}/", - "eleventyNavigation": { - "parent": "Contribute" - } -} \ No newline at end of file diff --git a/src/contribute/join-us-dummy.md b/src/contribute/join-us-dummy.md deleted file mode 100644 index 51b2f0ce..00000000 --- a/src/contribute/join-us-dummy.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Join Us -eleventyNavigation: - key: Join Fastcode - parent: Contribute - order: 4 - url: /community/join-us/ ---- - -Dummy join-us puts "Join Us" under "Contribute" as a link to the /community/join-us page. \ No newline at end of file diff --git a/src/contribute/open-projects.md b/src/contribute/open-projects.md deleted file mode 100644 index 6cdceea6..00000000 --- a/src/contribute/open-projects.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -layout: layouts/page.njk -sidebar: toc -title: Open projects -eleventyNavigation: - key: Open projects - order: 1 ---- - -We are looking for people to help us with the following projects with OpenCilk. If you see anything interesting, please [contact us](/contribute/contact/). - -## Language server - -Develop an **OpenCilk [language server](https://microsoft.github.io/language-server-protocol/)** that integrates with OpenCilk's tools. For example, the language server would integrate with Cilksan to allow editors to mark locations in the program's source that are involved in a determinacy race. - -## Cilksan reporting - -Improve the output of Cilksan to syntax-highlight names of functions in the call stack, especially the namespaces and types in C++ function names. - -## Debuggers - -- Fix GDB to correctly identify stack frames in the cactus stack of a Cilk program. -- Fix the RR debugger's behavior to handle Cilk's stack switching when rewinding the parallel execution of a Cilk program. \ No newline at end of file From 9b900348fa8c57d698431013100234569e5b810f Mon Sep 17 00:00:00 2001 From: Bruce Hoppe Date: Wed, 4 Sep 2024 16:27:46 -0400 Subject: [PATCH 08/13] delete install, resources, software pages --- src/community/resources.md | 22 -------------------- src/community/software.md | 42 -------------------------------------- src/install_dummy.md | 9 -------- 3 files changed, 73 deletions(-) delete mode 100644 src/community/resources.md delete mode 100644 src/community/software.md delete mode 100644 src/install_dummy.md diff --git a/src/community/resources.md b/src/community/resources.md deleted file mode 100644 index 315e02a5..00000000 --- a/src/community/resources.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: layouts/page.njk -sidebar: toc -title: Resources -draft: true -eleventyNavigation: - key: Resources - parent: Community - order: 99 ---- - -**The goal of this draft page** is to encourage the core OpenCilk team to start contibuting content to this site. As we curate our collection of content (on the [website repository](https://github.com/OpenCilk/www.opencilk.org/)) over the coming weeks/months/years, we can change and adapt how we present it on the generated pages of this website. For example, whenever we notice a interesting slice of content emerging behind the scenes, we can present it on the website with a blog post or a new page. - -## Add to our list of resources - -The content below comes from [`src/_data/resources.yaml`](https://github.com/OpenCilk/www.opencilk.org/blob/main/src/_data/resources.yaml). If you have any edits or additions to make to the list, please submit them as edits (pull requests) there. Thank you! - -## Community resource list - -{% for entry in resources %} - - [{{ entry.name }}]({{ entry.url }}) {%if entry.tags %} {% for tag in entry.tags | filterTagList %} {% set tagUrl %}/tags/{{ tag | slug }}/{% endset %} {% endfor %} {% endif %} {% if entry.description %}: {{ entry.description }} {% endif %} -{% endfor %} \ No newline at end of file diff --git a/src/community/software.md b/src/community/software.md deleted file mode 100644 index c1e83665..00000000 --- a/src/community/software.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -layout: layouts/page.njk -sidebar: toc -title: Software -eleventyNavigation: - key: Software - parent: Community - order: 99 ---- - -This page lists software contributed by the community that is related to OpenCilk, including OpenCilk-powered applications and libraries and -miscellaneous tools to help developers write Cilk programs. - -## OpenCilk-powered libraries - -The following third-party libraries are known to work with OpenCilk out of the -box for parallel execution. - -- [SG-t-SNE-Π](https://github.com/fcdimitr/sgtsnepi): Low-dimensional embedding - of sparse stochastic graphs. -- [FGLT](https://github.com/ailiop/fglt): Fast graphlet transform. -- [RecFMM](https://github.com/zhang416/recfmm): Adaptive fast multipole method. -- [ParlayLib](https://github.com/cmuparlay/parlaylib): A toolkit for programming parallel algorithms on shared-memory multicore machines. - -## OpenCilk-powered applications - -The following third-party applications are known to work with OpenCilk. - -- [The Problem Based Benchmark Suite (V2)](https://cmuparlay.github.io/pbbsbench/): A collection of over 20 benchmarks defined in terms of their IO characteristics. -- [GBBS: Graph Based Benchmark Suite](https://github.com/ParAlg/gbbs): A collection of fast parallel graph algorithms. -- [mold](https://github.com/wheatman/mold): A port of the mold linker to OpenCilk. - -## Miscellaneous developer tools - -- [cilk-mode.el](https://github.com/ailiop/cilk-mode/): Emacs minor mode for - Cilk source code. - -## Contribute - -Want your OpenCilk-powered software listed here? Contact us at [contact@opencilk.org](mailto:contact@opencilk.org). - -You can find more information on contributing to OpenCilk [here](/contribute). diff --git a/src/install_dummy.md b/src/install_dummy.md deleted file mode 100644 index 5b9c9b5d..00000000 --- a/src/install_dummy.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -eleventyNavigation: - key: Install - parent: Home - order: 1 - url: /doc/users-guide/install/ ---- - -Dummy install puts "Install" in navbar as a link to the actual users guide page. \ No newline at end of file From f5aab7e62338d7cf1558732e503330979a78f4c9 Mon Sep 17 00:00:00 2001 From: Bruce Hoppe Date: Wed, 4 Sep 2024 16:30:17 -0400 Subject: [PATCH 09/13] rough draft homepage Carousel and navbar are configured. Overall pages are arranged. --- src/_includes/partials/navbar.njk | 10 ++-- src/_includes/partials/sidebar-toc.njk | 2 +- src/{about-us.md => about.md} | 7 +-- src/blog.njk | 2 +- src/community.md | 5 +- src/community/community.json | 2 +- src/community/teach performance.md | 2 +- src/css/index.css | 2 +- src/events.md | 64 +++++++++++++++++++++++++ src/img/highway-horizon-bg.png | Bin 61860 -> 56172 bytes src/img/highway-horizon-dark-bg.png | Bin 101597 -> 70981 bytes src/index.njk | 27 +++++------ 12 files changed, 95 insertions(+), 28 deletions(-) rename src/{about-us.md => about.md} (98%) create mode 100644 src/events.md diff --git a/src/_includes/partials/navbar.njk b/src/_includes/partials/navbar.njk index adeee7e9..37211500 100644 --- a/src/_includes/partials/navbar.njk +++ b/src/_includes/partials/navbar.njk @@ -1,5 +1,6 @@ -
+
diff --git a/src/_includes/partials/sidebar-toc.njk b/src/_includes/partials/sidebar-toc.njk index 6ef3f15c..974208ff 100644 --- a/src/_includes/partials/sidebar-toc.njk +++ b/src/_includes/partials/sidebar-toc.njk @@ -1,4 +1,4 @@ -{% set navPages = ['Blog', 'Documentation', 'Community', 'About us', 'Contribute'] %} +{% set navPages = ['About', 'Get involved', 'Blog', 'Events'] %} {% if eleventyNavigation.key in navPages %} {% set context = eleventyNavigation.key %} {% else %} diff --git a/src/about-us.md b/src/about.md similarity index 98% rename from src/about-us.md rename to src/about.md index bea052ff..f76d8e75 100644 --- a/src/about-us.md +++ b/src/about.md @@ -1,12 +1,13 @@ --- layout: layouts/page.njk +stylesheet: None background: bg-white sidebar: toc -title: About us +title: About eleventyNavigation: - key: About us + key: About parent: Home - order: 6 + order: 1 date: 2022-07-05T16:59:41.487Z --- {% alert "note", "Our mission:" %} diff --git a/src/blog.njk b/src/blog.njk index 78b64c00..ea4aa57a 100644 --- a/src/blog.njk +++ b/src/blog.njk @@ -6,7 +6,7 @@ sidebar: blog permalink: /posts/ eleventyNavigation: key: Blog - order: 2 + order: 7 parent: Home --- diff --git a/src/community.md b/src/community.md index 5c10aea4..2c13ce4e 100644 --- a/src/community.md +++ b/src/community.md @@ -1,10 +1,11 @@ --- layout: layouts/page.njk +stylesheet: None background: bg-white sidebar: toc -title: Community +title: Get involved eleventyNavigation: - key: Community + key: Get involved parent: Home order: 5 --- diff --git a/src/community/community.json b/src/community/community.json index b80a78bb..88e7b2fa 100644 --- a/src/community/community.json +++ b/src/community/community.json @@ -3,6 +3,6 @@ "background": "bg-white", "permalink": "/community/{{ page.fileSlug | slugify }}/", "eleventyNavigation": { - "parent": "Community" + "parent": "Get involved" } } \ No newline at end of file diff --git a/src/community/teach performance.md b/src/community/teach performance.md index 1a34abe3..439c635a 100644 --- a/src/community/teach performance.md +++ b/src/community/teach performance.md @@ -3,7 +3,7 @@ title: Teach performance sidebar: toc eleventyNavigation: key: Teach performance - parent: Community + parent: Get involved order: 1 --- diff --git a/src/css/index.css b/src/css/index.css index 47cc7587..0d464b91 100644 --- a/src/css/index.css +++ b/src/css/index.css @@ -51,7 +51,7 @@ nav.bd-links li > a { padding-left: 0; } .bd-container .bd-sidebar-primary { - background-color: transparent; + background-color: --pst-color-primary; } input#__primary:checked ~ .bd-container .bd-sidebar-primary { background-color: white; diff --git a/src/events.md b/src/events.md new file mode 100644 index 00000000..6df9a371 --- /dev/null +++ b/src/events.md @@ -0,0 +1,64 @@ +--- +layout: layouts/page.njk +stylesheet: None +background: bg-white +sidebar: toc +title: Contact us +eleventyNavigation: + key: Contact us + parent: Home + order: 8 +--- +{% alert "note", "Part of Fastcode" %} +The OpenCilk team is part of Fastcode, an open-source community dedicated to advancing software performance engineering -- making software run fast or otherwise consume few resources such as time, storage, and energy. [Join us](/community/join-us). +{% endalert %} + +The OpenCilk project welcomes your expertise and enthusiasm. A few specific opportunities are listed below. If you see anything interesting, or have ideas that we haven't thought of, please [contact us](/contribute/contact/). + +## Teaching + +{% imgLeft "/img/owl.png", "60px" %} +Are you teaching with OpenCilk? + +We hope you'll join our [community of educators](/community/teach-performance) who are developing resources for teaching topics in software performance engineering. + +## Documenting +Are you doing something with performance engineering that you want people to hear about? Are you writing how-tos or tutorials to help students with OpenCilk? We would love to hear! Have you prepared a presentation, video, or other educational materials about OpenCilk? Let us know! If you’re unsure where to start or how your skills fit in, [reach out](/contribute/contact/)! + +## Open projects +We are looking for people to help us with several OpenCilk projects, including develping an OpenCilk language server, improving Cilksan reporting, and fixing relevant debuggers to interface properly with the OpenCilk runtime system. See [open projects](./open-projects) for more. + +## Testing +We are interested in your experiences or issues in installing and writing code and running OpenCilk programs. +We are also interested in collecting performance figures for different computer systems. +- Please report compiler bugs at https://github.com/OpenCilk/opencilk-project/issues +- Please report runtime bugs at https://github.com/OpenCilk/cheetah/issues +- Please report website and documentation bugs at https://github.com/OpenCilk/www.opencilk.org/issues + +## Porting and scripting +You can help by porting OpenCilk to other platforms, and writing scripts to automate release testing. + +## Coding +Want to customize your own compiler or runtime environment? Check out OpenCilk code that's maintained in these GitHub repositories: + +- [Infrastructure](https://github.com/OpenCilk/infrastructure): OpenCilk build scripts and instructions reside here. (See also the [Build from source](/doc/users-guide/build-opencilk-from-source/) page.) +- [OpenCilk project](https://github.com/OpenCilk/opencilk-project): Forked from [LLVM](https://github.com/llvm/llvm-project), the compiler code resides here. +- [Cheetah](https://github.com/OpenCilk/cheetah): Code for the runtime system resides here. +- [Productivity tools](https://github.com/OpenCilk/productivity-tools): Code for Cilksan, Cilkscale, and other tools lives here. + +In addition to developing the OpenCilk codebase, we need your help extending existing code libraries to run in parallel with OpenCilk. Notable opportunities include the C++ Standard Template Library (STL) and the [GraphBLAS](https://graphblas.org/) Graph Linear Algebra API. Also improving the productivity tools. + +## Postdoc Positions + +The Supertech research group in the MIT Computer Science and Artificial Intelligence Laboratory seeks multiyear Postdoctoral Associates to join the OpenCilk development team led by Professor Charles E. Leiserson, Dr. Tao B. Schardl, and Research Scientist Dorothy Curtis. The open-source OpenCilk software platform, a new implementation of the Cilk parallelprogramming platform, will feature a superior compiler based on the Tapir/LLVM compiler (Best Paper, PPoPP 2017), a new work-stealing runtime system, and a suite of parallelprogramming productivity tools. Candidates should be recent Ph.D. graduates in computer science and engineering with excellent C/C++ programming skills and publications in one or more of the following areas: +- parallel computing (particularly multicore); +- language runtime systems and compilers (especially LLVM); +- software productivity tools; +- user interface design and implementation; +- software performance engineering (writing fast code); +- algorithms and data structures; +- software engineering, testing, benchmarking, and/or release management; +- cloud environments and operating systems. + +Please see additional details here: +[PostdocFlyer.pdf](https://github.com/OpenCilk/www.opencilk.org/files/8886546/PostdocFlyer.pdf) \ No newline at end of file diff --git a/src/img/highway-horizon-bg.png b/src/img/highway-horizon-bg.png index 76af9eb9864c57ae5731ad2ad025e98f5c71b6d5..182b8e8d44d989181a300e2b704fa5c691a5dcaa 100644 GIT binary patch literal 56172 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

* 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 Y9G2}~YOxdXQm@`IqoX-T&j0oQ0D=e6&j0`b literal 61860 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≺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 -

+ {% endfor %}
- -
From 90fe5bd3789079fcd68f006315710924039f0c38 Mon Sep 17 00:00:00 2001 From: Bruce Hoppe Date: Fri, 6 Sep 2024 17:13:28 -0400 Subject: [PATCH 10/13] get involved, blog, events working structure of top-level menu items with sub pages --- src/_data/metadata.json | 2 +- src/_includes/posts_cards.njk | 8 +- src/about.md | 55 +-------- src/about/about_fastcode.md | 14 +++ src/about/about_spe.md | 47 ++++++++ src/blog.njk | 3 + src/community.md | 37 ------ src/community/community.11tydata.js | 54 --------- src/community/community.json | 8 -- src/events.md | 64 ---------- src/events.njk | 20 ++++ ...025-03-01-PPoPP-programming competition.md | 25 ++++ src/events/events.11tydata.js | 8 ++ src/events/events.json | 13 +++ src/events/get-started-spe.md | 9 ++ src/events/instructors.md | 9 ++ src/{community => events}/join-us.md | 0 src/events/share-your-research.md | 11 ++ .../teach performance.md | 0 src/events/teach-spe.md | 9 ++ src/get_involved.njk | 23 ++++ src/get_involved/get-started-spe.md | 9 ++ src/get_involved/get_involved.11tydata.js | 8 ++ src/get_involved/get_involved.json | 13 +++ src/get_involved/instructors.md | 9 ++ src/get_involved/join-us.md | 43 +++++++ src/get_involved/share-your-research.md | 11 ++ src/get_involved/teach performance.md | 110 ++++++++++++++++++ src/get_involved/teach-spe.md | 9 ++ 29 files changed, 412 insertions(+), 219 deletions(-) create mode 100644 src/about/about_fastcode.md create mode 100644 src/about/about_spe.md delete mode 100644 src/community.md delete mode 100644 src/community/community.11tydata.js delete mode 100644 src/community/community.json delete mode 100644 src/events.md create mode 100644 src/events.njk create mode 100644 src/events/2025-03-01-PPoPP-programming competition.md create mode 100644 src/events/events.11tydata.js create mode 100644 src/events/events.json create mode 100644 src/events/get-started-spe.md create mode 100644 src/events/instructors.md rename src/{community => events}/join-us.md (100%) create mode 100644 src/events/share-your-research.md rename src/{community => events}/teach performance.md (100%) create mode 100644 src/events/teach-spe.md create mode 100644 src/get_involved.njk create mode 100644 src/get_involved/get-started-spe.md create mode 100644 src/get_involved/get_involved.11tydata.js create mode 100644 src/get_involved/get_involved.json create mode 100644 src/get_involved/instructors.md create mode 100644 src/get_involved/join-us.md create mode 100644 src/get_involved/share-your-research.md create mode 100644 src/get_involved/teach performance.md create mode 100644 src/get_involved/teach-spe.md diff --git a/src/_data/metadata.json b/src/_data/metadata.json index 84999e8c..f75dfd7d 100644 --- a/src/_data/metadata.json +++ b/src/_data/metadata.json @@ -1,5 +1,5 @@ { - "tagline": "An integrated open-source ecosystem for teaching software performance engineering", + "tagline": "An open-source community dedicated to advancing software performance engineering", "author": "The Fastcode Team", "email": "contact@fastcode.org", "attribution": { diff --git a/src/_includes/posts_cards.njk b/src/_includes/posts_cards.njk index 9b277ab7..01975bc3 100644 --- a/src/_includes/posts_cards.njk +++ b/src/_includes/posts_cards.njk @@ -4,7 +4,9 @@

{{ post.data.title }}

-
{{ post.data.date | readableDate }} — By {{ post.data.author }}
+ {% if post.data.date %} +
{{ post.data.date | readableDate }} — By {{ post.data.author }}
+ {% endif %} {% if post.data.tagline %}

{{ post.data.tagline | markdownify | safe }}

{% endif %} @@ -16,7 +18,9 @@
- + {% if post.data.image %} + + {% endif %}
diff --git a/src/about.md b/src/about.md index f76d8e75..5c24a927 100644 --- a/src/about.md +++ b/src/about.md @@ -1,60 +1,9 @@ --- -layout: layouts/page.njk -stylesheet: None -background: bg-white -sidebar: toc -title: About eleventyNavigation: key: About parent: Home order: 1 -date: 2022-07-05T16:59:41.487Z + url: /about/about_spe/ --- -{% alert "note", "Our mission:" %} -OpenCilk aims to make it easy for developers to write fast and correct multicore code, for researchers to pioneer technologies to do so, and for educators to teach and students to learn software performance engineering. -{% endalert %} -## Leadership - -
- -* [Tao B. Schardl](http://web.mit.edu/neboat/www) (MIT), Director, Chief Architect -* [I-Ting Angelina Lee](http://www.cse.wustl.edu/~angelee/) (WUSTL), Director, Runtime Architect -* John Carr, Senior Programmer -* Dorothy Curtis (MIT), Project Manager -* Bruce Hoppe, Documentation Specialist and Outreach Coordinator -* [Charles E. Leiserson](https://people.csail.mit.edu/cel/) (MIT), Executive Director -
- -## Contributors - -
- -* [Alexandros Iliopoulos](https://www.csail.mit.edu/person/alexandros-stavros-iliopoulos) (MIT) -* [Timothy Kaler](https://www.csail.mit.edu/person/timothy-kaler) (MIT) -* Matthew Kilgore -* Billy Moses (MIT) -* Kyle Singer (WUSTL) -* Daniele Vettorel (Google) -* Grace Yin -* Brian Wheatman (JHU) -
- -## Academic board - -
- -* [I-Ting Angelina Lee](http://www.cse.wustl.edu/~angelee/) (WUSTL) -* [Charles E. Leiserson](https://people.csail.mit.edu/cel/) (MIT) -* [Marc Moreno Maza](http://www.csd.uwo.ca/~moreno/) (UWO) -* [John Owens](https://www.ece.ucdavis.edu/~jowens/) (UCD), Chair -* [Vivek Sarkar](https://vsarkar.cc.gatech.edu) (GATECH) -* [Tao B. Schardl](http://neboat.mit.edu/) (MIT) -
- - -## Acknowledgments - -OpenCilk is supported in part by the United States Air Force Research Laboratory and the United States Air Force Artificial Intelligence Accelerator and was accomplished under Cooperative Agreement Number FA8750-19-2-1000; in part by the Department of Energy, National Nuclear Security Administration, under Award Number DE-NA0003965; and in part by the National Science Foundation under Grant No. 1925609. - -The views and conclusions contained in this document are those of the authors and should not be interpreted as representing the official policies, either expressed or implied, of the United States Air Force, the Department of Energy, the National Science Foundation, or the U.S. Government. The U.S. Government is authorized to reproduce and distribute reprints for Government purposes notwithstanding any copyright notation herein. Neither the United States Government nor any agency thereof, nor any of their employees, makes any warranty, express or implied, or assumes any legal liability or responsibility for the accuracy, completeness, or usefulness of any information, apparatus, product, or process disclosed, or represents that its use would not infringe privately owned rights. Reference herein to any specific commercial product, process, or service by trade name, trademark, manufacturer, or otherwise does not necessarily constitute or imply its endorsement, recommendation, or favoring by the U.S. Government or any agency thereof. The views and opinions expressed on this website do not necessarily state or reflect those of the United States Government or any agency thereof. \ No newline at end of file +Dummy install puts "About" in navbar as a link to the about SPE page \ No newline at end of file diff --git a/src/about/about_fastcode.md b/src/about/about_fastcode.md new file mode 100644 index 00000000..d10cc4c8 --- /dev/null +++ b/src/about/about_fastcode.md @@ -0,0 +1,14 @@ +--- +layout: layouts/page.njk +stylesheet: None +background: bg-white +sidebar: toc +title: About Fastcode +eleventyNavigation: + key: About Fastcode + parent: About + order: 2 +date: 2022-07-05T16:59:41.487Z +--- + +about fastcode \ No newline at end of file diff --git a/src/about/about_spe.md b/src/about/about_spe.md new file mode 100644 index 00000000..36bfa5c8 --- /dev/null +++ b/src/about/about_spe.md @@ -0,0 +1,47 @@ +--- +layout: layouts/page.njk +stylesheet: None +background: bg-white +sidebar: toc +title: About software performance engineering (SPE) +eleventyNavigation: + key: About SPE + parent: About + order: 1 +date: 2022-07-05T16:59:41.487Z +--- +{% alert "note", "Software performance engineering (SPE):" %} +Making software run fast or otherwise consume few resources such as time, storage, energy, network bandwidth, etc. +{% endalert %} + +## A field whose time has come (again) + +For over five decades, software developers enjoyed "free" performance gains thanks to Moore's Law. But no more! + +Since 2018 (or so), developers have had to "work" for performance gains, which no longer come for free from the chip-makers. Of all the ways to improve application performance -- e.g., hardware architecture, algorithms -- software performance engineering is by far the least inexpensive and most accessible. + +## Notable techniques of SPE +- parallelism +- vectorization +- caching +- algorithms +- data structuring +- compiler optimization +- and more. + +## Notable tools of SPE +- high-resolution timers +- performance profilers +- memory analyzers +- scalability analyzers +- race detectors +- and more. + +## Theoretical foundations of SPE +- task-parallel scheduling +- work/span analysis +- reuse distance +- cache-oblivious algorithms +- data structures +- and more. + diff --git a/src/blog.njk b/src/blog.njk index ea4aa57a..c7894b50 100644 --- a/src/blog.njk +++ b/src/blog.njk @@ -9,6 +9,9 @@ eleventyNavigation: order: 7 parent: Home --- +{% alert "note", "Software performance engineering (SPE):" %} +Making software run fast or otherwise consume few resources such as time, storage, energy, network bandwidth, etc. +{% endalert %}

Performance engineering: making software run fast or otherwise consume few resources, such as time, storage, energy, network bandwidth, etc.

diff --git a/src/community.md b/src/community.md deleted file mode 100644 index 2c13ce4e..00000000 --- a/src/community.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -layout: layouts/page.njk -stylesheet: None -background: bg-white -sidebar: toc -title: Get involved -eleventyNavigation: - key: Get involved - parent: Home - order: 5 ---- -{% alert "note", "Part of Fastcode" %} -The OpenCilk team is part of Fastcode, an open-source community dedicated to advancing software performance engineering -- making software run fast or otherwise consume few resources such as time, storage, and energy. [Join us](/community/join-us)! -{% endalert %} - -## Where can I get help? - -### StackOverflow -The best way to get help is by posting on [StackOverflow](https://stackoverflow.com/) with the #cilk tag. - -### GitHub Issues -To report bugs and most feature requests, use GitHub Issues in the appropriate repository: - -- [here](https://github.com/OpenCilk/opencilk-project/issues) for software -- [here](https://github.com/OpenCilk/www.opencilk.org/issues) for documentation. - -### GitHub Discussions -To subscribe to announcements and have longer discussions, -use [GitHub Discussions](https://github.com/OpenCilk/opencilk-project/discussions) in the [OpenCilk Project](https://github.com/OpenCilk/opencilk-project) repository. - -## Conferences -Below are the academic conferences traditionally most popular with the OpenCilk community. Many of them include tutorial days with sessions on OpenCilk. -{% for conf in conferences %} - - [{{ conf.shortName }}]({{ conf.url }}) -{% endfor %} - -See also: **[Contribute](/contribute)**. \ No newline at end of file diff --git a/src/community/community.11tydata.js b/src/community/community.11tydata.js deleted file mode 100644 index 9fd586d9..00000000 --- a/src/community/community.11tydata.js +++ /dev/null @@ -1,54 +0,0 @@ -require('dotenv').config(); - -const isDevEnv = process.env.ELEVENTY_ENV === 'development'; -const todaysDate = new Date(); - -function showDraft(data) { - const isDraft = 'draft' in data && data.draft !== false; - const isFutureDate = data.page.date > todaysDate; - return isDevEnv || (!isDraft && !isFutureDate); -} - -module.exports = function() { - return { - eleventyComputed: { - eleventyExcludeFromCollections: function(data) { - if(showDraft(data)) { - return data.eleventyExcludeFromCollections; - } - else { - return true; - } - }, - permalink: function(data) { - if(showDraft(data)) { - return data.permalink - } - else { - return false; - } - }, - eleventyNavigation: { - key: function(data) { - if(showDraft(data)) { - return data.title - } - else { - return false; - } - } - }, - sidebar: function(data) { - return 'toc'; - }, - background: function(data) { - if(('draft' in data && data.draft !== false) || (data.page.date > todaysDate)) { - return 'text-white bg-info' - } - else { - return 'bg-white'; - } - } - } - } -} \ No newline at end of file diff --git a/src/community/community.json b/src/community/community.json deleted file mode 100644 index 88e7b2fa..00000000 --- a/src/community/community.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "layout": "layouts/page.njk", - "background": "bg-white", - "permalink": "/community/{{ page.fileSlug | slugify }}/", - "eleventyNavigation": { - "parent": "Get involved" - } -} \ No newline at end of file diff --git a/src/events.md b/src/events.md deleted file mode 100644 index 6df9a371..00000000 --- a/src/events.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -layout: layouts/page.njk -stylesheet: None -background: bg-white -sidebar: toc -title: Contact us -eleventyNavigation: - key: Contact us - parent: Home - order: 8 ---- -{% alert "note", "Part of Fastcode" %} -The OpenCilk team is part of Fastcode, an open-source community dedicated to advancing software performance engineering -- making software run fast or otherwise consume few resources such as time, storage, and energy. [Join us](/community/join-us). -{% endalert %} - -The OpenCilk project welcomes your expertise and enthusiasm. A few specific opportunities are listed below. If you see anything interesting, or have ideas that we haven't thought of, please [contact us](/contribute/contact/). - -## Teaching - -{% imgLeft "/img/owl.png", "60px" %} -Are you teaching with OpenCilk? - -We hope you'll join our [community of educators](/community/teach-performance) who are developing resources for teaching topics in software performance engineering. - -## Documenting -Are you doing something with performance engineering that you want people to hear about? Are you writing how-tos or tutorials to help students with OpenCilk? We would love to hear! Have you prepared a presentation, video, or other educational materials about OpenCilk? Let us know! If you’re unsure where to start or how your skills fit in, [reach out](/contribute/contact/)! - -## Open projects -We are looking for people to help us with several OpenCilk projects, including develping an OpenCilk language server, improving Cilksan reporting, and fixing relevant debuggers to interface properly with the OpenCilk runtime system. See [open projects](./open-projects) for more. - -## Testing -We are interested in your experiences or issues in installing and writing code and running OpenCilk programs. -We are also interested in collecting performance figures for different computer systems. -- Please report compiler bugs at https://github.com/OpenCilk/opencilk-project/issues -- Please report runtime bugs at https://github.com/OpenCilk/cheetah/issues -- Please report website and documentation bugs at https://github.com/OpenCilk/www.opencilk.org/issues - -## Porting and scripting -You can help by porting OpenCilk to other platforms, and writing scripts to automate release testing. - -## Coding -Want to customize your own compiler or runtime environment? Check out OpenCilk code that's maintained in these GitHub repositories: - -- [Infrastructure](https://github.com/OpenCilk/infrastructure): OpenCilk build scripts and instructions reside here. (See also the [Build from source](/doc/users-guide/build-opencilk-from-source/) page.) -- [OpenCilk project](https://github.com/OpenCilk/opencilk-project): Forked from [LLVM](https://github.com/llvm/llvm-project), the compiler code resides here. -- [Cheetah](https://github.com/OpenCilk/cheetah): Code for the runtime system resides here. -- [Productivity tools](https://github.com/OpenCilk/productivity-tools): Code for Cilksan, Cilkscale, and other tools lives here. - -In addition to developing the OpenCilk codebase, we need your help extending existing code libraries to run in parallel with OpenCilk. Notable opportunities include the C++ Standard Template Library (STL) and the [GraphBLAS](https://graphblas.org/) Graph Linear Algebra API. Also improving the productivity tools. - -## Postdoc Positions - -The Supertech research group in the MIT Computer Science and Artificial Intelligence Laboratory seeks multiyear Postdoctoral Associates to join the OpenCilk development team led by Professor Charles E. Leiserson, Dr. Tao B. Schardl, and Research Scientist Dorothy Curtis. The open-source OpenCilk software platform, a new implementation of the Cilk parallelprogramming platform, will feature a superior compiler based on the Tapir/LLVM compiler (Best Paper, PPoPP 2017), a new work-stealing runtime system, and a suite of parallelprogramming productivity tools. Candidates should be recent Ph.D. graduates in computer science and engineering with excellent C/C++ programming skills and publications in one or more of the following areas: -- parallel computing (particularly multicore); -- language runtime systems and compilers (especially LLVM); -- software productivity tools; -- user interface design and implementation; -- software performance engineering (writing fast code); -- algorithms and data structures; -- software engineering, testing, benchmarking, and/or release management; -- cloud environments and operating systems. - -Please see additional details here: -[PostdocFlyer.pdf](https://github.com/OpenCilk/www.opencilk.org/files/8886546/PostdocFlyer.pdf) \ No newline at end of file diff --git a/src/events.njk b/src/events.njk new file mode 100644 index 00000000..c14e1e31 --- /dev/null +++ b/src/events.njk @@ -0,0 +1,20 @@ +--- +title: Events +layout: layouts/page.njk +background: bg-white +sidebar: toc +permalink: /events/ +eleventyNavigation: + key: Events + order: 7 + parent: Home +--- + + diff --git a/src/events/2025-03-01-PPoPP-programming competition.md b/src/events/2025-03-01-PPoPP-programming competition.md new file mode 100644 index 00000000..89e3fdb2 --- /dev/null +++ b/src/events/2025-03-01-PPoPP-programming competition.md @@ -0,0 +1,25 @@ +--- +title: PPoPP programming competition +tagline: Sign up now! +author: Bruce Hoppe +date: 2024-09-07 +image: /img/random-work-steal.png +tags: competition +--- + +## Abstract + +OpenCilk (http://opencilk.org) is a new open-source platform to support task-parallel programming in C/C++, aimed primarily at researchers and teachers of parallel computing. OpenCilk provides a full-featured implementation of Cilk, including a compiler based on the award-winning Tapir/LLVM and a streamlined runtime system based on Cheetah, as well as integrated tools, including the Cilksan race detector and the Cilkscale scalability analyzer. OpenCilk features a componentized design that makes it easy for compiler writers to add parallelism to their own languages, experiment with new runtime systems, and create custom dynamic-analysis tools for parallel productivity. + +The first half of the tutorial overviews the OpenCilk project. It provides details about the OpenCilk architecture, specifically its componentized design that allows individual components to be repurposed by researchers and developers. The second half of the tutorial is a hands-on session. Participants use OpenCilk components to add parallelism to Kaleidoscope, a toy language that the LLVM project uses to introduce people to LLVM. They debug and analyze their addition using OpenCilk productivity tools. + +## Slides + +[![](/img/opencilk-pact-2021.png)](/img/opencilk-pact-2021.pdf) + +## Video + + \ No newline at end of file diff --git a/src/events/events.11tydata.js b/src/events/events.11tydata.js new file mode 100644 index 00000000..bfdd368a --- /dev/null +++ b/src/events/events.11tydata.js @@ -0,0 +1,8 @@ +module.exports = { + eleventyComputed: { + eleventyNavigation: { + key: data => data.title, + parent: 'Events' + }, + } + }; \ No newline at end of file diff --git a/src/events/events.json b/src/events/events.json new file mode 100644 index 00000000..d19b24e7 --- /dev/null +++ b/src/events/events.json @@ -0,0 +1,13 @@ +{ + "layout": "layouts/page.njk", + "sidebar": "toc", + "background": "bg-white", + "permalink": "/events/{{ page.fileSlug | slugify }}/", + "eleventyNavigation": { + "parent": "Get involved" + }, + "comments": false, + "tags": [ + "events" + ] +} \ No newline at end of file diff --git a/src/events/get-started-spe.md b/src/events/get-started-spe.md new file mode 100644 index 00000000..a8e1ccd9 --- /dev/null +++ b/src/events/get-started-spe.md @@ -0,0 +1,9 @@ +--- +layout: layouts/page.njk +sidebar: toc +title: Get started with SPE +eleventyNavigation: + key: Get started with SPE +--- + +asdf \ No newline at end of file diff --git a/src/events/instructors.md b/src/events/instructors.md new file mode 100644 index 00000000..b9f4da6f --- /dev/null +++ b/src/events/instructors.md @@ -0,0 +1,9 @@ +--- +layout: layouts/page.njk +sidebar: toc +title: Join the Fastcode instructors community +eleventyNavigation: + key: Instructors +--- + +circle of trust \ No newline at end of file diff --git a/src/community/join-us.md b/src/events/join-us.md similarity index 100% rename from src/community/join-us.md rename to src/events/join-us.md diff --git a/src/events/share-your-research.md b/src/events/share-your-research.md new file mode 100644 index 00000000..bd80ec01 --- /dev/null +++ b/src/events/share-your-research.md @@ -0,0 +1,11 @@ +--- +title: Share your research +tagline: The OpenCilk team presented the following tutorial at the SPAA 2020 tutorial session. +author: Bruce Hoppe +image: /img/eagle-and-owl.png +eleventyNavigation: + key: Share your research + order: 3 +--- + +blog ideas \ No newline at end of file diff --git a/src/community/teach performance.md b/src/events/teach performance.md similarity index 100% rename from src/community/teach performance.md rename to src/events/teach performance.md diff --git a/src/events/teach-spe.md b/src/events/teach-spe.md new file mode 100644 index 00000000..93d029b1 --- /dev/null +++ b/src/events/teach-spe.md @@ -0,0 +1,9 @@ +--- +layout: layouts/page.njk +sidebar: toc +title: Teach SPE with OpenCilk +eleventyNavigation: + key: Teach SPE +--- + +opencilk \ No newline at end of file diff --git a/src/get_involved.njk b/src/get_involved.njk new file mode 100644 index 00000000..32c632df --- /dev/null +++ b/src/get_involved.njk @@ -0,0 +1,23 @@ +--- +title: Get involved +layout: layouts/page.njk +background: bg-white +sidebar: toc +permalink: /get_involved/ +eleventyNavigation: + key: Get involved + order: 2 + parent: Home +--- +{% alert "note", "Software performance engineering (SPE):" %} +Making software run fast or otherwise consume few resources such as time, storage, energy, network bandwidth, etc. +{% endalert %} + + diff --git a/src/get_involved/get-started-spe.md b/src/get_involved/get-started-spe.md new file mode 100644 index 00000000..a8e1ccd9 --- /dev/null +++ b/src/get_involved/get-started-spe.md @@ -0,0 +1,9 @@ +--- +layout: layouts/page.njk +sidebar: toc +title: Get started with SPE +eleventyNavigation: + key: Get started with SPE +--- + +asdf \ No newline at end of file diff --git a/src/get_involved/get_involved.11tydata.js b/src/get_involved/get_involved.11tydata.js new file mode 100644 index 00000000..3212ce60 --- /dev/null +++ b/src/get_involved/get_involved.11tydata.js @@ -0,0 +1,8 @@ +module.exports = { + eleventyComputed: { + eleventyNavigation: { + key: data => data.title, + parent: 'Get involved' + }, + } + }; \ No newline at end of file diff --git a/src/get_involved/get_involved.json b/src/get_involved/get_involved.json new file mode 100644 index 00000000..5593985c --- /dev/null +++ b/src/get_involved/get_involved.json @@ -0,0 +1,13 @@ +{ + "layout": "layouts/page.njk", + "sidebar": "toc", + "background": "bg-white", + "permalink": "/get_involved/{{ page.fileSlug | slugify }}/", + "eleventyNavigation": { + "parent": "Get involved" + }, + "comments": false, + "tags": [ + "get_involved" + ] +} \ No newline at end of file diff --git a/src/get_involved/instructors.md b/src/get_involved/instructors.md new file mode 100644 index 00000000..b9f4da6f --- /dev/null +++ b/src/get_involved/instructors.md @@ -0,0 +1,9 @@ +--- +layout: layouts/page.njk +sidebar: toc +title: Join the Fastcode instructors community +eleventyNavigation: + key: Instructors +--- + +circle of trust \ No newline at end of file diff --git a/src/get_involved/join-us.md b/src/get_involved/join-us.md new file mode 100644 index 00000000..937f96cb --- /dev/null +++ b/src/get_involved/join-us.md @@ -0,0 +1,43 @@ +--- +layout: layouts/page.njk +sidebar: toc +title: Join Fastcode +eleventyNavigation: + key: Join Fastcode +--- + +The OpenCilk team is part of Fastcode, an open-source community dedicated to advancing software performance engineering (SPE) -- making software run fast or otherwise consume few resources such as time, storage, and energy. This survey invites you to become part of Fastcode and help guide next steps for the community. Results of the survey will be used to create a short summary report about opportunities in SPE community-building, which will be shared with respondents and used to promote activity and investment in SPE. Thanks for your input! + + +
+ + +
+
+
+
1. About your work (Check all that apply.)
3. Indicate your level of agreement with the following statements, where 0=strongly disagree and 10=strongly agree.

010
010
010
010
5. Which activities would be most interesting to you for SPE community-building? (Check all that apply.)
8. Do you grant permission to include your responses in a summary report on SPE?
+
+ + +
+ + Thank you! +
+
+ +

Intuit Mailchimp

+
+
+
+
+
+
diff --git a/src/get_involved/share-your-research.md b/src/get_involved/share-your-research.md new file mode 100644 index 00000000..bd80ec01 --- /dev/null +++ b/src/get_involved/share-your-research.md @@ -0,0 +1,11 @@ +--- +title: Share your research +tagline: The OpenCilk team presented the following tutorial at the SPAA 2020 tutorial session. +author: Bruce Hoppe +image: /img/eagle-and-owl.png +eleventyNavigation: + key: Share your research + order: 3 +--- + +blog ideas \ No newline at end of file diff --git a/src/get_involved/teach performance.md b/src/get_involved/teach performance.md new file mode 100644 index 00000000..439c635a --- /dev/null +++ b/src/get_involved/teach performance.md @@ -0,0 +1,110 @@ +--- +title: Teach performance +sidebar: toc +eleventyNavigation: + key: Teach performance + parent: Get involved + order: 1 +--- + +The end of Moore's Law makes software performance engineering a priority for modern computer-science curricula. +OpenCilk enables you to teach principles of multicore computing using a state-of-the-art task-parallel platform that is easy to learn. + +## List of classes and workshops + +To help you develop your own course or module on performance engineering, we are compiling a list of relevant classes and workshops with materials that you can adapt. Each listing includes links to basic materials (e.g., lecture PDFs). Additional materials (e.g., editable slide decks, and solutions for homeworks and quizzes) are often also available, as detailed below, when you [join the OpenCilk community](../join-us/). Do you have your own class or module to add to our list? Please [let us know](/contribute/contact/). + +{% alert "hint", "Click on a link below to jump to that section:" %} + +- Performance engineering of software systems + * [MIT 6.106](#mit-6.106) + * [UC Davis EEC 289Q](#uc-davis-eec-289q) +- [Modern algorithms workshop: parallel algorithms](#modern-algorithms-workshop:-parallel-algorithms) + +{% endalert %} + + +## Performance engineering of software systems + +### MIT 6.106 + +At MIT, _Performance Engineering of Software Systems_ is an upper-division undergraduate course with prerequisitess of introductory computer architecture, algorithms, and programming courses. Other faculty have adapted this material as an introductory graduate course. The class uses the C language with OpenCilk task-parallel extensions. Materials from Fall 2018 are available on [MIT Open CourseWare](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/), which includes 23 lectures (listed below), [10 homeworks](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/pages/assignments), [4 projects](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/pages/projects), [4 quizzes](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/pages/quizzes), and [practice problems](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/pages/recitation-problems) from selected recitations. + +#### Lectures + +1. Introduction & Matrix Multiplication ([PDF](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/mit6_172f18_lec1/), [video](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/lecture-1-intro-and-matrix-multiplication/)) +1. Bentley Rules for Optimizing Work ([PDF](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/mit6_172f18_lec2/), [video](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/lecture-2-bentley-rules-for-optimizing-work/)) +1. Bit Hacks ([PDF](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/mit6_172f18_lec3/), [video](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/lecture-3-bit-hacks/)) +1. Assembly Language and Computer Architecture ([PDF](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/mit6_172f18_lec4/), [video](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/lecture-4-assembly-language-computer-architecture/)) +1. C to Assembly ([PDF](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/mit6_172f18_lec5/), [video](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/lecture-5-c-to-assembly/)) +1. Multicore Programming ([PDF](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/mit6_172f18_lec6/), [video](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/lecture-6-multicore-programming/)) +1. Races and Parallelism ([PDF](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/mit6_172f18_lec7/), [video](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/lecture-7-races-and-parallelism/)) +1. Analysis of Multithreaded Algorithms ([PDF](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/mit6_172f18_lec8/), [video](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/lecture-8-analysis-of-multithreaded-algorithms/)) +1. What Compilers Can and Cannot Do ([PDF](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/mit6_172f18_lec9/), [video](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/lecture-9-what-compilers-can-and-cannot-do/)) +1. Measurement and Timing ([PDF](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/mit6_172f18_lec10/), [video](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/lecture-10-measurement-and-timing/)) +1. Storage Allocation ([PDF](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/mit6_172f18_lec11/), [video](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/lecture-11-storage-allocation/)) +1. Parallel Storage Allocation ([PDF](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/mit6_172f18_lec12/), [video](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/lecture-12-parallel-storage-allocation/)) +1. The Cilk Runtime System ([PDF](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/mit6_172f18_lec13/), [video](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/lecture-13-the-cilk-runtime-system/)) +1. Caching and Cache-Efficient Algorithms ([PDF](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/mit6_172f18_lec14/), [video](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/lecture-14-caching-and-cache-efficient-algorithms/)) +1. Cache-Oblivious Algorithms ([PDF](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/mit6_172f18_lec15/), [video](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/lecture-15-cache-oblivious-algorithms/)) +1. Nondeterministic Parallel Programming ([PDF](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/mit6_172f18_lec16/), [video](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/lecture-16-nondeterministic-parallel-programming/)) +1. Synchronization Without Locks ([PDF](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/mit6_172f18_lec17/), [video](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/lecture-17-synchronization-without-locks/)) +1. Domain Specific Languages and Autotuning ([PDF](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/mit6_172f18_lec18/), [video](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/lecture-18-domain-specific-languages-and-autotuning/)) +1. Leiserchess Codewalk ([PDF](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/mit6_172f18_lec19/), [video](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/lecture-19-leiserchess-codewalk/)) +1. Speculative Parallelism & Leiserchess ([PDF](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/mit6_172f18_lec20/), [video](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/lecture-20-speculative-parallelism-leiserchess/)) +1. Tuning a TSP Algorithm ([PDF](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/mit6_172f18_lec21/), [video](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/lecture-21-tuning-a-tsp-algorithm/)) +1. Graph Optimization ([PDF](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/mit6_172f18_lec22/), [video](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/lecture-22-graph-optimization/)) +1. High Performance in Dynamic Languages ([PDF](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/mit6_172f18_lec23/), [video](https://ocw.mit.edu/courses/6-172-performance-engineering-of-software-systems-fall-2018/resources/lecture-23-high-performance-in-dynamic-languages/)) + +MIT's course has a significant homework/project component. Enabling students to achieve high performance on project submissions is a significant goal of the course. MIT typically uses servers from commercial cloud providers (historically AWS) to accept project submissions and measure performance. +Recent projects have included rotating an image, parallelization of a physical simulation, and memory management. The traditional MIT capstone project is a bot that plays one side of a 2-player game, where optimized bot performance is a necessity for a competitive submission. + +[Join the OpenCilk community](../join-us/) for access to +- PowerPoint source for slides +- LaTeX source for homework and projects from a past course offering +- Reference code for homeworks and projects +- A library of past quiz and exam questions + +### UC Davis EEC 289Q + +John Owens adapted [MIT 6.106](#mit-6.106) to create _Performance Engineering of Software Systems_ at UC Davis. + +#### Lectures + +1. Intro and Matrix Multiplication ([PDF](https://ucdavis.box.com/s/lqbbzplf7cjo1dnxi8hon2pkjigest7n)) +2. Bentley Rules for Optimizing Work ([PDF](https://ucdavis.box.com/s/7asxi08fobekk6e1pkoo5r7zuyjrktrw)) +3. Bit Hacks ([PDF](https://ucdavis.box.com/s/xd10fgi2aslmjiv67q9uajuvh0srfvo8)) +4. Computer Architecture ([PDF](https://ucdavis.box.com/s/itjn1m2cu5czh4qhz5doin4bpbx0f515)) +5. C to Assembly ([PDF](https://ucdavis.box.com/s/n6nvroi4gyk2j0lswcn35eqp81g95bny)) +6. What Compilers Can and Cannot Do ([PDF](https://ucdavis.box.com/s/l9bq9sfkvl6oah88tpzio4hxsvqkmwp7)) +7. Multicore Programming ([PDF](https://ucdavis.box.com/s/hmc5zjo8bnojke8svj5gedyxgveuzh6r)) +8. Races and Parallelism ([PDF](https://ucdavis.box.com/s/h8z91f2t23qhpa976hbt4bnaf972avir)) +9. Analysis of Parallel Algorithms I ([PDF](https://ucdavis.box.com/s/o45xbyoaenzvcww8o0eb4v2o3dg3e9as)) +10. Analysis of Parallel Algorithms II ([PDF](https://ucdavis.box.com/s/etxfwg2l50gqxd40ydk0p8nnpxs9e6z4)) +11. Measurement and Timing ([PDF](https://ucdavis.box.com/s/aplokuj304hzc2qmdbp4w9auo7kb8uct)) +12. Cheetah -- Cilk Runtime ([PDF](https://ucdavis.box.com/s/6eb956s19hair2awfborukl1uk3rsvsz)) +13. Storage Allocation ([PDF](https://ucdavis.box.com/s/eb05vbh9ldem2txtmvbm7ov5r1xpxowz)) +14. Parallel Storage Allocation ([PDF](https://ucdavis.box.com/s/vbpz9zgc3qbbd34808wpjc88y77j9bo5)) +15. Cache-Efficient Algorithms ([PDF](https://ucdavis.box.com/s/11ojllbna5yfdvscm386vg4ne1nr2w17)) +16. Cache-Oblivious Algorithms ([PDF](https://ucdavis.box.com/s/2g6m7ztsj71w34j7m1u4x8dlm29h8x0e)) +17. Nondeterministic Parallel Programming ([PDF](https://ucdavis.box.com/s/8abgpbd67b35d8i2a2piflav2crndszs)) +18. Synchronization without Locks ([PDF](https://ucdavis.box.com/s/dohev283rm0p7iwtlclu849iigdhrrkj)) +19. Potpourri ([PDF](https://ucdavis.box.com/s/a98i1k7c70jg3tw9wdw9kj7xsexbgifx)) +20. Speculative Parallelism ([PDF](https://ucdavis.box.com/s/7px55i4u01kgem0xtq384aenmjm6u23y)) + +## Modern algorithms workshop: parallel algorithms + +Originally created in 2018 as a single full-day class, this workshop includes an introduction and 8 separate modules listed below. + +- Introduction ([PDF](https://ucdavis.box.com/s/8fhamacjnflkrlf8zfpkd2w6k8y9nh1n)) +- Cilk model ([PDF](https://ucdavis.box.com/s/dpth16i82wfj1hos846id9jlrlyghiks)) +- Detecting nondeterminism ([PDF](https://ucdavis.box.com/s/wp28q6ixdg9awsm5ffk7aee7py6zzl1d)) +- What Is parallelism? ([PDF](https://ucdavis.box.com/s/zjq7henchsbtxss1piz48qa22p0cvtkr)) +- Scheduling theory primer ([PDF](https://ucdavis.box.com/s/29jdmgjamnl1oa1umswvitx2i11gxn0p)) +- Analysis of parallel loops ([PDF](https://ucdavis.box.com/s/zja591gt7riw8fj3rv367jzx8odbxeag)) +- Case study: matrix multiplication ([PDF](https://ucdavis.box.com/s/v6iydl9hgk8evewihjngyd6i8fkvq95i)) +- Case study: Jaccard similarity ([PDF](https://ucdavis.box.com/s/1dtmh0m6w080f4tcnial1qdfgla73udg)) +- Post-Moore software ([PDF](https://ucdavis.box.com/s/35umq7ysmjjl1pq4u39zf7nhrlpsb43x)) + +[Join the OpenCilk community](../join-us/) for access to editable slide decks. + diff --git a/src/get_involved/teach-spe.md b/src/get_involved/teach-spe.md new file mode 100644 index 00000000..93d029b1 --- /dev/null +++ b/src/get_involved/teach-spe.md @@ -0,0 +1,9 @@ +--- +layout: layouts/page.njk +sidebar: toc +title: Teach SPE with OpenCilk +eleventyNavigation: + key: Teach SPE +--- + +opencilk \ No newline at end of file From 8ba3ea6708ec571ef16db4c2620897a40f379779 Mon Sep 17 00:00:00 2001 From: Bruce Hoppe Date: Mon, 9 Sep 2024 15:35:38 -0400 Subject: [PATCH 11/13] populated get-involved and events rough pages in place for get-involved and events sections, with links from the homepage carousel --- src/about/about_fastcode.md | 8 +- src/about/about_spe.md | 10 +- ...025-03-01-PPoPP-programming competition.md | 17 +-- src/events/events.json | 1 + src/events/get-started-spe.md | 9 -- src/events/instructors.md | 9 -- src/events/join-us.md | 43 ------- src/events/share-your-research.md | 11 -- src/events/teach-spe.md | 9 -- src/get_involved.njk | 5 +- src/get_involved/compete.md | 10 ++ src/get_involved/get-started-spe.md | 2 +- src/get_involved/get_involved.json | 1 + .../instructors-of-spe.md} | 15 ++- src/get_involved/instructors.md | 9 -- src/get_involved/share-your-research.md | 4 +- src/get_involved/teach -with-opencilk.md | 16 +++ src/get_involved/teach performance.md | 110 ------------------ src/get_involved/teach-spe.md | 9 -- src/index.njk | 18 +-- src/posts/posts.json | 1 + 21 files changed, 64 insertions(+), 253 deletions(-) delete mode 100644 src/events/get-started-spe.md delete mode 100644 src/events/instructors.md delete mode 100644 src/events/join-us.md delete mode 100644 src/events/share-your-research.md delete mode 100644 src/events/teach-spe.md create mode 100644 src/get_involved/compete.md rename src/{events/teach performance.md => get_involved/instructors-of-spe.md} (97%) delete mode 100644 src/get_involved/instructors.md create mode 100644 src/get_involved/teach -with-opencilk.md delete mode 100644 src/get_involved/teach performance.md delete mode 100644 src/get_involved/teach-spe.md diff --git a/src/about/about_fastcode.md b/src/about/about_fastcode.md index d10cc4c8..db42fe70 100644 --- a/src/about/about_fastcode.md +++ b/src/about/about_fastcode.md @@ -11,4 +11,10 @@ eleventyNavigation: date: 2022-07-05T16:59:41.487Z --- -about fastcode \ No newline at end of file +## An open-source community + +Fastcode is an open-source community dedicated to advancing software performance engineering (SPE) -- making software run fast or otherwise consume few resources such as time, storage, and energy. + +## Focusing on research and education + +To help get the community started, Fastcode has an "academic-first" strategy. By capturing the hearts and minds of students learning about parallel computing and software performance engineering, we can help software developers cope with the end of Moore’s Law. \ No newline at end of file diff --git a/src/about/about_spe.md b/src/about/about_spe.md index 36bfa5c8..a5e7544e 100644 --- a/src/about/about_spe.md +++ b/src/about/about_spe.md @@ -16,10 +16,18 @@ Making software run fast or otherwise consume few resources such as time, storag ## A field whose time has come (again) -For over five decades, software developers enjoyed "free" performance gains thanks to Moore's Law. But no more! +In the mid-20th century, when "computer" took its modern machine-based meaning, software performance engineering was a big deal. For example, the Apollo 11 missions used guidance computers with 4KB of RAM and 32KB hard disks. Getting astronauts to the moon and back under those constraints required serious brilliance from the engineers at NASA. + +Then, Moore's Law kicked in. "The number of transitiors per integrated circuit shall double every two years." For over five decades, software developers enjoyed "free" performance gains thanks to this windfall. + +But no more! Since 2018 (or so), developers have had to "work" for performance gains, which no longer come for free from the chip-makers. Of all the ways to improve application performance -- e.g., hardware architecture, algorithms -- software performance engineering is by far the least inexpensive and most accessible. +## OpenCilk + +For application developers to cope with the end of Moore's Law, they must embrace software performance engineering (SPE) and all its constituent technologies: parallel programming, vectorization, caching, algorithms, compiler optimization, etc. The OpenCilk task-parallel platform greatly simplifies parallel programming, arguably the most difficult of these technologies and the one with the greatest potential. But without a more general knowledge of SPE, programmers cannot effectively exploit the full capabilities of modern multicore computers. The Fastcode OSE for OpenCilk will enable researchers to advance our understanding of SPE and parallel programming, providing the next generation of researchers and software developers with principled and scientific foundations for obtaining application performance in the post-Moore era. + ## Notable techniques of SPE - parallelism - vectorization diff --git a/src/events/2025-03-01-PPoPP-programming competition.md b/src/events/2025-03-01-PPoPP-programming competition.md index 89e3fdb2..870f609c 100644 --- a/src/events/2025-03-01-PPoPP-programming competition.md +++ b/src/events/2025-03-01-PPoPP-programming competition.md @@ -7,19 +7,4 @@ image: /img/random-work-steal.png tags: competition --- -## Abstract - -OpenCilk (http://opencilk.org) is a new open-source platform to support task-parallel programming in C/C++, aimed primarily at researchers and teachers of parallel computing. OpenCilk provides a full-featured implementation of Cilk, including a compiler based on the award-winning Tapir/LLVM and a streamlined runtime system based on Cheetah, as well as integrated tools, including the Cilksan race detector and the Cilkscale scalability analyzer. OpenCilk features a componentized design that makes it easy for compiler writers to add parallelism to their own languages, experiment with new runtime systems, and create custom dynamic-analysis tools for parallel productivity. - -The first half of the tutorial overviews the OpenCilk project. It provides details about the OpenCilk architecture, specifically its componentized design that allows individual components to be repurposed by researchers and developers. The second half of the tutorial is a hands-on session. Participants use OpenCilk components to add parallelism to Kaleidoscope, a toy language that the LLVM project uses to introduce people to LLVM. They debug and analyze their addition using OpenCilk productivity tools. - -## Slides - -[![](/img/opencilk-pact-2021.png)](/img/opencilk-pact-2021.pdf) - -## Video - - \ No newline at end of file +The official landing page for the PPoPP programming competition: information, sign-ups. \ No newline at end of file diff --git a/src/events/events.json b/src/events/events.json index d19b24e7..28525167 100644 --- a/src/events/events.json +++ b/src/events/events.json @@ -1,5 +1,6 @@ { "layout": "layouts/page.njk", + "stylesheet": "none", "sidebar": "toc", "background": "bg-white", "permalink": "/events/{{ page.fileSlug | slugify }}/", diff --git a/src/events/get-started-spe.md b/src/events/get-started-spe.md deleted file mode 100644 index a8e1ccd9..00000000 --- a/src/events/get-started-spe.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -layout: layouts/page.njk -sidebar: toc -title: Get started with SPE -eleventyNavigation: - key: Get started with SPE ---- - -asdf \ No newline at end of file diff --git a/src/events/instructors.md b/src/events/instructors.md deleted file mode 100644 index b9f4da6f..00000000 --- a/src/events/instructors.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -layout: layouts/page.njk -sidebar: toc -title: Join the Fastcode instructors community -eleventyNavigation: - key: Instructors ---- - -circle of trust \ No newline at end of file diff --git a/src/events/join-us.md b/src/events/join-us.md deleted file mode 100644 index 937f96cb..00000000 --- a/src/events/join-us.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -layout: layouts/page.njk -sidebar: toc -title: Join Fastcode -eleventyNavigation: - key: Join Fastcode ---- - -The OpenCilk team is part of Fastcode, an open-source community dedicated to advancing software performance engineering (SPE) -- making software run fast or otherwise consume few resources such as time, storage, and energy. This survey invites you to become part of Fastcode and help guide next steps for the community. Results of the survey will be used to create a short summary report about opportunities in SPE community-building, which will be shared with respondents and used to promote activity and investment in SPE. Thanks for your input! - - -
- - -
-
-
-
1. About your work (Check all that apply.)
3. Indicate your level of agreement with the following statements, where 0=strongly disagree and 10=strongly agree.

010
010
010
010
5. Which activities would be most interesting to you for SPE community-building? (Check all that apply.)
8. Do you grant permission to include your responses in a summary report on SPE?
-
- - -
- - Thank you! -
-
- -

Intuit Mailchimp

-
-
-
-
-
-
diff --git a/src/events/share-your-research.md b/src/events/share-your-research.md deleted file mode 100644 index bd80ec01..00000000 --- a/src/events/share-your-research.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Share your research -tagline: The OpenCilk team presented the following tutorial at the SPAA 2020 tutorial session. -author: Bruce Hoppe -image: /img/eagle-and-owl.png -eleventyNavigation: - key: Share your research - order: 3 ---- - -blog ideas \ No newline at end of file diff --git a/src/events/teach-spe.md b/src/events/teach-spe.md deleted file mode 100644 index 93d029b1..00000000 --- a/src/events/teach-spe.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -layout: layouts/page.njk -sidebar: toc -title: Teach SPE with OpenCilk -eleventyNavigation: - key: Teach SPE ---- - -opencilk \ No newline at end of file diff --git a/src/get_involved.njk b/src/get_involved.njk index 32c632df..3e5ab872 100644 --- a/src/get_involved.njk +++ b/src/get_involved.njk @@ -9,9 +9,8 @@ eleventyNavigation: order: 2 parent: Home --- -{% alert "note", "Software performance engineering (SPE):" %} -Making software run fast or otherwise consume few resources such as time, storage, energy, network bandwidth, etc. -{% endalert %} + +Fastcode has many ways for you to contribute and get involved.
diff --git a/src/posts/posts.json b/src/posts/posts.json index 9498b485..1173b25e 100644 --- a/src/posts/posts.json +++ b/src/posts/posts.json @@ -1,5 +1,6 @@ { "layout": "layouts/post.njk", + "stylesheet": "none", "sidebar": "blog", "background": "bg-white", "comments": "true", From c22cba7438c90659982b16471462d33e99d6fe2d Mon Sep 17 00:00:00 2001 From: Bruce Hoppe Date: Tue, 10 Sep 2024 15:20:15 -0400 Subject: [PATCH 12/13] fancy teach-with-opencilk and more events and blog posts --- src/blog.njk | 6 +- src/events/2024-11-15-supercomputing.md | 14 ++ src/get_involved/teach -with-opencilk.md | 16 --- src/get_involved/teach -with-opencilk.njk | 120 ++++++++++++++++ src/img/sc-24.png | Bin 0 -> 42253 bytes ...22-05-20-what-the-is-parallelism-anyhow.md | 5 +- ...27-how-to-parallelize-your-own-language.md | 3 + ...-28-research-and-teaching-with-opencilk.md | 4 + ...09-10-the-computing-performance-paradox.md | 134 ++++++++++++++++++ .../docs/build/html/_static/css/custom.css | 3 + 10 files changed, 281 insertions(+), 24 deletions(-) create mode 100644 src/events/2024-11-15-supercomputing.md delete mode 100644 src/get_involved/teach -with-opencilk.md create mode 100644 src/get_involved/teach -with-opencilk.njk create mode 100644 src/img/sc-24.png create mode 100644 src/posts/2024-09-10-the-computing-performance-paradox.md diff --git a/src/blog.njk b/src/blog.njk index c7894b50..c57cd7c4 100644 --- a/src/blog.njk +++ b/src/blog.njk @@ -9,12 +9,10 @@ eleventyNavigation: order: 7 parent: Home --- -{% alert "note", "Software performance engineering (SPE):" %} -Making software run fast or otherwise consume few resources such as time, storage, energy, network bandwidth, etc. +{% alert "note", "Wanted: your SPE story" %} +Would you like to share your perspective on software performance engineering? Contact us, and let Fastcode promote your contributions to SPE. {% endalert %} -

Performance engineering: making software run fast or otherwise consume few resources, such as time, storage, energy, network bandwidth, etc.

-
+
-
-
- OpenCilk is an open-source software development infrastructure for task-parallel programming that allows for substantial code reuse and easy exploration of design choices in language abstraction, compilation strategy, runtime mechanism, and productivity tool development. -
-
- OpenCilk provides an ideal environment for developing fast code for applications that run on commodity and cloud multicore computers. It features a simple language, small codebase, and mathematically provable guarantees of good performance. -
-
-
-
-

Measure parallelism and maximize scalability with automated benchmarking

- With CilkScale you can ensure that your program scales up and down to make the most of any host system. -
-
-

Optimize your code with a compiler that KNOWS parallelism

- OpenCilk augments the “middle-end” of LLVM to represent parallel control flow and bring every LLVM optimization to bear on your parallelized code. -
-
-
- Join the community of OpenCilk educators to share teaching materials and learn about software performance engineering. -
-
+
+
+
+
+ OpenCilk is an open-source software development infrastructure for task-parallel programming that allows for substantial code reuse and easy exploration of design choices in language abstraction, compilation strategy, runtime mechanism, and productivity tool development. +
+
+ OpenCilk provides an ideal environment for developing fast code for applications that run on commodity and cloud multicore computers. It features a simple language, small codebase, and mathematically provable guarantees of good performance. +
+
+
+
+

Measure parallelism and maximize scalability with automated benchmarking

+ With CilkScale you can ensure that your program scales up and down to make the most of any host system. +
+
+

Optimize your code with a compiler that KNOWS parallelism

+ OpenCilk augments the of LLVM to represent parallel control flow and bring every LLVM optimization to bear on your parallelized code. +
+
+ +
+ Join the community of OpenCilk educators to share teaching materials and learn about software performance engineering. +
+ +
+
+