【问题标题】:Parallelizing recursive function through MPI?通过 MPI 并行化递归函数?
【发布时间】:2013-12-07 22:14:01
【问题描述】:

我们可以使用 MPI 并行化递归函数吗? 我正在尝试并行化快速排序功能,但不知道它是否适用于 MPI,因为它是递归的。我也想知道我应该在哪里做并行区域。

// quickSort.c
#include <stdio.h>

void quickSort( int[], int, int);
int partition( int[], int, int);


void main() 
{
    int a[] = { 7, 12, 1, -2, 0, 15, 4, 11, 9};

    int i;
    printf("\n\nUnsorted array is:  ");
    for(i = 0; i < 9; ++i)
        printf(" %d ", a[i]);

    quickSort( a, 0, 8);

    printf("\n\nSorted array is:  ");
    for(i = 0; i < 9; ++i)
        printf(" %d ", a[i]);

}



void quickSort( int a[], int l, int r)
{
   int j;

   if( l < r ) 
   {
    // divide and conquer
        j = partition( a, l, r);
       quickSort( a, l, j-1);
       quickSort( a, j+1, r);
   }

}



int partition( int a[], int l, int r) {
   int pivot, i, j, t;
   pivot = a[l];
   i = l; j = r+1;

   while( 1)
   {
    do ++i; while( a[i] <= pivot && i <= r );
    do --j; while( a[j] > pivot );
    if( i >= j ) break;
    t = a[i]; a[i] = a[j]; a[j] = t;
   }
   t = a[l]; a[l] = a[j]; a[j] = t;
   return j;
}

如果有另一个更简单的快速排序代码,我也将不胜感激。

【问题讨论】:

    标签: recursion mpi


    【解决方案1】:

    嗯,从技术上讲,你可以,但恐怕这只会在 SMP 中有效。该数组是否适合单个节点?如果不是,那么您甚至无法执行快速排序的第一遍。

    如果您确实需要使用 MPI 在并行系统上对数组进行排序,您可能需要考虑使用合并排序(当然,在开始合并块之前,您仍然可以对每个节点的单个块使用快速排序) .

    如果您仍想使用快速排序,但对递归版本感到困惑,这里有一个非递归算法的草图,希望可以更容易地并行化,尽管它本质上是相同的:

    std::stack<std::pair<int, int> > unsorted;
    unsorted.push(std::make_pair(0, size-1));
    while (!unsorted.empty()) {
      std::pair<int, int> u = unsorted.top();
      unsorted.pop();
      m = partition(A, u.first, u.second);
    
      // here you can send one of intervals to another node instead of
      // pushing it into the stack, so it would be processed in parallel. 
      if (m+1 < u.second) unsorted.push(std::make_pair(m+1, u.second));
      if (u.first < m-1) unsorted.push(std::make_pair(u.first, m-1));
    }
    

    【讨论】:

      【解决方案2】:

      理论上,“任何事情”都可以使用 MPI 进行并行化,但请记住 MPI 本身并不进行任何并行化。它只是提供进程之间的通信层。只要您的所有发送和接收(或集体呼叫)匹配,它在大多数情况下都是正确的程序。话虽如此,使用 MPI 可能不是最有效的方法,具体取决于您的算法。如果您要对大量数据进行排序(超过一个节点的内存容量),那么使用 MPI 可能会很有效(在这种情况下,您可能想看看 RMA 章节)或一些其他可能使此类应用程序变得更简单的更高级别库(UPC、Co-array Fortran、SHMEM 等)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-12
        • 2014-09-24
        • 2023-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-02
        相关资源
        最近更新 更多