【问题标题】:Parallel Algorithm implementation advice并行算法实施建议
【发布时间】:2011-04-27 08:00:29
【问题描述】:

对于毕业作业,我需要实现 4 个并行算法。我完全是并行算法的初学者,所以我不知道该学习什么,我应该使用哪种技术(线程、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
  • D 是要在其中分布的数据 处理器。
  • N 是处理器计数。
  • A 是共享中长度为 N 的数组 记忆。

【问题讨论】:

    标签: multithreading algorithm parallel-processing implementation mpi


    【解决方案1】:

    以下是您建议的三种“方法”的非常简洁的概述:

    • 线程:您可以对程序的功能进行大量控制,但随之而来的是您需要自己处理所有簿记(互斥锁、信号量、确保没有死锁、... )。当您有多个需要相互通信的线程时,这是一个不错的选择。但是,在您的情况下,您的所有线程基本上都会做同样的事情。此外,调试多线程程序非常困难,当您认为自己找到了所有错误时,又一个死锁出现了。

    • MPI:这是一个在不同进程之间传递消息的库。因此,这对于您在这里尝试做的事情并不是很好。但是,如果您想在计算机集群上并行化您的程序。然后需要在不同计算机上的进程之间传递数据。这就是 MPI 大放异彩的地方。

    • OpenMP:一个非常方便的库,可以为你完成所有并行化(当然你必须给它一些信息,但仍然不需要担心死锁等)。无需做任何簿记,图书馆为您做这一切。 OpenMP 特别好的地方在于它可以与 pragma 一起使用。您按顺序对程序进行编码,对其进行测试,然后添加几行 #pragma 行,使用 -fopenmp 标志(或您的特定编译器想要的任何标志)进行编译,然后就可以了:并行程序。当您省略必要的编译器标志时,编译指示将被忽略,这也是一个非常便携的解决方案。这对于您希望通过并行化算法来加速但实际上不需要在独立线程之间传递数据的程序非常有用。

    我要做的是使用 OpenMP,因为它非常非常易于使用,允许您在不更改代码的情况下启用/禁用多线程,几乎可以为您完成所有工作,而且幸运的是,它已经包含在您的库中(至少对于 GCC 是这种情况)。这是一个相当广泛的教程:https://computing.llnl.gov/tutorials/openMP。您可以在 Google 上找到更多信息,互联网上到处都是 :)。

    编辑:当然,没有什么能阻止您同时使用这三种方法。如果你想创建一些多线程的分布式应用程序,它的算法实现很容易被并行化,这正是你会做的。

    【讨论】:

    • 另一方面,OpenMP 将实现 OP 的算法,这可能不是 OP 导师的想法。
    • 不错,没想到。在这种情况下,唯一合理的方法似乎是使用线程并手动确保一切正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多