并行编程模型是作为对硬件和内存架构的抽象而存在的。
这些模式不是特定的,而且和机器的类型或者内存的架构无关。
它们在理论上能在任何类型的机器上实现。
没有最好的编程模型,模型的效果如何很大程序上取决于实际的问题。使用最广泛的并行编程模型有:
- 共享内存模型
- 多线程模型
- 分布式内存/消息传递模型
- 数据并行模型
共享内存模型
所有任务都共享一个内存空间,对共享资源的读写是异步的。系统提供一些机制,如锁和信号量,来让程序员控制共享内存的访问权限。
优点:
- 程序员不需要清楚任务之间通讯的细节。
缺点:
- 了解和管理数据区域变得更加困难
多线程模型
单个处理器可以有多个执行流程。(通常应用于共享内存架构中)
程序员性能往上多个线程同时修改相同的内存单元。现在的cpu可以在软件和硬件上实现多线程。
posix线程就是典型的软件层面上实现多线程的例子。
intel的超线程(hyper-threading)在硬件上实现多线程。(超线程技术是通过当一个线程在停止工地呼等IO时切换到另一个线程实现的。)
消息传递模型
常用在分布式内存系统(每一个处理都有独立的内存空间)
程序员需要确定并行和通过消息产生的数据交换。
数据并行模型
多个任务需要操作同一个数据结构,但每一个任务操作的数据是不同的部分。
在共享内存架构中,所有任务都通过共享内存来访问数据
在分布式内存构架中,则会将数据分割并且保存到每个任务的局部内存中。
程序员必须指定数据的分配方式和对单方式。
现在的GPU在数据已经对单的情况下运行的效率非常高