資源簡介
OpenMP實現矩陣乘法,通過C語言編程,通過控制矩陣規模和計算量的調整觀察并行計算的加速比!研究生高性能計算的基礎實驗

代碼片段和文件信息
#include?“stdafx.h“
#include?
#include?
#include?
int?*generate_martix(int?mint?n);//聲明矩陣生成函數
void?show_martix(int?*arrint?mint?n);//聲明矩陣顯示函數
void?multi_martix(int?*arr1int?*arr2int?mint?n);//聲明矩陣乘法函數
int?main(int?argcchar?*argv[]){
int?rowcolumn;//矩陣行、列
printf(“二維數組的行數(m):“);
scanf(“%d“&row);
printf(“二維數組的列數(n):?“);
scanf(“%d“&column);
int?*martix1*martix2;
martix1=generate_martix(rowcolumn);//創建矩陣
martix2=generate_martix(columnrow);//創建矩陣
//show_martix(martix1rowcolumn);
//printf(“\n“);
//show_martix(martix2columnrow);
int?compute_scale;//矩陣乘法計算次數
printf(“請輸入矩陣乘法計算次數:“);
scanf(“%d“&compute_scale);
omp_set_num_threads(thread_num);
int?start=0;
int?end=0;
//開啟一個線程
omp_set_num_threads(1);
start=omp_get_wtime()*1000;
//int?count=0;
//printf(“運行多線程前時間(單位ms):%d\n“start);
#pragma?omp?parallel?for
for(int?i=0;i {
multi_martix(martix1martix2rowcolumn);//進行矩陣乘法
//count++;
}
//printf(“矩陣計算次數=%d\n“count);
end=omp_get_wtime()*1000;
//printf(“運行多線程后時間(單位ms):%d\n“end);
printf(“開啟一個線程的運行時間(單位ms):%d\n“end-start);
//開啟兩個線程
omp_set_num_threads(2);
start=omp_get_wtime()*1000;
#pragma?omp?parallel?for
for(int?i=0;i {
multi_martix(martix1martix2rowcolumn);//進行矩陣乘法
}
end=omp_get_wtime()*1000;
printf(“開啟兩個線程的運行時間(單位ms):%d\n“end-start);
//開啟四個線程
omp_set_num_threads(4);
start=omp_get_wtime()*1000;
#pragma?omp?parallel?for
for(int?i=0;i {
multi_martix(martix1martix2rowcolumn);//進行矩陣乘法
}
end=omp_get_wtime()*1000;
printf(“開啟四個線程的運行時間(單位ms):%d\n“end-start);
//開啟八個線程
omp_set_num_threads(8);
start=omp_get_wtime()*1000;
#pragma?omp?parallel?for
for(int?i=0;i {
multi_martix(martix1martix2rowcolumn);//進行矩陣乘法
}
end=omp_get_wtime()*1000;
printf(“開啟八個線程的運行時間(單位ms):%d\n“end-start);
//開啟十六個線程
omp_set_num_threads(16);
start=omp_get_wtime()*1000;
#pragma?omp?parallel?for
for(int?i=0;i {
multi_martix(martix1martix2rowcolumn);//進行矩陣乘法
}
end=omp_get_wtime()*1000;
printf(“開啟十六個線程的運行時間(單位ms):%d\n“end-start);
system(“pause“);
return?0;
}
//矩陣生成函數
int?*generate_martix(int?mint?n){
int?*tmp;
tmp=(int?*)malloc(sizeof(int)*m*n);
for(int?i=0;i for(int?j=0;j tmp[i*n+j]=i*(j+1)+1;//按此規則生成二維數組的各項
}
}
return?tmp;
}
//矩陣乘法函數
void?multi_martix(int?*arr1int?*arr2int?mint?n){
int?temp=0;
int?c[256][256];//最大運算256*256規模的矩陣
for(int?i=0;i for(int?j=0;j for(int?k=0;k temp?+=arr1[i*n+k]*arr2[k*m+j];
}
//printf(“temp=%d\n“temp);
c[i][j]?=?temp;
//printf(“%5d“?c[i][j]);
temp=0;//清理temp值
}
//printf(“\n“);
}
}
//矩陣顯示函數
void?show_martix(int?*arrint?mint?n){
for(in
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2017-09-25?20:49??OPenMP實現矩陣乘法\
?????文件??????182353??2017-09-23?10:46??OPenMP實現矩陣乘法\OpenMP實現矩陣乘法.docx
?????文件????????3513??2017-09-19?16:50??OPenMP實現矩陣乘法\OpenMP實現矩陣乘法.cpp
- 上一篇:灰度共生矩陣vs2010+opencv2
- 下一篇:c++筆試面試基礎
評論
共有 條評論