国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

矩陣乘法的MPI并行實驗報告

這篇具有很好參考價值的文章主要介紹了矩陣乘法的MPI并行實驗報告。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

矩陣乘法的MPI并行實驗報告

一、實驗要求:

(1) 分別用 1,2,4,8 個進程完成矩陣乘法(同一個程序):A * B = C,其中 A,B,C 均為 2048*2048 雙精度點方陣,0號進程負責(zé)初始化矩陣 A,B 并將結(jié)果存入 0 號進程。
(2) 繪制加速比曲線;

二、實驗環(huán)境:

  • 操作系統(tǒng):Windows11
  • 編程語言:C++(使用MPI接口)
  • 編譯器:VC++
  • 核心庫:MPI(MSMPI)
  • 編程工具:Visual Studio 2022
  • CPU:AMD Ryzen 7 6800H with Radeon Graphics 3.20 GHz
  • 內(nèi)存:16GB

三、實驗內(nèi)容:

1. 實現(xiàn)思路

將可用于計算的進程數(shù)分解為a*b,然后將全體行劃分為a個部分,全體列劃分為b個部分,從而將整個矩陣劃分為相同的若干個塊。每個子進程負責(zé)計算最終結(jié)果的一塊,只需要接收A對應(yīng)范圍的行和B對應(yīng)范圍的列,而不需要把整個矩陣傳過去。主進程(0號進程)負責(zé)分發(fā)和匯總結(jié)果。
注意:
(1) 為了保證平均劃分,矩陣需要擴展,即擴展至負責(zé)計算的進程數(shù)的倍數(shù),擴展部分?jǐn)?shù)據(jù)置為0,以保證結(jié)果準(zhǔn)確性。
(2) 通信接口使用Send/Recv,所以進程編號要管理好。另外,主進程只負責(zé)初始化矩陣及分發(fā)和匯總結(jié)果。

2. 實驗結(jié)果

(1) 設(shè)置為單進程,即串行

  • 單進程命令行參數(shù)設(shè)置(如圖1)
    矩陣乘法的MPI并行實驗報告
    圖 1 單進程時命令行參數(shù)設(shè)置
  • 單進程運行結(jié)果,約97.20s(如圖2)
    矩陣乘法的MPI并行實驗報告圖 2 單進程時運行的時間花銷
    (2) 設(shè)置為2進程
  • 2進程命令行參數(shù)設(shè)置(如圖3)
    矩陣乘法的MPI并行實驗報告圖 3 程序2進程運行時命令行參數(shù)設(shè)置
  • 2進程運行結(jié)果,約75.43s(如圖4)矩陣乘法的MPI并行實驗報告圖 4 程序2進程時運行的時間花銷
    (3) 設(shè)置為4進程
  • 4進程命令行參數(shù)設(shè)置(如圖5)
    矩陣乘法的MPI并行實驗報告圖 5 程序4進程運行時命令行參數(shù)設(shè)置
  • 4進程運行結(jié)果,約17.17s(如圖6)
    矩陣乘法的MPI并行實驗報告圖 6 程序4進程時運行的時間花銷
    (4) 設(shè)置為8進程
  • 8進程命令行參數(shù)設(shè)置(如圖7)
    矩陣乘法的MPI并行實驗報告圖 7 程序8進程運行時命令行參數(shù)設(shè)置
  • 8進程運行結(jié)果,約9.05s(如圖8)
    矩陣乘法的MPI并行實驗報告圖 8 程序4進程時運行的時間花銷
    由上述運行結(jié)果可得表格1
    表格 1 程序運行結(jié)果分析表
    矩陣乘法的MPI并行實驗報告由表格1可知,隨著進程數(shù)的增加,程序運行時間也隨之減少,加速比隨之增加。但是,可以注意到,單進程和2進程的時間花銷相差并不大,2進程時的加速比僅為1.29,其原因是程序在多進程運行時,由于設(shè)計思路是主進程(0號進程)并不參與計算,只負責(zé)初始化矩陣和分發(fā)匯總結(jié)果,故2進程時程序優(yōu)化并不明顯。當(dāng)增加到4進程及8進程時,程序運行時間大大減少。其加速比曲線如圖9。
    矩陣乘法的MPI并行實驗報告
    由于實驗要求的矩陣為2048*2048的雙精度浮點方陣,故在代碼完成后,先將矩陣維度設(shè)置為7,以檢驗程序結(jié)果是否準(zhǔn)確,同時對于生成的隨機數(shù)不設(shè)置種子,以保證每次程序運行的數(shù)據(jù)一致,從而確保實驗數(shù)據(jù)準(zhǔn)確,檢驗結(jié)果如圖10所示;
    矩陣乘法的MPI并行實驗報告圖 10 檢驗矩陣數(shù)據(jù)

