如果找到了对您有用的资料,烦请点击右手边的Google广告支持我继续共享知识,谢谢! http://dengpeng.spaces.live.com/

2007年5月3日星期四

Opensource: Parallel Matrix Multiply

Requirements are here: http://www.cs.mu.oz.au/678/assignment2.html or http://www.csse.unimelb.edu.au/678/assignment2.html

 

/*
Name: 433-678 Cluster and Grid Computing
Student Number: 263497
Author: Peng Deng
Login Name: pdeng
Date: 18-04-07 07:50
*/

#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int Number_Of_Nodes, My_Rank, Source=0;

int Number_of_Elements = 0 ;
int Number_of_Rows = 0;
int Remainder;
int Remaind_Elements;

int i, j, k;

double StartTime, EndTime;

char Processor_Name[MPI_MAX_PROCESSOR_NAME];
int NameLength;

int * matrixA; //pointer to matrix A
int * matrixB; //pointer to matrix B
int * matrixC; //pointer to matrix C
int * matrixTemp;
int * matrixTempResult;

int * Data_Counts;
int * Data_Displs;

int size;
size=atoi(argv[1]); // The first argument of the program receives the size of matrices
/* NOTE: The MPICH NT 1.2.5 implementation is different from Linux distributation.*/
/* ONLY Rank = 0 can get the values from command line arguments in Linux distributation. But in mpich nt, every node has this value */

MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD, &Number_Of_Nodes);
MPI_Comm_rank(MPI_COMM_WORLD, &My_Rank);
MPI_Get_processor_name(Processor_Name,&NameLength);

MPI_Bcast (&size, 1,MPI_INTEGER,Source,MPI_COMM_WORLD); // In The MPICH NT 1.2.5, this line is not necessary

matrixA = (int *) malloc(size * size * sizeof(int)); // this matrix will be scatter to every nodes
matrixB = (int *) malloc(size * size * sizeof(int)); // This matrix will be broadcast to every nodes
matrixC = (int *) malloc(size * size * sizeof(int)); // this matrix will be gather to My_Rank==0 from every nodes

Data_Counts = (int *) malloc(Number_Of_Nodes * sizeof(int)); //int array. Every element in this array contains a value describe how many elements per node.
Data_Displs = (int *) malloc(Number_Of_Nodes * sizeof(int)); //int array. Every element in this array contains a value describe the offset related to matrixA

if(My_Rank == 0)
{
/* fill random number into matrix */
for (k=0; k<size*size; k++)
{
matrixA[k]=rand()/1000;
matrixB[k]=rand()/1000;
}
}

/* check the size and number of nodes in MPI_COMM_WORLD */
if(size % Number_Of_Nodes ==0)
{
Number_of_Rows = size / Number_Of_Nodes; // How many rows per node
Number_of_Elements = size * Number_of_Rows; // Length multiply width. How many elements per node
matrixTemp = (int *) malloc(Number_of_Elements * sizeof(int)); //Store elements in temp array from matrix A
matrixTempResult = (int *) malloc(Number_of_Elements * sizeof(int)); //Store result to temp array

for(i=0; i<Number_Of_Nodes; i++)
{
Data_Counts[i]=Number_of_Elements; // How many elements in the i node
Data_Displs[i]=i * Number_of_Elements; // The start offset of data which will be send to node i related to matrixA(send buffer)
}
}else{
/* Last node takes all remain rows */
/*
Number_of_Rows = size / Number_Of_Nodes; // How many rows per node on average. For example, 8/3=2; 5/2=2; ......
Number_of_Elements = size * Number_of_Rows; // Length multiply width. How many elements per node on average
Remainder = size % Number_Of_Nodes; // How many rows remains. For example, 8%3=2; 5%2=1; ......
Remaind_Elements = size * Remainder; // How many elements remains
matrixTemp = (int *) malloc((Number_of_Elements + Remaind_Elements)* sizeof(int)); //Store elements from matrix A
matrixTempResult = (int *) malloc((Number_of_Elements + Remaind_Elements)* sizeof(int)); //Store result to temp array
for(j=0; j<Number_Of_Nodes-1; j++) // Fill properties of Number_Of_Nodes-1 nodes into int array.
{
Data_Counts[j]=Number_of_Elements; // How many elements in j node, j starts from 0 to Number_Of_Nodes-1. The last node is reserved.
Data_Displs[j]=j * Number_of_Elements; // The start offset of data which will be send to node i related to matrixA(send buffer)
}
//Deal with The last node
Data_Counts[Number_Of_Nodes-1]=Remaind_Elements + Number_of_Elements; // The last node take more workload to do -- Remaind_Elements
Data_Displs[Number_Of_Nodes-1]=(Number_Of_Nodes-1) * Number_of_Elements;
*/


/* The difference number of rows to process on every node is restrict to 1 */
Number_of_Rows = size / Number_Of_Nodes; // How many rows per node on average. For example, 8/3=2; 5/2=2; ......
Number_of_Elements = size * Number_of_Rows; // Length multiply width. How many elements per node on average

Remainder = size % Number_Of_Nodes; // How many rows remains. For example, 8%3=2; 5%2=1; ......
Remaind_Elements = size * Remainder; // How many elements remains

matrixTemp = (int *) malloc((Number_of_Elements + size)* sizeof(int)); //Store elements from matrix A
matrixTempResult = (int *) malloc((Number_of_Elements + size)* sizeof(int)); //Store result to temp array

for(j=0; j<Remainder; j++) // Fill properties of first Number_Of_Nodes nodes into int array.
{
Data_Counts[j]=Number_of_Elements + size; // How many elements in j node, j starts from 0 to Remainder. Every node takes one more row from Remainder.
Data_Displs[j]=j * (Number_of_Elements + size); // The start offset of data which will be send to node i related to matrixA(send buffer)
}

for(i=Remainder; i<Number_Of_Nodes; i++) // Fill properties of latter nodes into int array.
{
Data_Counts[i]=Number_of_Elements; // How many elements in i node, i starts from Remainder to Number_Of_Nodes. These nodes take one less row compare to previous nodes.
Data_Displs[i]=Remainder * (Number_of_Elements + size) + (i - Remainder) * Number_of_Elements; // The start offset of data which will be send to node i related to matrixA(send buffer)
}
}

