parallel-computing
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| parallel-computing [June 13, 2026 at 03:13] – external edit 127.0.0.1 | parallel-computing [August 22, 2026 at 15:22] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| # Parallel computing | # Parallel computing | ||
| - | **Parallel computing** is a style of programming where a computation is broken into parts that run simultaneously across multiple processors, cores, or machines. The motivation is straightforward: | ||
| - | Not every program benefits equally. [[amdahls-law|Amdahl' | + | **[Parallel computing](https:// |
| - | ## Map of parallel computing | + | [[amdahls-law|Amdahl' |
| - | - [[openmp]] | + | ## Example |
| - | - [[mpi]] | + | |
| - | ## Three paradigms | + | This example shows a simple |
| - | + | ||
| - | Parallel computing splits into three broad paradigms based on where the parallelism lives. | + | |
| - | + | ||
| - | **Shared-memory parallelism** runs multiple threads on a single machine with a common address space. [[openmp|OpenMP]] is the standard approach in C, C++, and Fortran: a few `#pragma omp` directives turn a serial loop into a parallel | + | |
| - | + | ||
| - | **Distributed-memory parallelism** runs processes across separate machines (or separate address spaces on one machine), each with its own private memory. [[mpi|MPI]] is the dominant standard. Processes communicate explicitly by sending and receiving messages. There is no shared state to race on, but the programmer is responsible for every byte that crosses a process boundary. MPI is the backbone of large cluster workloads. | + | |
| - | + | ||
| - | **GPU parallelism** offloads | + | |
| - | + | ||
| - | ## Performance and correctness | + | |
| - | + | ||
| - | Parallel programs introduce failure modes that serial programs don't have: race conditions, deadlocks, false sharing, memory ordering issues. A race condition occurs when two threads read and write shared data without synchronization and the outcome depends on the order of execution. A deadlock occurs when two threads are each waiting for a lock the other holds. False sharing is a subtler hardware-level issue: two threads write to different variables that happen to sit in the same cache line, causing the cache coherence protocol to thrash. | + | |
| - | + | ||
| - | On the performance side, the [[roofline-model|roofline model]] is a useful frame for understanding whether a kernel is compute-bound or memory-bandwidth-bound, | + | |
| - | + | ||
| - | ## Practice | + | |
| - | + | ||
| - | The fastest way to see parallelism pay off is to compile the same program twice — once without threading, once with — and time both. Here is a parallel sum using OpenMP: | + | |
| ```c | ```c | ||
| - | // compile: gcc -O2 -fopenmp -o sum sum.c | + | // compile: gcc -fopenmp -o parallel parallel.c |
| - | // run: OMP_NUM_THREADS=4 | + | // run: ./parallel |
| - | // description: | + | // description: |
| #include < | #include < | ||
| #include < | #include < | ||
| - | int main(void) { | + | int main() { |
| - | | + | |
| - | | + | |
| - | #pragma omp parallel for reduction(+: | + | |
| - | for (long i = 0; i < n; i++) | + | int sum = 0; |
| - | sum += i; | + | #pragma omp parallel for reduction(+: |
| - | printf(" | + | for (int i = 0; i < 100; i++) { |
| + | sum += arr[i]; | ||
| + | } | ||
| + | | ||
| + | printf(" | ||
| return 0; | return 0; | ||
| } | } | ||
| ``` | ``` | ||
| - | |||
| - | Build and run both versions: | ||
| - | |||
| - | ```bash | ||
| - | $ gcc -O2 -o sum_serial sum.c | ||
| - | $ gcc -O2 -fopenmp -o sum_parallel sum.c | ||
| - | $ ./ | ||
| - | sum=499999999500000000 | ||
| - | $ OMP_NUM_THREADS=4 ./ | ||
| - | sum=499999999500000000 | ||
| - | ``` | ||
| - | |||
| - | The parallel version runs roughly 4× faster on 4 cores. The answer is identical — the `reduction(+: | ||
| - | |||
| - | ## Concepts | ||
| - | |||
| - | 1. [[amdahls-law|Amdahl' | ||
| - | 2. [[gustafsons-law|Gustafson' | ||
| - | 3. [[roofline-model|Roofline model]] | ||
| - | 4. [[openmp|OpenMP]] | ||
| - | 5. [[mpi|MPI]] | ||
| - | 6. [[saxpy|SAXPY]] | ||
| - | 7. [[semaphore|Semaphore]] | ||
| - | 8. [[lock-free-queue|Lock-free queue]] | ||
| - | 9. [[aba-problem|ABA problem]] | ||
| - | 10. [[trace-monoid|Trace monoid]] | ||
| - | 11. [[numbers-every-programmer-should-know|Numbers every programmer should know]] | ||
| - | |||
| - | ## Overview | ||
| - | |||
| - | ### Paradigms | ||
| - | |||
| - | ^ Paradigm ^ Memory model ^ API ^ Typical scale ^ | ||
| - | | Shared-memory | Common address space | [[openmp|OpenMP]], | ||
| - | | Distributed-memory | Private per process | [[mpi|MPI]] | Multi-node cluster | | ||
| - | | GPU | Host + device | CUDA, HIP, OpenCL | Single GPU | | ||
| - | | Hybrid | Mixed | MPI + OpenMP, MPI + CUDA | Multi-node + GPU | | ||
| - | |||
| - | ### Laws and models | ||
| - | |||
| - | ^ Name ^ Formula ^ What it predicts ^ | ||
| - | | [[amdahls-law|Amdahl' | ||
| - | | [[gustafsons-law|Gustafson' | ||
| - | | [[roofline-model|Roofline model]] | $\min(\pi, | ||
| - | |||
| - | ### Common failure modes | ||
| - | |||
| - | ^ Issue ^ Cause ^ Detection ^ | ||
| - | | Race condition | Concurrent unsynchronized read/write | Helgrind, ThreadSanitizer | | ||
| - | | Deadlock | Circular lock dependency | Missing progress; `gdb` `info threads` | | ||
| - | | False sharing | Two variables in the same cache line | `perf c2c`, cache miss counters | | ||
| - | | Load imbalance | Unequal work distribution | Per-thread time profile | | ||
| - | | Memory ordering | Relaxed atomics with wrong assumptions | Litmus tests; address and memory sanitizers | | ||
parallel-computing.1781320400.md.gz · Last modified: by 127.0.0.1
