该程序以素数计算为例子,比较了串行程序和并行程序的效率。并且比较了不同调度类型对程序的影响。
/*
* prime.c
*
* Created on: 2018-3-17
* Author: ljh
*/
#include <stdio.h>
#include <omp.h>
#include <math.h>
#include <sys/time.h>
struct timeval time1,time2;
double time_used;
void timestart() //时间开始
{
gettimeofday(&time1,NULL);
}
void timeend() //时间结束
{
gettimeofday(&time2,NULL);
time_used = (time2.tv_sec-time1.tv_sec)+(time2.tv_usec-time1.tv_usec)/1000000;//转换成毫秒
}
int prime(int number) //计算素数函数
{
int tmp = sqrt(number);
int i;
for(i = 2;i<= tmp;i++)
if(number % i == 0)
return 0;
return 1;
}
void prime_serial(int number) //串行版本的素数计算
{
int i;
for(i = 2; i<= number; i++)
prime( i);
//if(prime(i))
//printf("%d ",i);
// printf( "\n");
}
void prime_parallel(int number) //并行版本的素数计算
{
int i;
//static类型调度
timestart();
#pragma omp parallel for schedule(static,25000)
for(i = 2;i < number; i++)
prime( i);
/* {
if(prime(i))
printf("%d ",i);
}*/
timeend();
printf("static cost:%lf\n",time_used);
//动态类型调度
timestart();
#pragma omp parallel for schedule(dynamic,25000)
for(i = 2;i < number; i++)
prime( i);
/* {
if(prime(i))
printf("%d ",i);
}*/
timeend();
printf("dynamic cost:%lf\n",time_used);
//duided类型调度
timestart();
#pragma omp parallel for schedule(guided,1)
for(i = 2;i < number; i++)
prime( i);
/* {
if(prime(i))
printf("%d ",i);
}*/
timeend();
printf("guided cost:%lf\n",time_used);
}
int main()
{
int number = 10000000;
timestart();
prime_serial(number);
timeend();
printf("serial cost:%lf\n",time_used);
prime_parallel(number);
return 0;
}
编译:
gcc -g -o prime prime.c
结果:
serial cost:6.000000
static cost:3.000000
dynamic cost:2.000000
guided cost:3.000000