4.2
4.2 Multicore Programming
Concept of Multicore Systems:
Historical Evolution: Single-CPU systems evolved into multi-CPU systems for better performance. The modern trend is placing multiple cores on a single chip.
Multicore Systems: A multicore system has multiple computing cores, each appearing as a separate CPU to the operating system.
Concurrency vs. Parallelism:
Concurrency: Multiple tasks making progress over time (e.g., tasks interleaved on a single-core system).
Parallelism: Multiple tasks executed simultaneously (e.g., tasks running on separate cores).
4.2.1 Programming Challenges for Multicore Systems
Key Challenges in Multicore Programming:
Identifying Tasks: Breaking applications into separate tasks that can run concurrently or in parallel on different cores.
Balance: Ensuring tasks are evenly distributed in terms of work and value to avoid inefficiencies in parallel execution.
Data Splitting: Dividing data appropriately for each task to run on separate cores without bottlenecks.
Data Dependency: Managing dependencies between tasks, ensuring proper synchronization when one task depends on another's data.
Testing and Debugging: The complexity of testing/debugging increases with parallel execution due to multiple possible execution paths.
Impact on Software Development:
The rise of multicore systems requires rethinking traditional software design.
Software developers and educators must focus on parallel programming and efficient use of multiple cores.
4.2.2 Types of Parallelism
Two Main Types of Parallelism:
Data Parallelism:
Involves distributing subsets of the same data across multiple cores.
Example: Summing elements of an array on a multi-core system. One thread sums the first half of the array, while another sums the second half.
Task Parallelism:
Involves distributing distinct tasks (threads) across multiple cores. Each thread performs a unique operation.
Example: Two threads performing different statistical operations on the same array of data.
Hybrid Parallelism:
Applications may use both data parallelism and task parallelism in a combined approach for optimal performance.
Summary of Multicore Programming:
Multicore programming is essential for leveraging modern hardware.
It involves challenges related to task identification, workload balance, data splitting, managing dependencies, and debugging.
Parallelism can be data-based (distributing data across cores) or task-based (distributing tasks across cores).