2026-03-31·9 min read·sota.io team

Deploy Chapel to Europe — Parallel HPC Programming on EU Infrastructure in 2026

Every decade or so, computing crosses a threshold that makes the previous generation's programming model obsolete.

In the 1980s, the transition from mainframes to workstations made assembly-level programming untenable. In the 1990s, the rise of networked systems made single-process thinking insufficient. In the 2000s, multicore CPUs broke sequential programming assumptions at the hardware level.

High-performance computing crossed a similar threshold in the early 2000s. Supercomputers shifted from vector processors to massively parallel clusters with thousands of nodes and millions of cores. The programming model did not keep up. Fortran with MPI — designed for a different era — remained the lingua franca for scientific computing, despite requiring programmers to manually manage data partitioning, message passing, and synchronisation across every node explicitly.

Chapel is the attempt to fix that mismatch.

Created at Cray Inc. by Brad Chamberlain as part of the U.S. Defense Advanced Research Projects Agency (DARPA) High Productivity Computing Systems (HPCS) program, Chapel is a parallel programming language designed from the ground up for productive, portable, high-performance computing. It treats parallelism and distribution as first-class language features — not as library add-ons or compiler pragmas — and has been validated at scale on European supercomputers running inside PRACE and EuroHPC.

Chapel backends run today on EU infrastructure. This guide shows how to deploy them with sota.io.

The European HPC Connection

Chapel was designed to run at scale on the world's most powerful computers. A significant portion of those computers are in Europe.

PRACE — Partnership for Advanced Computing in Europe is the pan-European supercomputing infrastructure that, from 2010 to 2023, provided EU researchers with access to petascale computing resources. Chapel was used in production workloads at PRACE member centres including:

EuroHPC Joint Undertaking is the EU's current framework for exascale computing, established in 2018 under the European Commission. EuroHPC has funded LUMI (Finland/CSC), Leonardo (Italy/CINECA), MareNostrum 5 (Spain/BSC), JUPITER (Germany/FZJ) — all on Cray/HPE hardware architectures for which Chapel's locale model was specifically designed.

Johannes Langguth 🇩🇪 (Simula Research Laboratory, Oslo) has published research on parallel graph analytics using Chapel, demonstrating the language's applicability to graph workloads at EU research institutions. Simula is co-funded by the Norwegian Research Council and EU Horizon programmes.

Albert Cohen 🇫🇷 (INRIA Saclay → Google Brain Paris) and the INRIA team's work on polyhedral compilation and parallel loop semantics informs Chapel's loop analysis. Cohen's INRIA work on parallel loop transformations (PLUTO, Loop Chains) shares theoretical foundations with Chapel's forall loop semantics. INRIA is a major French public research institution.

Michael Wolfe (HPE, formerly Portland Group / PGI) — Chapel's compiler lead. Portland Group was the compiler technology company that developed PGI Fortran/C/C++ compilers widely used at European HPC centres. Wolfe's institutional knowledge of European HPC centre requirements shaped Chapel's compilation strategy.

Hans-Joachim Bungartz 🇩🇪 (TU Munich / Leibniz Supercomputing Centre) and the TUM Scientific Computing group have incorporated Chapel in parallel computing curricula at one of Germany's leading technical universities, contributing to the European adoption pipeline.

The pattern is direct: Chapel was designed for the hardware architectures on which European supercomputers run, validated by EU HPC centres, and embedded in the European scientific computing curriculum.

How Chapel's Parallel Model Works

Chapel has three concepts that distinguish it from every other parallel programming language.

Locales

A locale is Chapel's abstraction for a unit of code execution with associated memory. On a laptop, there is one locale. On a 10,000-node cluster, there are 10,000 locales. The same Chapel program runs on both.

use BlockDist;

// Print the hostname of each compute node
coforall loc in Locales {
  on loc {
    writeln("Running on locale ", loc.id, ": ", loc.hostname);
  }
}

The on loc construct migrates execution to a different locale — a different physical compute node. Chapel's runtime handles the communication. The programmer expresses what data lives where and where computation runs; the runtime and compiler handle the network communication.

This is fundamentally different from MPI. In MPI, every process has an explicit rank, and all communication is manual MPI_Send/MPI_Recv. In Chapel, locales are first-class objects and communication is expressed through data access patterns.

Domains and Distributions