四、實驗總結(jié):

經(jīng)過此次實驗,文章來源地址http://www.zghlxwxcb.cn/news/detail-479397.html

  1. 熟悉掌握了MPI幾個基本函數(shù),知曉Send/Recv通信接口的使用;
  2. 進一步了解MPI通信的相關(guān)原理;
  3. 掌握基本的MPI編程能力;

五、 附錄(代碼):

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <string>
#include "mpi.h"
#define NUM 2048	//矩陣大小
using namespace std;

//打印數(shù)組(測試使用)
void printfArray(double* A, int length) {
	for (int i = 0; i < length; i++) {
		for (int j = 0; j < length; j++) {
			cout << A[i * length + j] << " " ;
		}
		cout << endl;
	}
}
//擴展矩陣并且初始化,多余部分填充0
void matGene(double* A, int size, int actual_size) {
	// actual size: 使用的矩陣極可能大于原始大小
	for (int i = 0; i < actual_size; i++) {
		for (int j = 0; j < actual_size; j++) {
			if (i < size && j < size)
				//初始化矩陣,隨機生成雙精度浮點數(shù)[-1,1]
				A[i * actual_size + j] = -1.0 + 1.0 * rand() / RAND_MAX * 2; //A[i][j]
			else A[i * actual_size + j] = 0;	//擴展部分填充0
		}
	}
}

//計算矩陣乘法(進程數(shù)為1時)
void matMulti(double* A, double* B, double* C, int m, int n, int p) {
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < p; j++) {
			C[i * p + j] = 0;
			for (int k = 0; k < n; k++)
				C[i * p + j] += A[i * n + k] * B[k * p + j];
		}
	}
}

//返回不大于根號(n)的最大因子
int factor(int n) {
	double sqr_root = sqrt(n);
	for (int i = sqr_root; i >= 1; i--) {
		if (n % i == 0) return i;
	}
}

