分布式计算与通用图形处理器的多线程编程
1. MPI 编程潜在问题
在编写基于 MPI 的应用程序并在多核 CPU 或集群上执行时,可能遇到的问题与多线程代码类似。不过,MPI 还依赖网络资源的可用性。因为 MPI_Send
调用的发送缓冲区在网络栈处理完之前无法回收,且该调用是阻塞式的,发送大量小消息可能导致进程相互等待,从而引发死锁。
在设计 MPI 应用程序的消息结构时,应避免一侧出现大量发送调用的情况,还可以通过提供队列深度等反馈消息来缓解压力。此外,MPI 的同步机制(如 MPI_Barrier
)也存在问题,如果某个 MPI 进程无法同步,所有进程都会挂起。
2. 通用图形处理器计算(GPGPU)概述
近年来,使用显卡(GPU)进行通用计算(GPGPU)成为新趋势。借助 CUDA 和 OpenCL 等框架,能加速医学、军事和科学应用中大型数据集的并行处理。
2.1 GPGPU 与集群计算对比
集群系统中使用多个计算节点并行处理数据,普通 CPU 集群擅长标量任务(SISD),而 GPU 作为向量处理器,更适合单输入多数据(SIMD)任务。可以将一个大型数据集和单个任务描述发送给 GPU,其数百或数千个核心会并行处理数据的不同部分。
2.2 GPGPU 实现方式
最初编写 GPGPU 程序常用 GLSL 等着色器语言,后来出现了更多专业实现:
| 名称 | 起始时间 | 所有者 | 说明 |
| ---- | ---- | ---- | ---- |
| CUDA | 2