bitonic_sort using mpi in c

最近用mpi(消息傳遞接口,基於分佈式存儲機制的)實現了下bitonic_sort,理論上它的

時間複雜度只有O(lgn * lgn),但是需要用到n/2個比較器,,(從這裏可以發現,如果用串行實現,複雜度就是O(n*lgn*lgn))所以可擴展性非常的差,一般也就沒什麼實際意義,在目前的這種應用上。不過我還是根據自己對這個算法的理解,用mpi實現了一把,下面陳述之:
首先假設有n=2^d 個數待排序,如果n不是2的次方的話,也是ok的,不過某些個線程,

和某些次比較可能是空操作而已,因此爲了方便起見讓n=2^d,p爲線程數,每一個線程

保存2個整數,即p=n/2。線程編號id從0,...p-1
first = 1;next = 1;//這兩個變量與id號的關聯是關鍵
for(i=0;i<d;i++)//需要d躺歸併
{
    if(i>0)//第一躺方向剛好相反,因爲2組線程都是有序的
    {
       partner = id^first;
       first = first<<1 + 1;
       //讓編號爲id,partner的線程先交換各自其中一個數字,然後比較,再把比較 

     //後的結果返回回來
    }
    next = first>>2 - first>>3;//取first右移2位後的最高位
    for(j=i-1;j>0;j--)//第i部的歸併的後續操作
    {
       partner = id^next;
       //id與partner進程通信比較返回操作
       next = next>>1;
    }
    //一個線程中2個數的排序,每次歸併的最後一次操作
    if(data[1]<data[0])
        swap(data,1,0);
}
這個就是此算法的主要框架,由於本人的這個實現用到了很多MPI_Send,MPI_Recv等通信

操作,所以當測試32個數排序時,時間都已經達到了0.5ms左右,可見通信時間佔了絕大

多數。然而當時我想,既然這個算法的擴展性不好,因此可以在每次線程中保留一份完

整的數據,這樣在比較過程中就可以省略掉數據的通信交換了,應該可以提速不少,只

是當每一個線程通過比較後,改變了原來2個數的位置後,需要把這個事實廣播給其他所

有線程,讓他們也改變相應的位置,始終保持所有線程的數據都同步,這個需要O(lgn)

的時間,因此如果廣播太頻繁的話,這個改變已經偏離了bitonic_sort的初衷,儘管如

此,時間肯定是會得到提升的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章