int main(int argc, char* argv[]) {

	int n = NUM; // 數(shù)組大小
	double beginTime, endTime;  //用于記錄時間
	//srand((unsigned int)time(NULL));	//如果多次測試,可以注釋這一句

	// 初始化MPI 
	int my_rank = 0, comm_sz = 0, namelen = 0;
	char processor_name[MPI_MAX_PROCESSOR_NAME];
	MPI_Init(&argc, &argv);
	MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);	//獲取進程號
	MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);	//獲取進程數(shù)
	MPI_Get_processor_name(processor_name, &namelen);	//獲得處理器名
	MPI_Status status;	//狀態(tài)

	if (comm_sz == 1) { // no parallel
		// Prepare data
		double* A = new double[n * n + 2];
		double* B = new double[n * n + 2];
		double* C = new double[n * n + 2];
		int saveN = n;
		matGene(A, saveN, n);
		matGene(B, saveN, n);

		// 計算時間
		beginTime = MPI_Wtime();	//開始時間
		matMulti(A, B, C, n, n, n);
		endTime = MPI_Wtime();	//結(jié)束時間
		cout << processor_name << ":" << "單進程時間開銷:" << endTime - beginTime << "s" << endl;

		//刪除矩陣
		delete[] A;
		delete[] B;
		delete[] C;
	}

	else { // 進程數(shù)大于1時,啟用并行

		int saveN = n;

		// 主要過程負責(zé)收集結(jié)果,矩陣必須與散度相等:實際n大于輸入
		//計算矩陣大?。ㄐ钄U展至負責(zé)計算的進程數(shù)的倍數(shù))即comm_sz-1的倍數(shù)
		if (n % (comm_sz - 1) != 0) {
			n -= n % (comm_sz - 1);
			n += (comm_sz - 1);
		}

		/*
			將可用于計算的進程數(shù)(comm_sz-1)分解為a*b
			然后將全體行劃分為a個部分,全體列劃分為b個部分,
			從而將整個矩陣劃分為size相同的(comm_sz-1)個塊。
			每個子進程負責(zé)計算最終結(jié)果的一塊,只需要接收A對應(yīng)范圍的行和B對應(yīng)范圍的列,
			而不需要把整個矩陣傳過去。
		*/
		int a = (comm_sz - 1) / factor(comm_sz - 1);
		int b = factor(comm_sz - 1);
		int each_row = n / a;
		int each_column = n / b;

		//0號進程負責(zé)初始化矩陣,分發(fā)和匯總結(jié)果
		if (my_rank == 0) {
			double* A = new double[n * n + 2];
			double* B = new double[n * n + 2];
			double* C = new double[n * n + 2];

			// Prepare data
			//cout << "n = " << n << endl;
			//將矩陣的維度擴展到comm_sz-1的倍數(shù),多余的部分用0填充,保證正確性。
			matGene(A, saveN, n);
			matGene(B, saveN, n);
			//計算開始時間
			beginTime = MPI_Wtime();

			//Send:發(fā)送數(shù)據(jù),矩陣A的行和矩陣B的列至各進程
			//發(fā)送 A[beginRow:endRow, :], B[:, beginColumn:endColumn]
			for (int i = 1; i < comm_sz; i++) {	//發(fā)送數(shù)據(jù)到各進程(0號進程除外)
				int beginRow = ((i - 1) / b) * each_row;
				int beginColumn = ((i - 1) % b) * each_column;
				// A: beginRow ~ endRow
				MPI_Send(&A[beginRow * n + 0], each_row * n, MPI_DOUBLE, i, i, MPI_COMM_WORLD);
				// B: n times, once a row
				for (int j = 0; j < n; j++) {
					MPI_Send(&B[j * n + beginColumn], each_column, MPI_DOUBLE, i, i * n + j + comm_sz + 2, MPI_COMM_WORLD);
				}
			}

			//接受結(jié)果 Recv: C[beginRow:endRow, beginColumn:endColumn]
			for (int i = 1; i < comm_sz; i++) {
				int beginRow = ((i - 1) / b) * each_row;
				int endRow = beginRow + each_row;
				int beginColumn = ((i - 1) % b) * each_column;
				for (int j = beginRow; j < endRow; j++) {
					MPI_Recv(&C[j * n + beginColumn], each_column, MPI_DOUBLE, i, each_row * i + (j - beginRow), MPI_COMM_WORLD, &status);
				}
			}

			endTime = MPI_Wtime();	//結(jié)束時間
			//打印時間花銷
			cout << processor_name << ":" << comm_sz << "個進程時間開銷:" << endTime - beginTime << "s" << endl;
			//刪除矩陣
			delete[] A;
			delete[] B;
			delete[] C;

		}
		else {

			double* partA = new double[each_row * n + 2]; // A[beginRow:endRow, :]
			double* partB = new double[n * each_column + 2]; // B[:, beginColumn:endColumn]
			double* partC = new double[each_row * each_column + 2]; // C[beginRow:endRow, beginColumn:endColumn]

			//各進程接受數(shù)據(jù)  Recv: partA, partB
			MPI_Recv(&partA[0 * n + 0], each_row * n, MPI_DOUBLE, 0, my_rank, MPI_COMM_WORLD, &status);
			for (int j = 0; j < n; j++) {
				MPI_Recv(&partB[j * each_column + 0], each_column, MPI_DOUBLE, 0, my_rank * n + j + comm_sz + 2, MPI_COMM_WORLD, &status);
			}
			//計算
			matMulti(partA, partB, partC, each_row, n, each_column);

			//發(fā)送計算之后的結(jié)果	Send: partC

			for (int j = 0; j < each_row; j++) {
				MPI_Send(&partC[j * each_column + 0], each_column, MPI_DOUBLE, 0, each_row * my_rank + j, MPI_COMM_WORLD);
			}

			//刪除數(shù)組
			delete[] partA;
			delete[] partB;
			delete[] partC;
		}

	}
	//終止MPI
	MPI_Finalize();
	return 0;
}

