对于毕业生作业,我需要实现4个并行算法。我是并行算法的初学者,所以我不知道该学什么,我应该使用哪种技术(Threads,MPI,OpenMP,...)等。
为清楚起见,下面是其中一种算法的类似Pascal的伪代码。
procedure BROADCAST(D,N,A)
Step 1: Processor P1
(i) reads the value in D,
(ii) stores it in its own memory, and
(iii) writes it in A(1)
Step 2: for i = 0 to (logN - 1) do
for j = 2^i + 1 to 2^(i+1) do in parallel
Processor Pj
(i) reads the value in A(j - 2^i)
(ii) stores it in its own memory, and
(iii) writes it in A(j)
end for
end for
答案 0 :(得分:4)
以下是您建议的三种“方法”的简明概述:
线程:你可以很好地控制你的程序所做的事情,但是它带来了你自己处理所有簿记所需的成本(互斥量,信号量,确保没有死锁,...... )。当您有多个需要相互通信的线程时,这是一个不错的选择。但是,在您的情况下,您的所有线程基本上都会做同样的事情。此外,调试多线程程序非常困难,只要你认为你发现了所有的错误,另一个僵局就会变得丑陋。
MPI:这是一个在不同进程之间传递消息的库。因此,这对你在这里尝试做的事情并不是很好。但是,如果您想在计算机集群上并行化您的程序,那将是一种情况。然后需要在不同计算机上的进程之间传递数据。这就是MPI闪耀的地方。
OpenMP:一个非常方便的库,可以为您完成所有并行化(当然,您必须提供一些信息,但仍然无需担心死锁等)。无需办理任何簿记,图书馆会为您完成所有这些工作。 OpenMP的特别之处在于它适用于编译指示。您按顺序编写程序,测试它,然后添加一些#pragma
行,使用-fopenmp
标志(或您的特定编译器想要的任何标志)进行编译,然后执行:parallellized program。当你省略必要的编译器标志时,pragma将被忽略,这也是一个非常便携的解决方案。这对于希望通过并行化算法实现加速的程序非常有用,但实际上并不需要在独立线程之间传递数据。
我要做的是使用OpenMP,因为它非常非常容易使用,允许您在不对代码进行任何更改的情况下启用/禁用多线程,几乎可以为您完成所有操作并且运气良好包含在您的库中(至少对于GCC来说就是这种情况)。这是一个非常广泛的教程:https://computing.llnl.gov/tutorials/openMP。你可以在谷歌找到更多,互联网上充满了它们:)。
编辑:当然,没有什么可以阻止您同时使用这三种方法。如果你想创建一个多线程的分布式应用程序,它具有可以轻松并行化的算法实现,那正是你要做的。