# parallel_tasks_examples **Repository Path**: liudegui/parallel_tasks_examples ## Basic Information - **Project Name**: parallel_tasks_examples - **Description**: 嵌入式 Linux 并行模式示例:多线程/线程池/多进程共享内存/ZeroMQ - **Primary Language**: C++ - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-11-26 - **Last Updated**: 2026-02-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: Cpp, 并行计算, 嵌入式, Linux, 多线程 ## README # parallel_tasks_examples 基于 [newosp](https://github.com/DeguiLiu/newosp) 基础设施库的并行计算示例集合。本项目展示了在嵌入式 Linux 环境下,如何使用不同的并行模式(多线程、线程池、多进程共享内存、ZeroMQ)来加速计算密集型任务(矩阵乘法)。 ## 背景 虽然 ZMQ 功能强大,但在高频细粒度任务场景下(如 512x512 矩阵的行级并行),其序列化和通信开销往往成为瓶颈。 本问方案深度依赖 `newosp` 库,展示了以下核心特性: - **零拷贝 (Zero-Copy)**: 使用 POD 结构体和共享内存/全局内存,避免数据序列化。 - **无锁队列 (Lock-free)**: 使用 `osp::WorkerPool` 的 MPSC 无锁总线进行任务分发。 - **共享内存 IPC**: 使用 `osp::SharedMemorySegment` 实现多进程间的零拷贝协作。 ## 实现了哪些方案? 以 $C = A \times B$ 矩阵乘法为例,我们实现了 5 种方案: | 方案 | 源码 | 描述 | 适用场景 | |------|------|------|----------| | **Baseline** | `examples/baseline_matmul.cpp` | 单线程基准,无任何框架开销 | 性能对比基准 | | **Raw Thread** | `examples/bench_matmul.cpp` | `std::thread` + 原子计数器 (Work Stealing) | 极致性能,同构计算任务 | | **WorkerPool** | `examples/osp_thread_matmul.cpp` | `osp::WorkerPool` (MPSC 无锁总线) | 需要类型安全分发、生命周期管理的场景 | | **SHM Process**| `examples/osp_shm_matmul.cpp` | 多进程 + 共享内存 + 原子计数器 | 需要进程隔离、独立部署的场景 | | **ZeroMQ** | `examples/zmq_matmul.cpp` | `inproc://` 协议 (PUSH/PULL) | 跨语言、分布式网络通信 | ## 性能对比 (Benchmark) 测试环境: 512 x 512 float 矩阵, 64 线程/进程, Release -O3 构建。 | 方案 | 耗时 (ms) | 加速比 | 备注 | |------|-----------|--------|------| | **Single Thread** | 218.0 | 1.0x | 基准 | | **Raw Thread** | 8.6 | **25.4x** | 理论极限,几乎无额外开销 | | **newosp WorkerPool** | 17.4 | 12.5x | MPSC 队列和调度带来的少量开销,但在可接受范围内 | | **newosp SHM** | 17.4 | 12.5x | 进程创建开销被计算摊薄,效率与线程池相当 | | **ZeroMQ (inproc)** | >600.0* | <0.4x | *基于 128x128 规模推算,细粒度通信开销巨大 | > **ZMQ 的性能陷阱**: > 在 128x128 规模测试中,Baseline 耗时 2.6ms,而 ZMQ 耗时 42ms (慢 16 倍)。 > 说明在任务粒度极细(每行计算仅几微秒)时,ZMQ 的消息封装、互斥锁和信号机制带来的开销远大于计算本身。 > **并行计算不等于消息传递。** 对于细粒度任务,必须使用共享内存或无锁队列。 ## 构建与运行 依赖项 `newosp` 和 `libzmq` 会通过 CMake FetchContent 自动下载。 ```bash mkdir build && cd build # 开启 ZMQ 示例构建 cmake .. -DCMAKE_BUILD_TYPE=Release -DMATRIX_DIM=512 -DBUILD_ZMQ_EXAMPLE=ON make -j$(nproc) # 运行统一基准测试 (Baseline, Raw Thread, WorkerPool) ./bench_matmul # 运行多进程 SHM 示例 ./osp_shm_matmul # 运行 ZMQ 示例 ./zmq_matmul ``` ## 目录结构 - `src/matrix_task.hpp`: 核心数据结构 (POD),编译期维度配置 - `examples/`: 各方案的具体实现代码 - `CMakeLists.txt`: 构建脚本,集成 newosp 和 libzmq ## License MIT