【问题标题】:Pthreads in MPIMPI 中的线程
【发布时间】:2012-09-03 07:56:15
【问题描述】:

您好,我编写了一个 MPI 快速排序程序,其工作原理如下:

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

我有来自 master 的数据

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

现在我已经将 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);
}

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

【问题讨论】:

    标签: pthreads mpi


    【解决方案1】:

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

    通常您希望通过来自pthread_create*arg 参数传递线程的所有相关信息以完成其任务。在您的 new_thread() 函数中,count 变量未传递给函数,因此在所有线程之间是全局的。更好的方法是从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 是正常的,以确保它在继续之前已经完成。根据您的要求,您可以让每个线程直接将结果发送回主线程,或者让主函数从每个线程收集结果并将结果发送回外部工作线程。

    【讨论】:

      【解决方案2】:

      您可以使用 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 教程。

      【讨论】:

        猜你喜欢
        • 2011-11-02
        • 1970-01-01
        • 2016-02-08
        • 2011-09-28
        • 2018-01-16
        • 2013-02-07
        • 2022-01-01
        • 2018-07-05
        相关资源
        最近更新 更多