缺少"并行处理API的比较".如何选择多线程库?

cla*_*aws 6 parallel-processing multithreading multiprocessing

我正在使用短语Parallel ProcessingMulti Threading互换,因为我觉得它们之间没有区别.如果我错了请纠正我.

我不是并行处理/多线程的专家.我熟悉并使用.NET线程和POSIX线程.没有比这更好的了.

我只是在多线程浏览SO的档案,并惊讶地发现有很多用于多线程的库.

http://en.wikipedia.org/wiki/Template:Parallel_computing列出了众所周知的API(我不确定是否存在其他的)多线程库.

  1. POSIX线程
  2. OpenMP的
  3. PVM
  4. MPI
  5. UPC
  6. 英特尔线程构建模块
  7. Boost.Thread
  8. 全局数组
  9. 魅力++
  10. 的Cilk
  11. 共同阵列Fortran
  12. CUDA

此外,我很惊讶地看到http://en.wikipedia.org/wiki/Comparison_of_Parallel_Computing_Libraries_(API)丢失了.

直到现在,我从未遇到过需要在这些库之间进行选择的情况.但是,如果我遇到这种情况.

  1. 我该怎么选一个?
  2. 这些图书馆的优点和缺点是什么?
  3. 为什么我们有这么多的库来攻击单个问题?
  4. 哪一个是最好的?

min*_*ang 9

[1]并行库的正确选择取决于目标并行机的类型:(1)共享存储器(即多核)和(2)分布式存储器(即,单元,网格计算,CUDA).您还需要考虑所需的并行编程模型:(1)通用多线程应用程序,(2)循环级并行,(3)管道等高级并行,(4)数据级并行.

首先,共享存储器模型只是多线程编程,因为所有计算核心(例如,芯片多处理器和对称多处理器)上的地址空间是共享的.无需在线程和进程之间显式交换数据.OpenMP,Cilk,TBB都适合这个领域.

分布式存储器模型曾经是超级计算机的主要并行编程模型,其中每个单独的机器(即,地址空间不共享)通过紧密网络连接.MPI是最着名的编程模型.但是,此模型仍然存在,尤其是对于不共享内存地址空间的CUDA和基于单元的编程.例如,CUDA分离CPU的内存和GPU的内存.您明确需要在CPU内存和GPU内存之间发送数据.

接下来,您需要考虑并行编程模型.POSIX线程用于通用多线程编程(例如,高度多线程的Web服务器).但是,OpenMP非常适用于循环级并行,而不是一般的POSIX/Win32线程API.它简化了线程分叉和连接.英特尔TBB支持各种任务级并行,包括循环和流水线.您可以利用另一种并行性:数据级并行性.对于这个问题,GPGU将优于CPU,因为GPGPU专门用于数据并行工作负载.还有一种称为流处理的编程模型.

[2]我已在上面回答过.

[3]简单.有许多不同的并行/并发编程模型和不同的并行机器.所以,这不是一个单一的问题; 并行/并发编程中存在很多子问题,目前超级单一编程模型无法解决这些问题.

[4]这取决于.认真.