並行程式設計報告

2021-04-21 00:31:46 字數 2856 閱讀 6021

實驗目的10

實驗概述10

實驗結果10

實驗**11

實驗總結18

實驗一:利用 pthread 並行實現矩陣的乘法運算

實驗目的

該實驗旨在讓學生掌握利用 pthread 進行並行程式設計和效能優化的基本原理和方法,了解並行程式設計中資料劃分和任務劃分的基本方法,並能夠利用pthread 實現矩陣的乘法運算的並行演算法,然後對程式執行結果進行簡單分析和總結。具體包括:利用 for 迴圈編寫序列的矩陣乘法運算;熟悉 pthread 進行執行緒建立、管理和銷毀的基本原理和方法;利用 pthread 對上述序列的矩陣乘法運算加以改造;通過調整資料劃分和任務劃分的粒度(改變工作執行緒的數目),測試並行程式的執行效率;對實驗結果進行總結和分析。

實驗概述

使用 pthread 完成這項工作。

建立乙個新的執行緒:

int pthread_create( pthread_t *thread,

const pthread_attr_t *attr,

void *(*func) (void *),

void *arg);

thread 表示執行緒 id,與執行緒中的 pid 概念類似

attr 表示設定執行緒的屬性,可以暫時不用考慮

func 表示新建立的執行緒會從這個函式指標處開始執行

arg 表示這個函式的引數指標

返回值為 0 代表成功,其他值為錯誤編號。

主程序等待執行緒結束:

int pthread_join( pthread_t thread, void **retval );

thread 表示執行緒 id,與執行緒中的 pid 概念類似

retval 用於儲存等待執行緒的返回值

兩個矩陣相乘:

乙個 m 行 n 列的矩陣與乙個 n 行 p 列的矩陣可以相乘,得到的結果是乙個

m 行 p 列的矩陣,其中的第 i 行第 j 列位置上的數為第乙個矩陣第 i 行上的 n 個

數與第二個矩陣第 j 列上的 n 個數對應相乘後所得的 n 個乘積之和。

實驗結果

實驗隨機產生的矩陣 b 的資料

並行以及序列計算時間對比

實驗**

1. 平行計算矩陣相乘**:

#include

#include

#include

#include

#include

#include

/*定義矩陣中元素的上限,避免相乘後溢位*/

#define range 150

/*矩陣a有m行n列,矩陣b有n行m列*/

#define m 200

#define n 300

int matrixa[m][n];

int matrixb[n][m];

int arr[m][m][n];

int res[m][m]=;

void *func(void *arg);

void put();

void *func(void *arg)//每個子執行緒要完成的任務

main()

}for(i=0;i pthread_join(tids[i],null);//等待所有的子執行緒計算結束

for(i=0;i for(j=0;jfor(k=0;kres[i][j]+=arr[i][j][k

clock_t finish=clock();//結束計算

printf("平行計算用時%.2f秒\n",(long)(finish-start)/1e6);

put();

exit(0);

}void put()

if((file2=fopen("matrixb","wt"))==null)

if((file3=fopen("res","wt"))==null)

int i,j,k;

for(i=0;i

fclose(file1);

for(i=0;i

fclose(file2);

for(i=0;i

fclose(file3);

}2. 序列計算矩陣相乘**:

#include

#include

#include

#include

#include

#include

/*定義矩陣中元素的上限,避免相乘後溢位*/

#define range 150

/*矩陣a有m行n列,矩陣b有n行m列*/

#define m 200

#define n 300

int matrixa[m][n];

int matrixb[n][m];

int arr[m][m][n];

int res[m][m]=;

void *func(void *arg);

void put();

main()

{ //隨即產生兩個矩陣

int i,j,k;

srand((unsigned)time(null));

for(i=0;i for(j=0;jmatrixa[i][j] = rand()%range;

for(i=0;i for(j=0;jmatrixb[i][j] = rand()%range;

clock_t start=clock();//開始計時

for(i=0;i for(j=0;jfor(k=0;kres[i][j]+=matrixa[i][k]*matrixb[k][j

clock_t finish=clock();//結束計算

printf("序列計算用時%.2f秒\n",(long)(finish-start)/1e6);

C 程式設計報告

中國地質大學 北京 計結課報 告課程班別名 0401042任課教師 陳春麗 主講教師 學院 資訊工程學院專業 電氣工程及其自動化 學生姓名 xx學號 2009.12.13 c 程式設計結課報告 內容摘要 c 語言是從c語言的基礎上發展而來的功能齊全 移植性較好 物件導向的中級程式語言。運用以掌握的c...

程式設計報告一

利用長度為6的一維陣列儲存要處理的資料,第乙個空間放要進行比較的數字,後面的空間放與之進行比較的資料.利用total變數儲存最後的計算結果.利用for和if語句進行迴圈與判斷,如果數字比要比較的數字大的話,total就加上那個數字,最後輸出total的值.程式有乙個函式其中有乙個scanf函式負責從...

CC 程式設計報告

大連理工大學c c 語言程式設計報告 圖書資訊管理系統設計 學生姓名 院系 班級 學號聯絡 email 完成日期 首先簡述設計目標 選題意義與要實現的系統功能描述。格式是每段落首行縮排2個漢字,字型 宋體,字型大小 小四,行距 多倍行距 1.25,間距 前段 後段均為0行,取消網格對齊選項。此處簡述...