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?

Transformers From Scratch in Chapel and C++, Part 1

By Thitrin Sastarasadhit on November 20, 2025

An implementation of a transformer using Chapel, comparing to C++ and PyTorch

Click for More

Chapel joins HPSF!

on November 17, 2025

Chapel is now an official project of the High Performance Software Foundation / Linux Foundation

Click for More

Quarterly Newsletter - November 2025

on November 13, 2025

A new quarterly newsletter is now available, covering SC25 events, updates from various talks, and more

Click for More

10 Myths About Scalable Parallel Programming Languages (Redux), Part 8: Striving Toward Adoptability

By Brad Chamberlain on November 12, 2025

The eighth and final archival post from the 2012 IEEE TCSC blog series, with a current reflection on it

Click for More

ChapelCon '25 Talks Available!

on November 10, 2025

ChapelCon '25 talk slides, code, and video are now available from the program page

Click for More

Chapel Featured on 'Technology Now' Podcast

on October 30, 2025

This week's 'Technology Now' podcast features a conversation about Chapel with Brad Chamberlain

Click for More