大矩阵相乘-openMP

源代码
#include
#include "omp.h"
#include
#include
#include

#define N 2000
int A[N][N],B[N][N];
int result_p[N][N];//parallel
int result_s[N][N];//serial

//矩阵产生函数,通过改变rand函数模值改变矩阵的稠密
void generate_matrix(int n)
{
int i,j;
memset(result_p,0,sizeof(result_p));
memset(result_s,0,sizeof(result_s));
srand((unsigned int)time(NULL));
for(i=0;i
{
for(j=0;j
{
A[i][j] = rand() 0;//稀疏
B[i][j] = rand() 0;
}
}
}

//串行处理程序
void serial_bigmmult(int n)
{
int i,j,k;
int time;
struct timespec time1 = {0, 0};
    struct timespec time2 = {0, 0};
clock_gettime(CLOCK_REALTIME, &time1);
printf("sec num: %d nsec num:   %d\n",time1.tv_sec,time1.tv_nsec);
//clock_t startTime , endTime;
//startTime = clock();
for (i=0;i
{
for(j=0;j
{
result_s[i][j]=0;
for(k=0;k
{
result_s[i][j]+=A[i][k]*B[k][j];
}
}
}
clock_gettime(CLOCK_REALTIME, &time2);
    printf("sec num: %d nsec num: %d\n",time2.tv_sec,time2.tv_nsec);
    printf("serial time: %d ms\n",(time2.tv_sec-time1.tv_sec)*1000+(time2.tv_nsec-time1.tv_nsec)/1000000);
///endTime = clock();
//time = endTime - startTime;
//printf("serial use time = %d ms\n",time);
}

//结果正确性对比函数
int is_result_correct(int n)
{
int i,j;
for(i=0;i
{
for(j=0;j
{
if(result_p[i][j] != result_s[i][j])return 0;
}
}
return 1;
}

//openMP并行程序
void omp_bigmmult(int n,int thread)
{
int i,j,k;
int time;
//clock_t startTime , endTime;
omp_set_num_threads(thread);
struct timespec time1 = {0, 0};
    struct timespec time2 = {0, 0};
clock_gettime(CLOCK_REALTIME, &time1);
printf("sec num: %d nsec num:   %d\n",time1.tv_sec,time1.tv_nsec);
//startTime = clock();
//创建并行区域
#pragma omp parallel shared(A,B,result_p) private(i,j,k) 
{
#pragma omp for schedule(dynamic)
for (i=0;i
{
for(j=0;j
{
result_p[i][j]=0;
for(k=0;k
{
result_p[i][j]+=A[i][k]*B[k][j];
}
}
}
}
printf("%d\n",omp_get_num_procs());
clock_gettime(CLOCK_REALTIME, &time2);
    printf("sec num: %d nsec num: %d\n",time2.tv_sec,time2.tv_nsec);
    printf("parallel time: %d ms\n",(time2.tv_sec-time1.tv_sec)*1000+(time2.tv_nsec-time1.tv_nsec)/1000000);
//endTime = clock();
//time = endTime - startTime;
//printf("parallel use time = %d ms\n",time);
}

int main(int argc, char* argv[])
{
int n, thread;
if(scanf("%d%d",&n,&thread)!=EOF)
{
generate_matrix(n);
omp_bigmmult(n,thread);
serial_bigmmult(n);
if(is_result_correct(n))printf("result correct\n");
else printf("wrong answer\n");
}
return 0;
}


编译命令
gcc -fopenmp -c omp_matrix_multiply.c 
gcc -fopenmp omp_matrix_multiply.o -o bts
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值