0

嗨,我写了一个 MPI 快速排序程序,它的工作原理是这样的:

在我的集群中,“主节点”将划分整数数据并将这些数据发送到“从节点”。在从节点接收后,每个从节点将执行单独的排序操作并将排序后的数据发送回主节点。现在我的问题是我有兴趣为奴隶引入超线程。

我有来自主人的数据

  1. sub(表示数组)
  2. 计数(数组的大小)

现在我已经将 Pthreads 初始化为 where

 num_threads=12.
    pthread_attr_init(&attr);
   pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
  for (i = 0; i < num_pthreads; i++) {
    if (pthread_create(&thread[i], &attr, new_thread, (void *) &sub[i])) 
    {
       printf("error creating a new thread \n");
       exit(1);
    }
    else
    {
        printf(" threading is successful %d  at node %d \n \t ",i,rank);
    }       

并在一个新的线程函数中

void * new_thread(int *sub)
{

    quick_sort(sub,0, count-1);
    }
    return(0);
}

我不明白我的方法是否正确。谁能帮我解决这个问题?

4

2 回答 2

0

您的基本想法是正确的,除了您还需要确定如何从线程中获取结果。

通常,您希望通过*arg参数 from传递线程的所有相关信息以完成其任务pthread_create。在您的new_thread()函数中,count变量没有传递给函数,因此在所有线程之间都是全局的。更好的方法是通过 from 传递指向结构的指针pthread_create

typedef struct {
    int *sub; /* Pointer to first element in array to sort, different for each thread. */
    int count; /* Number of elements in sub. */
    int done; /* Flag to indicate that sort is complete. */
} thread_params_t


void * new_thread(thread_params_t *params)
{
   quick_sort(params->sub, 0, params->count-1); 
   params->done = 1;
   return 0;
}

thread_params_t您将为生成的每个线程填写一个新线程。

另一个必须管理的项目是排序结果。主线程pthread_join在每个线程上执行 a 以确保它在继续之前已完成是正常的。根据您的要求,您可以让每个线程直接将结果发送回主线程,或者让主函数从每个线程收集结果并将结果发送回外部工作线程。

于 2012-09-10T13:25:27.003 回答
0

您可以使用 OpenMP 代替pthreads(仅作记录 - 将 MPI 与线程相结合称为混合编程)。它是一组轻量级编译器编译指示,可将顺序代码转换为并行代码。几乎所有现代编译器都支持 OpenMP。使用 OpenMP,您可以引入所谓的并行区域。在并行区域的开头创建了一组线程,然后代码继续并发执行,直到并行区域结束,所有线程都被加入,只有主线程继续执行(线程创建和加入是合乎逻辑的,例如它不必在现实生活中像这样实现,大多数实现实际上使用线程池来加速线程的创建):

#pragma omp parallel
{
   // This code gets executed in parallel
   ...
}

您可以omp_get_thread_num()在并行块内部使用来获取线程的 ID 并使其计算不同的东西。或者,您可以使用 OpenMP 的工作共享结构之一,如forsections等,使其自动划分工作。

OpenMP 的最大优点是不会对源代码进行深度更改,并且它抽象了线程的创建/连接,因此您不必手动进行。大多数情况下,您只需几个 pragma 就可以解决问题。然后您必须在编译期间启用 OpenMP(-fopenmp对于 GCC、-openmp对于 Intel 编译器、-xopenmp对于 Sun/Oracle 编译器等)。如果您不启用 OpenMP 或特定编译器不支持它,您将获得一个串行程序。

您可以在LLNL找到快速但全面的 OpenMP 教程。

于 2012-09-10T13:57:47.470 回答