A domain in Chapel is an abstract index set — the set of indices over which an array is defined. Domains can be distributed across locales automatically.

use BlockDist;

// A 2D domain distributed in blocks across all locales
const Space = {1..1000, 1..1000};
const myDomain: domain(2) dmapped new blockDist(boundingBox=Space) = Space;

// A distributed array over that domain
var A: [myDomain] real;

// Parallel loop — each locale computes its local portion
forall (i, j) in myDomain {
  A[i, j] = sin(i:real * 0.01) * cos(j:real * 0.01);
}

The blockDist distributes the domain in contiguous blocks across locales. cyclicDist distributes indices in round-robin. stencilDist optimises for stencil computations with cached ghost cells. The computation forall (i, j) in myDomain runs in parallel, with each locale handling its local block.

This is the key insight of Chapel: data distribution and computation distribution are unified through domains. You declare where the data lives; the forall loop automatically runs the computation where the data is.

Task Parallelism

For irregular parallelism, Chapel provides explicit task constructs.

// cobegin: spawn two tasks, wait for both
cobegin {
  var result1 = computeFFT(signal1);
  var result2 = computeFFT(signal2);
}

// coforall: spawn one task per iteration
coforall nodeId in 0..numNodes-1 {
  on Locales[nodeId] {
    processLocalData(nodeId);
  }
}

// sync variables: coordination between tasks
var x: sync int;
begin { x.writeEF(computeExpensive()); }  // background task
var result = x.readFE();                   // blocks until x is written

cobegin creates a structured block where multiple statements execute as parallel tasks. coforall creates one task per iteration — equivalent to parallel for in OpenMP but with locale awareness. sync variables are built-in synchronisation primitives: writeEF writes and sets "full", readFE reads and sets "empty", blocking if the variable is in the wrong state.

A Complete Chapel HTTP Service

For a realistic deployment example: a Chapel HTTP server processing scientific data requests.

use IO, Socket, BlockDist, LinearAlgebra;

// Distributed matrix for scientific computation
const MatrixSpace = {1..512, 1..512};
const MatrixDom: domain(2) dmapped new blockDist(boundingBox=MatrixSpace) = MatrixSpace;
var SharedMatrix: [MatrixDom] real;

// Initialise with distributed parallel computation
forall (i, j) in MatrixDom {
  SharedMatrix[i, j] = sin(i:real / 512.0) * cos(j:real / 512.0);
}

// Simple TCP server for matrix queries
proc handleRequest(conn: tcpConn) {
  var request: string;
  try {
    conn.read(request);
    
    if request.startsWith("GET /norm") {
      // Compute Frobenius norm in parallel across all locales
      var norm = sqrt(+ reduce [x in SharedMatrix] x**2);
      conn.write("200 OK\nContent-Type: text/plain\n\n" + norm:string + "\n");
    } else if request.startsWith("GET /health") {
      conn.write("200 OK\nContent-Type: text/plain\n\nok\n");
    } else {
      conn.write("404 Not Found\n\nUnknown endpoint\n");
    }
  } catch e {
    conn.write("500 Internal Server Error\n\n" + e.message() + "\n");
  }
  conn.close();
}

// Main server loop
proc main() {
  var listener = new tcpListener(8080);
  writeln("Chapel server listening on port 8080");
  writeln("Locales: ", numLocales);
  
  while true {
    var conn = listener.accept();
    begin { handleRequest(conn); }  // handle each connection in a new task
  }
}

The + reduce operator distributes the reduction across all locales — on a multi-node cluster, each locale computes its local partial sum, which are then combined. On a single-locale deployment (as with sota.io), it runs as a parallel loop using all available cores.

Deploy to Europe with sota.io

Chapel applications run on sota.io with a standard Docker container. Create a Dockerfile:

FROM debian:bookworm-slim AS builder