MPI_Barrier(MPI_COMM_WORLD); // Wait untill all nodes reach this point

StartTime=MPI_Wtime(); // Start time recorded

/* Broadcast matrix B */
MPI_Bcast (matrixB, size*size,MPI_INTEGER,Source,MPI_COMM_WORLD);

/* Scatter matrixA to nodes */
MPI_Scatterv(matrixA, Data_Counts, Data_Displs, MPI_INTEGER, matrixTemp, Data_Counts[My_Rank], MPI_INTEGER, Source, MPI_COMM_WORLD);

/* Do computation matrixTempResult = matrixTemp * matrixB */
for(i=0; i<Data_Counts[My_Rank]/size; i++)
{
for(j=0; j<size; j++)
{
matrixTempResult[size*i+j]=0;
for(k=0; k<size; k++)
{
matrixTempResult[size*i+j] += matrixTemp[i*size+k] * matrixB[k*size+j];
}
}
}
/* Gather matrixTempResult from all nodes to matrixC on source node */
MPI_Gatherv(matrixTempResult, Data_Counts[My_Rank], MPI_INTEGER, matrixC, Data_Counts, Data_Displs, MPI_INTEGER, Source, MPI_COMM_WORLD);

EndTime=MPI_Wtime(); // End time recorded

if(My_Rank==0){
printf("Time: %f\n",EndTime-StartTime); // Print out th time used in the communication and computation
}

/* Free the memory allocations */
free(matrixA);
free(matrixB);
free(matrixC);

MPI_Finalize();
return 0;
}

7 条评论:

匿名 说...

加盟 洗鞋 洗包包 包裝 設計 pe膜 冬令營 坐月子 food processing equipment Telecom PCB 泡菜 團購美食 美國月子中心 愛情 彌月 gaming machine 大陸直航 新竹餐廳 下午茶 Biodegradable 搬家公司 喇叭網 塑膠射出廠 油飯 熱轉印 團體服訂做

匿名 说...

徵信 板橋法拍屋 大台北法拍屋 原裝進口燈飾 流行燈飾 3D立體印刷 印刷服務 徵信社 外遇 徵信 徵信社 浴室 漏水 舊屋翻新 裝潢 防水工程 壁癌 健康飲食 台北素食餐廳 吃素 團購美食 水餃 seo 網站設計 超耐磨地板 店面出租 Precision Mold 加盟創業 冷凍宅配 宅配美食 Light guide panelsseo seo 線上客服 seo 網頁設計 Plastic Products Mold design hand dryer 電波拉皮 房屋貸款 剖腹生產 沖孔網 飛梭雷射 金屬擴張網 彌月送禮 喜餅 宜蘭旅遊 教育訓練 品質管理 Ohsas 18001 清水溝 沙發 室內設計公司 室內設計 室內裝潢設計 裝潢設計 澳門自由行 搬家公司

