資源簡介
矩陣轉置的并行化實現,用的的是c語言,mpi實現的,可以參考下
代碼片段和文件信息
#include?“stdio.h“
#include?“stdlib.h“
#include?“mpi.h“
#include?“math.h“
#define?E?0.0001
#define?a(xy)?a[x*m+y]
#define?b(xy)?b[x*m+y]
#define?A(xy)?A[x*size+y]
#define?B(xy)?B[x*size+y]
#define?intsize?sizeof(int)
#define?floatsize?sizeof(float)
#define?charsize?sizeof(char)
int?sizeN;???????????????????????????????????????/*?size:保存矩陣行數;N:保存矩陣列數?*/
int?m;????????????????????????????????????????????/*?保存子方陣的尺寸?*/
int?t;????????????????????????????????????????????/*?棋盤劃分的分割數?*/
float??*B;?????????????????????????????????????/*?A:保存原矩陣;B:保存轉置后的矩陣?*/
double?starttime;?????????????????????????????????/*?保存開始時間?*/
double?time1;?????????????????????????????????????/*?保存分發數據的結束時間?*/
double?time2;?????????????????????????????????????/*?保存運行的結束時間?*/
int?my_rank;??????????????????????????????????????/*?保存當前進程的進程號?*/
double?p;????????????????????????????????????????????/*?保存進程數?*/
MPI_Status?status;????????????????????????????????/*?保存MPI狀態?*/
//FILE?*fdA;????????????????????????????????????????/*?輸入文件?*/
/*?運行結束前調用本函數釋放內存空間?*/
void?Environment_Finalize(float?*afloat?*b)
{
????free(a);
????free(b);
}
int?main(int?argc?char?**argv)
{???int?A[4][4]={{1234}{5678}{9101112}{13141516}};
????int?ijkmy_rankgroup_size;
????float?*a*b;
????int?uv;
????float?temp;
????MPI_Init(&argc&argv);
????MPI_Comm_size(MPI_COMM_WORLD&group_size);
????MPI_Comm_rank(MPI_COMM_WORLD&my_rank);
????p=group_size;
????/*?如果是主進程(rank=0的進程)則進行讀文件的操作
???????將待轉置的矩陣讀入內存保存到全局變量A中
????*/
????if(my_rank==0)
????{
????????starttime=MPI_Wtime();
size=4;
N=4;
????????//fdA=fopen(“dataIn.txt““r“);
????????/*?讀入矩陣的行數和列數并保存到size和N中?*/
????????//fscanf(fdA“%d?%d“?&size?&N);
????????/*?判斷是否是方陣如果不是程序退出?*/
??????/*if(size?!=?N)
????????{
????????????puts(“The?input?is?error!“);
????????????exit(0);
????????}
????????A=(float*)malloc(floatsize*size*size);*/
????????B=(float*)malloc(floatsize*size*size);
????????/*?將矩陣的所有值讀入保存到A中?*/
????????/*for(i?=?0;?i?????????{
????????????for(j?=?0;?j?????????}
????????fclose(fdA);*/
????}
????/*?廣播矩陣的尺寸?*/
????MPI_Bcast(&size1MPI_INT0MPI_COMM_WORLD);
????/*?獲得棋盤劃分的數目?*/
????t=(int)sqrt(p);
????if?(t>size)
????????t=size;
????if(size%t!=0)
????????for(;;)
????{
????????t--;
????????if(size%t==0)
????????????break;
????}
????/*?獲得實際利用的處理器個數?*/
????p=t*t;
????/*?每個子方陣的尺寸?*/
????m=size/t;
????/*?a保存子方陣b是臨時矩陣是主進程用來保存待發送給別的進程的子方陣?*/
????a=(float?*)malloc(floatsize*m*m);
????b=(float?*)malloc(floatsize*m*m);
????if?(a==NULL||b==NULL)
????????printf(“allocate?space??fail!“);
????/*?對主進程獲得自己的子方陣(即左上角的子方陣)?*/
????if?(my_rank==0)
????{
????????for(i=0;i ????????????for(j=0;j ????????????????a(ij)=A[i][j];
????}
????/*?主進程向其他進程發送數據?*/
????if?(my_rank==0)
????{
????????for(i=1;i????????{
????????????v=i/t;????????????????????????????????/*?子方陣的行號?*/
????????????u=i%t;????????????????????????????????/*?子方陣的列號?*/
????????????for(
- 上一篇:VC++MFC編程
- 下一篇:DES算法加密解密C++源碼及程序完整的工程文件
評論
共有 條評論