資源簡(jiǎn)介
OpenMP實(shí)現(xiàn)矩陣乘法,通過(guò)C語(yǔ)言編程,通過(guò)控制矩陣規(guī)模和計(jì)算量的調(diào)整觀察并行計(jì)算的加速比!研究生高性能計(jì)算的基礎(chǔ)實(shí)驗(yàn)

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