匿名 说...

彌月禮 玻尿酸 星座運勢 算命 皮膚科 皮膚科診所 肉毒桿菌 肉毒桿菌瘦臉 脈衝光 除斑 Flex PCB PCB Electronic PCB 房屋仲介 法拍屋 法拍 法拍屋查詢系統 室內裝潢設計 照明 彩盒 水晶燈 日租套房 台北日租 apartment 太平山民宿 宜蘭民宿推薦 借錢 素食 素食食譜 省電熱水器 電波拉皮 姓名配對 星座casino gaming machine 泰國清邁 外遇 模具設計 素食料理 素食水餃 開運印章 風水 外遇 徵信 壁癌 屋頂防水 屋頂隔熱 抓漏 油漆 徵信社 外遇 徵信 徵信社 外遇 徵信 徵信社 外遇 紙盒印刷

匿名 说...

皺紋 減肥 禿頭 醫學美容 網路行銷 中古車 涼麵 POLO衫 電波拉皮 雷射溶脂 肉毒桿菌 玻尿酸 痘疤 婦產科診所 室內設計 埋線 內分泌失調 黃體不足 針灸減肥 公益團體 愛心捐款 捐款 坐月子中心 婦產科 玫瑰花束 盆栽 網路花店 花店 鍛造 樓梯扶手 欄杆 通馬桶 喜餅價格 訂婚禮盒 訂婚喜餅 宜蘭民宿 泰國 關鍵字廣告 seo 網頁設計公司 雷射溶脂外遇 徵信 徵信社 清潔公司 喜餅禮盒 塑膠射出 柔膚雷射 獸醫師 創業 鞋之澡堂 洗鞋子 洗包包加盟 彌月禮盒 模具

匿名 说...

義賣活動 二手車 環保袋 環保袋 環保袋 十分瀑布 台北旅遊網 月子餐 飛梭雷射 太陽能熱水器 太陽能 三久太陽能 三久 身體檢查 健康檢查 台北民宿 薰衣草花園 花園餐廳 螢火蟲 渡假村 鐵道之旅 團體服 滷味 滷味加盟 滷味批發 滷味食材 滷味宅配 滷雞翅 滷雞腳 健康滷味 租店面 魯味 加盟創業 慈善 慈善機構 公益彩券 肉毒桿菌 系統家具鐵門 採光罩 清水溝 通水管 台中漆彈場 漆彈 團體服 團體服 月子中心 全身健康檢查 統一發票5 6月 104人力銀行 104求職人力銀行 團體服 T恤 圍裙 健康食品 慈善基金會美白 塑膠射出模具

匿名 说...

月子餐外送 月子餐食譜 統一發票9 10月 金價 統一發票9 10月 找工作 統一發票7 8月 求職 1111求職人力銀行 104求職人力銀行 104人力銀行 塑膠袋 統一發票1 2月 金價 肉毒桿菌 黃金 sum中古車 1111人力銀行 104求職人力銀行 1111人力銀行求職 黃金價格查詢 中古車買賣 塑膠袋 統一發票9 10月 抽水肥 水管不通 化糞池 通馬桶 導光板 洗水塔 自由行 塑膠袋批發 中古車 中古車買賣 消防公司 團體服創意 地板施工 網路廣告 網路行銷 平溪 景觀餐廳 桃園房屋買賣 關鍵字行銷 關鍵字 seo 關鍵字行銷 關鍵字 seo 熱水器 衛浴設備 節能減碳 電熱水器 中古車 義賣

匿名 说...

月子中心 seo 關鍵字廣告 關鍵字 關鍵字行銷 今日金價 網路行銷 通姦 徵信社 外遇 桃園房屋仲介 桃園房屋買賣 桃園房屋 醫學美容診所 淨膚雷射 雷射溶脂 飛梭雷射黃金價格 金價查詢 黃金買賣 環保袋 微晶瓷 植髮 團體服 團體服訂做 抽化糞池 訂房 雄獅旅遊 汽車美容 汽車美容 三久太陽能 黃金價格查詢 貸款 信用貸款 微晶瓷 3D飛梭雷射 淨膚雷射 汽車借款 汽車貸款 徵信 徵信社 膠框 創業 加盟 早餐店加盟 統一發票3 4月 坐月子 meat processing equipment food processing mixers 衝孔網 藥盒 金價查詢 月子餐 月子中心 坐月子餐 賣車 辦公室風水