# Concurrent Execution Doing work in parallel. pperl ships two distinct concurrency stories and they answer different questions: - **Auto-parallelization** — `pperl`’s runtime detects parallelisable patterns in ordinary Perl and spreads them across cores without any user-level threading. This is the preferred answer for CPU-bound loops over large data. - **Classical ithreads (partial support)** — Perl 5’s `threads` and `threads::shared` model. pperl’s support here is deliberately limited; many programs that historically used ithreads are better rewritten against the auto-parallel path. Start with the [decision chapter](alternatives.md) if you have an existing threaded program and are deciding how to port it; start with [parallel](parallel.md) if you are writing new code and want to understand when pperl speeds your loop up. * [Parallel Execution](parallel.md) * [How It Works](parallel.md#how-it-works) * [What Gets Parallelized](parallel.md#what-gets-parallelized) * [CLI Control](parallel.md#cli-control) * [Performance](parallel.md#performance) * [Limitations](parallel.md#limitations) * [How Reduction Detection Works](parallel.md#how-reduction-detection-works) * [Threads](threads.md) * [pperl status — read this first](threads.md#pperl-status-read-this-first) * [How this chapter is organised](threads.md#how-this-chapter-is-organised) * [Reference cross-links](threads.md#reference-cross-links)