# HPC **High-Performance Computing (HPC)** is the practice of extracting maximum computational power from available hardware. Write code that scales across multiple cores, optimize memory access patterns, and profile performance bottlenecks to maximize throughput. HPC spans multi-core CPUs, GPUs, and distributed clusters—from a laptop running OpenMP to supercomputers with thousands of nodes. HPC is fundamentally about hardware-software co-design. You can't optimize without understanding the machine: cache hierarchies, memory bandwidth, floating-point units, and communication latencies. It's not enough to parallelize; you must parallelize *efficiently* relative to the hardware underneath. ```bash # Compile OpenMP program $ gcc -O3 -fopenmp -o app app.c # Run with 4 threads $ OMP_NUM_THREADS=4 ./app # Profile with perf $ perf record ./app $ perf report ``` Performance scales across three dimensions: parallelism (use all cores), memory efficiency (minimize stalls), and communication (reduce latency and bandwidth waste). Most real bottlenecks live at the intersection of these. A fast algorithm on the wrong hardware, or perfect parallelism with pathological cache behavior, both fail. ## Concepts 1. [[hpc-hardware|Hardware architectures]] 2. [[hpc-parallelism|Parallelism models]] 3. [[openmp|OpenMP]] 4. [[mpi|MPI]] 5. [[cuda|CUDA]] 6. [[hpc-memory-hierarchy|Memory hierarchy]] 7. [[hpc-cache-optimization|Cache optimization]] 8. [[hpc-vectorization|Vectorization]] 9. [[hpc-profiling|Profiling]] 10. [[hpc-roofline-model|Roofline model]] 11. [[amdahls-law|Amdahl's law]] 12. [[hpc-communication-patterns|Communication patterns]] 13. [[hpc-load-balancing|Load balancing]] 14. [[hpc-numerical-libraries|Numerical libraries]] 15. [[hpc-cluster-computing|Cluster computing]] 16. [[hpc-debugging-distributed|Debugging distributed applications]] 17. [[hpc-performance-bottlenecks|Performance bottlenecks]] 18. [[hpc-heterogeneous-computing|Heterogeneous computing]]