MPI平行計算學習筆記4 奇偶排序的優雅實現

2021-10-05 20:36:24 字數 3183 閱讀 6062

1.執行環境vs2017 + mpi

2.演算法背景與原理,可見部落格:

值得一提的是,奇偶排序演算法設計的初衷便是平行計算,只是更加貼合openmp這種共享記憶體式的程式設計框架,以後會和大家分享。

3.mpi模式下的奇偶排序演算法,有更大的靈活性(個人觀點:用到了奇偶排序的思想,並不是完全意義上的序列改並行)。

排序演算法示意圖:

注1:存在嚴格的定理可證明,如果有n個數進行奇偶排序,至多進行n次排序,資料則有序;對於mpi並行演算法,模擬可得,如果有n個程序進行奇偶排序,則同樣至多進行n次排序(一次排序指的是一次奇排序加一次偶排序)。

4.程式**如下

#include#include"mpi.h"

#include#includeusing namespace std;

int myid, numprocs;//程序標識,程序總數

int part;//每個核心需排序元素個數

double start, finish;//計算時間

const int n = 9900;//待排元素個數

const int inf = 0x7fffffff;//設定乙個無窮大值

void odd_even_sort(float *p,int num);//順序執行的奇偶排序

void swap(float *p, int i, int j);//交換演算法

void mergesort(float *data, float *buffer, float *tmp, bool &sort);//兩塊排好序的元素進行排序合併

void parallelmergesort(float *data);//奇偶排序式的 融合排序演算法

int main(int argc, char *ar**)

; srand(time(null));

for (int i = 0; i < n; ++i)

memorypool[i] = (rand() % 1000)/10.0;

start = mpi_wtime();//序列開始計時

/*for (int i = 0; i < n; ++i)

cout << memorypool[i] << endl;*/

if (numprocs == 1)

for (int i = 0; i < padding; ++i)

memorypool[n + i] = inf;

part = (n + padding) / numprocs;

}start = mpi_wtime();//並行開始計時

mpi_bcast(&part, 1, mpi_int, masternode, mpi_comm_world);

float *data = new float[part] ;

//主程序向各程序播撒資料

mpi_scatter(memorypool, part, mpi_float, data, part, mpi_float, masternode, mpi_comm_world);

//保證部分有序

odd_even_sort(data, part);

parallelmergesort(data);

//將全域性有序的資料收集到主程序

mpi_gather(data, part, mpi_float, memorypool, part, mpi_float, masternode, mpi_comm_world);

//輸出排序後結果

/*if (myid == masternode)

*/ finish = mpi_wtime();//並行停止計算

if (memorypool)deletememorypool;

if(myid == masternode)

deletedata;

mpi_finalize();

return 0;

}void odd_even_sort(float *p,int num)

} for (int i = 2; i < num; i += 2)

} }}

inline void swap(float *p, int i, int j)

void mergesort(float *data, float *buffer,float *tmp, bool &sort)

//此處等號一定要加

else

} if (j != 0)sort = false;

if (i != part)

if (j != part)

memcpy(data, tmp, sizeof(float)*part);

memcpy(buffer, tmp + part, sizeof(float)*part);

}void parallelmergesort(float *data)

; float *tmp = new float[2 * part];

bool sort = false;

bool flag = false;

while (!flag)

else if(right != mpi_proc_null)//如果接受的是虛擬程序的訊息(空),那就不應該進行mergesort

mpi_barrier(mpi_comm_world);//屏障函式,顯式將奇排序和偶排序分開,不加也可以

if (myid % 2 == 1)

else if (right != mpi_proc_null)

//全規約函式,對每個程序中的sort標識求邏輯與,結果儲存在flag中,flag=1 意味著每個程序的sort都為1,排序完成

mpi_allreduce(&sort, &flag, 1, mpi_c_bool, mpi_land, mpi_comm_world);

}deletetmp;

deletebuffer;

}

5.執行結果

結果說明:1.此處amdahl定律是失效的,計算量並不等價

2.程式計時時,應把輸出語句注釋掉,一方面輸出本身比較耗時;另一方面多程序搶占輸出裝置資源,互相等待;

平行計算MPI 二 MPI阻塞通訊

阻塞通訊 訊息傳送方的send需要接收方的recv配合才能完成。mpi對阻塞通訊一些底層函式進行了一些封裝,方便我們呼叫。1.標準通訊模式 mpi send buf,buf size,mpi char,process1,tag,mpi comm world mpi recv buf,buf size...

分布式系統與平行計算學習筆記

將不同的元件分布在不同的伺服器上,給使用者提供乙個可靠 統一的服務。p 分割槽容錯性 最終一致性 相當於cap原則中的一致性和可用性的權衡結果 這種結構就是分布式系統的基本單元 訪問多個服務時需要進行服務的配置 編排。十多年前流行,現在過時了,因為太複雜。現在用的最多的就是微服務架構 服務閘道器與負...

Mac OS X下利用MPI進行平行計算

北京時間2016年6月20日下午3點,top500組織在法蘭克福世界超算大會 isc 上,由中國國家並行計算機工程技術研究中心研製的 神威 太湖之光 超級計算機系統登頂榜單之首,成為世界上首颱運算速度超過十億億次的超級計算機。而此前國防科大的天河二號超級計算機保持世界超算第一的位置也已經長達六屆。超...