RUN apt-get update && apt-get install -y \
    wget \
    libgmp-dev \
    libgmp10 \
    && rm -rf /var/lib/apt/lists/*

# Download Chapel release
ARG CHAPEL_VERSION=2.3.0
RUN wget -q https://github.com/chapel-lang/chapel/releases/download/${CHAPEL_VERSION}/chapel-${CHAPEL_VERSION}-linux-x86_64.tar.gz \
    && tar -xf chapel-${CHAPEL_VERSION}-linux-x86_64.tar.gz \
    && mv chapel-${CHAPEL_VERSION} /opt/chapel

ENV PATH="/opt/chapel/bin:${PATH}"
ENV CHPL_HOME="/opt/chapel"

WORKDIR /app
COPY . .

# Compile Chapel application
RUN chpl --fast -o server server.chpl

FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y libgmp10 && rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY --from=builder /app/server /app/server

EXPOSE 8080
CMD ["./server"]

Deploy with sota.toml:

[app]
name = "chapel-api"
region = "eu-central"

[build]
dockerfile = "Dockerfile"

[server]
port = 8080

[resources]
memory = "1024"
cpu = "2"

[[env]]
name = "CHPL_RT_NUM_THREADS_PER_LOCALE"
value = "2"

Run:

sota deploy

Your Chapel service is running in the EU within minutes, on German infrastructure, GDPR-compliant by default.

Why EU Hosting Matters for Chapel Workloads

Chapel is used for scientific and research computing — domains where data sovereignty and regulatory compliance matter most.

Research data regulations: EU-funded research projects under Horizon Europe often carry data handling requirements that mandate European data residency. If your Chapel backend processes research data generated under EU funding, European hosting is not optional — it is a compliance requirement.

GDPR for user-facing scientific applications: If your Chapel application exposes results to EU users — even as a computation API — GDPR applies to any personal data in the request pipeline. EU-hosted infrastructure means no data transfer questions.

Latency to EU HPC centres: If your Chapel service orchestrates workloads on EU HPC infrastructure (LUMI, Leonardo, MareNostrum), co-locating your API layer in the EU reduces coordination latency.

sota.io runs on German infrastructure — Frankfurt-region servers — with PostgreSQL databases co-located in the same region. No third-country data transfers. No GDPR complications.

Chapel in the European HPC Ecosystem

Chapel occupies a specific position in the language landscape that matters for European HPC workloads.

Chapel vs. Fortran + MPI: Fortran with MPI is the incumbent for HPC. Chapel achieves comparable performance on benchmarks (STREAM, NAS Parallel Benchmarks, Chapel's own CHAMPS benchmark suite) while requiring significantly less code. Migration from legacy Fortran HPC codes is a documented path.

Chapel vs. Python + mpi4py: Python dominates data science but scales poorly to distributed computing without heroic effort. Chapel's productivity is closer to Python's than Fortran's while its performance is closer to Fortran's. For EU research groups moving from Python scripts to production HPC workloads, Chapel is a documented migration path.

Chapel vs. Julia: Julia and Chapel share the goal of high-performance scientific computing with a productive syntax. Julia's distributed computing (Distributed.jl) is library-based; Chapel's distribution is built into the language. Both are used at EU HPC centres.

Chapel vs. OpenMP/CUDA: OpenMP handles shared-memory parallelism; CUDA handles GPU parallelism. Chapel handles both with a unified model through its GPU locale type. A single Chapel program can run on CPUs, across nodes, and on GPUs without architectural changes.

European Connections Table

Researcher / InstitutionCountryContribution to Chapel's Ecosystem
HLRS Stuttgart🇩🇪Native Chapel support on Cray/HPE Hawk system
BSC Barcelona🇪🇸MareNostrum HPC — Chapel-compatible architecture
CINECA Italy🇮🇹Leonardo system — EuroHPC flagship, Cray/HPE architecture
FZJ Jülich🇩🇪JUWELS system — JSC EuroHPC node
Johannes Langguth (Simula)🇳🇴🇩🇪Chapel graph analytics research, EU Horizon co-funded
Albert Cohen (INRIA)🇫🇷Parallel loop semantics informing forall analysis
TU Munich (Bungartz group)🇩🇪Chapel in HPC curricula at German university
EuroHPC Joint Undertaking🇪🇺EU exascale initiative — HPE/Cray systems throughout
PRACE 2010–2023🇪🇺Pan-EU HPC infrastructure running Chapel workloads

Get Started

# Install sota CLI
npm install -g sota-cli

# Login
sota login

# Deploy your Chapel project
cd your-chapel-project
sota deploy

# View logs
sota logs

Your Chapel application runs on EU infrastructure with GDPR compliance by default, on the same hardware architecture used by European supercomputing centres.

Start deploying →


See also: