2012-09-10 29 views
0

嗨,我已經寫了一個MPI快速排序程序,它的工作原理是這樣的:P線程在MPI

在我的羣集「主」將分整數數據和發送這些爲「從節點」。在從節點上接收數據後,每個從機將執行單獨的排序操作,並將排序的數據發送回主機。 現在我的問題是我有興趣引入奴隸的超線程。

我有數據從主來

  1. 子(其表示所述陣列)
  2. 計數(數組的大小)

現在我已經初始化P線程爲其中

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); 
} 

我不明白我的方式是否正確。任何人都可以幫我解決這個問題嗎?

回答

0

你的基本思路是正確的,但你還需要確定你將如何得到的結果從線程回來。

通常情況下,您需要通過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是正常的,它確保它在繼續之前完成。根據您的要求,您可以讓每個線程直接將結果發送回主服務器,讓主函數收集每個線程的結果並將結果發送回工作線程外部。

0

您可以使用OpenMP而不是pthreads(僅用於記錄 - 將MPI與線程組合起來稱爲混合編程)。它是一組輕量級的編譯器編譯指示,可將順序代碼轉換爲並行代碼。幾乎所有的現代編譯器都支持OpenMP。藉助OpenMP,您可以引入所謂的並行區域。在並行區域開始時創建線程組,然後代碼繼續併發執行,直到並行區域結束,所有線程連接在一起,只有主線程繼續執行(線程創建和連接是邏輯的,例如它並不一定要在現實生活中這樣的實現,大多數實現實際使用線程池來加快線程的創建):

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

您可以使用omp_get_thread_num()平行塊內獲得的的ID線程並使其計算出不同的東西。或者您可以使用OpenMP的一個工作共享結構,如for,sections等,以使其自動分割工作。

OpenMP的最大優勢在於它不會對源代碼進行深度更改,它會將線程創建/加入摘要,因此您不必手動執行。大多數情況下,只需幾個編譯指示即可解決問題。然後,您必須在編譯期間啓用OpenMP(針對GCC的-fopenmp,針對Intel編譯器的-openmp,針對Sun/Oracle編譯器的-xopenmp等)。如果你沒有啓用OpenMP或者特定的編譯器不支持它,你會得到一個串行程序。

你可以在LLNL找到一個快速而全面的OpenMP教程。