The Chapel Programming Language

Productive parallel computing at every scale.
writeln("Hello, world!");  // create a parallel task per processor core coforall tid in 0..<here.maxTaskPar do  writeln("Hello from task ", tid);  // print these 1,000 messages in parallel using all cores forall i in 1..1000 do  writeln("Hello from iteration ", i); 
// print a message per compute node coforall loc in Locales do  on loc do  writeln("Hello from locale ", loc.id);  // print a message per core per compute node coforall loc in Locales do  on loc do  coforall tid in 0..<here.maxTaskPar do  writeln("Hello from task ", tid, " on locale ", loc.id);  // print 1,000 messages in parallel using all nodes and cores use BlockDist; const Inds = blockDist.createDomain(1..1000); forall i in Inds do  writeln("Hello from iteration ", i, " running on locale ", here.id); 
use IO;  // read in a file containing 'city name;temperature' lines (1BRC-style) const stats = [line in stdin.lines()] new cityTemperature(line); writeln(stats);  record cityTemperature {  const city: string; // city name  const temp: real; // temperature   proc init(str: string) {  const words = str.split(";");  this.city = words[0];  this.temp = words[1]: real;  } } 
// set different values at runtime with command line arguments // e.g. --n=2048 --numSteps=256 --alpha=0.8 config const n = 1000,  numSteps = 100,  alpha = 1.0;  const fullDomain = {1..n},  interior = {2..n-1};  var u: [fullDomain] real = 1.0; u[n/4..3*n/4] = 2.0; // make the middle a bit hotter  var un = u;  for 1..numSteps {  forall i in interior do // shared-memory parallelism  u[i] = un[i] + alpha * (un[i-1] - 2*un[i] + un[i+1]);  un <=> u; // swap the two arrays }  writeln(un); 
use Random, Math;  const nGpus = here.gpus.size,  n = Locales.size*nGpus;  var A: [1..n, 1..n] real;  fillRandom(A);  // use all nodes coforall (loc, localRowStart) in zip(Locales, 1.. by nGpus) do on loc {  // and all GPUs within each  coforall (gpu, row) in zip(here.gpus, localRowStart..) do on gpu {  var B: [1..n] real = A[row, ..]; // copy a row from device to host  B = asin(B); // compute (kernel launch)  A[row, ..] = B; // copy the row back  } }  writeln(A); 

Users Love It

The use of Chapel worked as intended: the code maintenance is very much reduced, and its readability is astonishing. This enables undergraduate students to contribute to its development, something almost impossible to think of when using very complex software.

- Éric Laurendeau, Professor, Polytechnique Montréal

A lot of the nitty gritty is hidden from you until you need to know it. ... It feels like the complexity grows as you get more comfortable -- rather than being hit with everything at once.

- Tess Hayes, Developer, Bytoa

Chapel in Production

What’s New?

10 Myths About Scalable Parallel Programming Languages (Redux), Part 4: Syntax Matters

By Brad Chamberlain on July 23, 2025

The fourth archival post from the 2012 IEEE TCSC blog series with a current reflection on it

Continue reading

ChapelCon '25 CFP Released!

on June 26, 2025

ChapelCon '25 is coming this fall. Check out the webpage and the newly released CFP today.

Continue reading

Announcing Chapel 2.5!

By Brad Chamberlain, Michael Ferguson, Lydia Duncan, Jade Abraham, Ben Harshbarger, Daniel Fedorin on June 12, 2025

Highlights from the June 2025 release of Chapel 2.5

Continue reading

Paper and Presentation Refresh

on June 10, 2025

We've just completed a long-overdue refresh of Chapel-related papers and presentations from the past year or so

Continue reading

Public Weekly Deep-Dive / Demo Meeting Launched

on May 20, 2025

In addition to our weekly project meeting, we've now added a weekly meeting slot for deep-dive discussions and demos

Continue reading

Quarterly Newsletter - Spring 2025

on May 20, 2025

Our spring quarter newsletter is now available, covering recent and upcomign talks, new public project meetings, and more.

Continue reading