到了這里,關(guān)于矩陣乘法的MPI并行實驗報告的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 高性能計算的矩陣乘法優(yōu)化 - Python +MPI的實現(xiàn)

    本次實驗的目的是使用MPI的并行性來進行矩陣乘法優(yōu)化,本人使用 Python 實現(xiàn) 實驗硬件: CPU :AMD Ryzen 7 5800H(3.20 GHz) 內(nèi)存 :32GB (3200MHz) 要求 :使用一個矩陣,一個向量相乘,分別用單進程和多進程的mpi接口實現(xiàn)。 全局的規(guī)模參數(shù)是 Scale 數(shù)據(jù)示例 : 當(dāng) Scale=5 時,數(shù)據(jù)示例如

    2023年04月22日
    瀏覽(32)
  • CUDA 以及MPI并行矩陣乘連接服務(wù)器運算vscode配置

    CUDA 以及MPI并行矩陣乘連接服務(wù)器運算vscode配置

    本地安裝 服務(wù)器端安裝 c_cpp_properties.json launch.json tasks.json ? ? 本地安裝和服務(wù)器端安裝的擴展和CUDA一樣 c_cpp_properties.json launch.json settings.json tasks.json

    2024年04月27日
    瀏覽(22)
  • 基于因特爾OneAPI實現(xiàn)矩陣并行乘法運算

    OneAPI介紹 Intel oneAPI 是一個跨行業(yè)、開放、基于標(biāo)準(zhǔn)的統(tǒng)一的編程模型,旨在提供一個適用于各類計算架構(gòu)的統(tǒng)一編程模型和應(yīng)用程序接口。其核心思想是使開發(fā)者只需編寫一次代碼,便可在跨平臺的異構(gòu)系統(tǒng)上運行,支持的底層硬件架構(gòu)包括 CPU、GPU、FPGA、神經(jīng)網(wǎng)絡(luò)處理器以

    2024年02月04日
    瀏覽(13)
  • 網(wǎng)絡(luò)應(yīng)用編程 實驗3 矩陣并行計算練習(xí)實驗

    網(wǎng)絡(luò)應(yīng)用編程 實驗3 矩陣并行計算練習(xí)實驗

    編寫一個 WPF 應(yīng)用程序,利用 數(shù)據(jù)并行 計算兩個矩陣(M×N和N×P)的乘積,得到一個M×P的矩陣。 ? 具體要求 (1)在代碼中用 多任務(wù) 通過 調(diào)用某方法 實現(xiàn) 矩陣并行 運算,在調(diào)用的參數(shù)中分別 傳遞M、N、P 的大小。 (2)程序中 至少要測試3次 有代表性的不同大小的矩陣運

    2024年02月05日
    瀏覽(22)
  • 使用mpi并行技術(shù)實現(xiàn)快排Qsort()

    使用mpi并行技術(shù)實現(xiàn)快排Qsort()

    快排基本原理: 快速排序可以說是最為常見的排序算法,冒泡排序時間復(fù)雜度達到了O(N2),而桶排序容易造成浪費空間??炫牛≦uicksort)就成為了不錯的選擇。 1、原理:快排需要找一個數(shù)作為基準(zhǔn)數(shù),用來參照。(可取第一個數(shù)為參照) ??????? 基準(zhǔn)數(shù)在中間某位置,

    2024年02月10日
    瀏覽(18)
  • 【HNU分布式與云計算系統(tǒng)】MPI實現(xiàn)矩陣乘矩陣運算

    【HNU分布式與云計算系統(tǒng)】MPI實現(xiàn)矩陣乘矩陣運算

    實驗環(huán)境 操作系統(tǒng):Ubuntu 20.04 編程語言:C++ 實驗原理 什么是MPI MPI是一個跨語言的通訊協(xié)議,用于編寫并行計算機。支持點對點和廣播。MPI是一個信息傳遞應(yīng)用程序接口,包括協(xié)議和和語義說明,他們指明其如何在各種實現(xiàn)中發(fā)揮其特性。MPI的目標(biāo)是高性能,大規(guī)模性,和

    2023年04月08日
    瀏覽(21)
  • 【矩陣乘法】C++實現(xiàn)外部矩陣乘法

    【矩陣乘法】C++實現(xiàn)外部矩陣乘法

    ? 使用文件和內(nèi)存模擬系統(tǒng)緩存,并利用矩陣乘法驗證實際和理論情況。 設(shè)計一個 Matrix 類,其中 Matrix 是存在磁盤中的一個二進制文件,類通過保存的矩陣屬性來讀取磁盤。前八個字節(jié)為兩個 int32 ,保存矩陣的行列數(shù)。 Matrix中有一個 buffer 成員為讀取到的數(shù)據(jù)緩存,通過

    2024年02月11日
    瀏覽(25)
  • python矩陣乘法全面解讀,python矩陣乘法常用代碼

    python矩陣乘法全面解讀,python矩陣乘法常用代碼

    ? 矩陣乘法,顧名思義是矩陣的乘法,矩陣相乘的含義是兩個向量的積,在 Python中一般以乘號或括號表示。與常用的加、減、乘、除運算不同,矩陣乘法只能用于對給定矩陣進行乘法運算,不能進行除法運算。若要計算矩陣乘法的值,必須先進行矩陣分解。 在上一篇文章中

    2024年02月08日
    瀏覽(22)
  • 矩陣乘法(矩陣乘矩陣)

    矩陣乘法(矩陣乘矩陣)

    首先理了解矩陣是什么: 矩陣是一個按照長方陣列排列的復(fù)數(shù)或?qū)崝?shù)集合。(相信大家都懂) 關(guān)于矩陣的基本概念: 1.方陣:n?階方陣?(正方形嘛) 2.同型矩陣:兩個矩陣,行數(shù)與列數(shù)對應(yīng)相同,稱為同型矩陣 矩陣加減法: 在了解矩陣乘法前先看看矩陣加減法: 1.兩個矩陣

    2024年02月08日
    瀏覽(21)
  • 項目調(diào)研丨多區(qū)塊并行處理公鏈 Transformers 研究報告

    項目調(diào)研丨多區(qū)塊并行處理公鏈 Transformers 研究報告

    目錄 一、項目簡介 二、項目愿景 三、特色和優(yōu)勢 (1)速度 (2)安全 (3)可擴展性 (4)高度定制 (5)不可篡改 (6)所有數(shù)據(jù)公開透明 (7)支持智能合約 四、發(fā)展歷史 五、團隊背景 六、融資信息 七、項目架構(gòu) (1)網(wǎng)絡(luò) (2)共識算法 (3)DAG (4)同步化 (5)交易

    2024年02月10日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包