前段時間寫了「mpi例項之中值濾波」,當時測試出來的結果顯示並行時間是超過序列時間的,這是因為程式在程序通訊上花費太多時間。後來我將點對點通訊修改為集合通訊,通訊時間大大減少。
修改後的**如下:
#include
#include
#include "mpi.h"
using
namespace
std;
void _medianfilter(const
unsigned
char* image, unsigned
char* result, int width, int height);//中值濾波
int main(int argc, char *argv)
nimgsizex = podataset->getrasterxsize(); //獲取橫向像元個數
nimgsizey = podataset->getrasterysize(); //獲取縱向像元個數
bandcount = podataset->getrastercount(); //獲取波段數
pimgdata = new
unsigned
char *[bandcount];
for (i = 0; i < bandcount; i++)
pimgdata[i] = new
unsigned
char[nimgsizex * nimgsizey];//用來儲存各波段原始資料
//影像切割
if (nimgsizey%size)
mpi_abort(mpi_comm_world, 1);
else
interval = nimgsizey / size;
for (i = 1; i <= bandcount; i++)
}if (podataset != null)
delete podataset;
}//程序0廣播
mpi_bcast(&nimgsizex, 1, mpi_int, 0, mpi_comm_world);
mpi_bcast(&nimgsizey, 1, mpi_int, 0, mpi_comm_world);
mpi_bcast(&bandcount, 1, mpi_int, 0, mpi_comm_world);
mpi_bcast(&interval, 1, mpi_int, 0, mpi_comm_world);
//每個程序都必須分配pimgdata,否則後面的mpi_scatter函式會報錯
if(rank)
//所有程序分配儲存資料集的空間
data = new
unsigned
char *[bandcount];
result = new
unsigned
char *[bandcount];
for (i = 0; i < bandcount; i++)
final_data = new
unsigned
char *[bandcount];
for (i = 0; i < bandcount; i++)
final_data[i] = new
unsigned
char[nimgsizex * nimgsizey];
//0程序向所有程序分發資料,用到集合通訊函式mpi_scatter()
for(i=0;i0, mpi_comm_world);
mpi_barrier(mpi_comm_world);
for (i = 0; i//同步一下
//聚焦,將所有程序資料(包括根程序自己)按順序傳送給根程序
for (i = 0; i0, mpi_comm_world); //全收集於程序0
mpi_barrier(mpi_comm_world);
//主程序寫入結果
if (!rank)
if (podstds != null)
delete podstds;
}mpi_finalize();
stop = time(null);
printf("use time:%ld\n", (stop - start));
return0;}
void _medianfilter(const
unsigned
char* image, unsigned
char* result, int width, int height) //中值濾波
// get result - the middle element
result[m * width + n] = window[4];}}
以下是我測試的結果,具體過程參見我上篇部落格。
從上面這幅圖可以看出,程式執行8個程序及以下的時候加速比幾乎是線性的,達到了我們理想的效果。程序數進一步增加時,通訊時間所佔比重增多,因此用20個程序跑時時間增加。
1.和上篇部落格相比,程式將點對點通訊修改為集合通訊。
if (!rank) }}
else }}
修改為:
//0程序向所有程序分發資料,用到集合通訊函式mpi_scatter()
for(i=0;isize, mpi_unsigned_char, &data[i], nimgsizex * nimgsizey/size, mpi_unsigned_char, 0, mpi_comm_world);
2.使用集合通訊可以大大減少通訊時間,本例項中使用的集合通訊函式主要是mpi_scatter()和mpi_gather(),這兩個函式中每個程序傳遞的資料量是相同的。如果資料不採取均分的方式,可以使用mpi_scatterv()和mpi_gatherv()等函式,這些函式引數中包括乙個資料量陣列,可以指定每個程序分配或傳輸的資料量,具體函式內容可參考官網。
.。 3.如果我以後還學習mpi,會繼續記錄相關知識。有問題的可以聯絡我,郵箱如下:[email protected]。
我的OpenCV學習筆記(1) 空域濾波之中值濾波
中值濾波就是將當前畫素值替換為模板覆蓋範圍內的所有畫素值中大小居中那乙個 對於乙個3 3的模板,第5大的就是中值 10,15,20,20,20,20,20,25,100 中值濾波使得那些更亮 或者更暗 的點更像他周圍的值。所以它在濾除噪音的同時,可以較好地保留細節輪廓。為了驗證上述結論,我先給一幅影...
中值濾波測試
小白又來記個筆記 當資料讀取之後 就開始對資料進行預處理 預處理中比較重要的乙個部分就是濾波 因為實際工況下得到的訊號肯定是混有雜訊的 從簡單的開始說起 比較簡單的濾波操作是中值濾波 中值濾波對緩慢變化的訊號中由於偶然因素引起的脈衝干擾有良好的濾波效果 這裡我用了師兄給我的實驗室測得訊號 沒有雜訊 ...
中值濾波(matlab)
中值濾波 是一種非線性數字濾波器技術,用於降噪。理解 去乙個模板,可為3 3,5 5,n n 每次從影象中取出模板大小的矩陣,將所有元素排序,取中間值放入木板的中心位置,再還原到原圖中,以此類推掃瞄整個影象。可先對影象進行填充,填充函式 b padarray a,padsize,padval,dir...