實驗目的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行,取消網格對齊選項。此處簡述...