📄 hw1.c
字号:
#include <omp.h>
#include <sys/time.h>
#include "stdio.h"
//#default (shared | none)
float dot_prod_reduction(float* a, float* b, long N){
double sum = 0.0;
#pragma omp parallel for reduction(+:sum)
for(long i=0; i<N; i++) {
sum+=a[i]*b[i];
}
return sum;
}
float dot_prod_critical(float* a, float* b, long N){
double sum = 0.0;
#pragma omp parallel for shared(sum)
for(long i=0; i<N; i++) {
#pragma omp critical
sum+=a[i] * b[i];
}
return sum;
}
float dot_prod_atomic(float* a, float* b, long N){
double sum = 0.0;
#pragma omp parallel for shared(sum)
for(long i=0; i<N; i++) {
#pragma omp atomic
sum+=a[i] * b[i];
}
return sum;
}
float dot_prod_schedule(float* a, float* b, long N){
double sum = 0.0;
#pragma omp parallel for schedule(static) reduction (+:sum)
for(long i=0; i<N; i++) {
sum+=a[i] * b[i];
}
return sum;
}
float dot_prod_single(float* a, float* b, long N){
double sum = 0.0;
for(long i=0; i<N; i++) {
sum+=a[i] * b[i];
}
return sum;
}
int main(int argc,char* argv[])
{
float a[1000000],b[1000000];
long N,i,j;int nthd;
for (i=0;i<1000000;++i) {a[i]=1;b[i]=1;}
N=1000;
struct timeval tstart,tend;
double sum,timeuse;
for(j=0;j<3;++j){
N=N*10;
printf("N=%ld\n",N);
timeuse=0.0;sum=0.0;
gettimeofday(&tstart,NULL);
sum=dot_prod_single(a, b, N);
gettimeofday(&tend,NULL);
timeuse=1000000* (double) (tend.tv_sec-tstart.tv_sec) + (double)(tend.tv_usec-tstart.tv_usec);
timeuse=timeuse/1000.;
printf("Single Time:%lf\n",timeuse);
nthd=1;
for(i=0;i<4;++i){
nthd=nthd*2;
printf("number of Thread:%d\n",nthd);
omp_set_num_threads(nthd);
timeuse=0.0;sum=0.0;
gettimeofday(&tstart,NULL);
sum=dot_prod_reduction(a, b, N);
gettimeofday(&tend,NULL);
timeuse=1000000* (double) (tend.tv_sec-tstart.tv_sec) + (double)(tend.tv_usec-tstart.tv_usec);
timeuse=timeuse/1000.;
printf("Red Time:%lf ",timeuse);
timeuse=0.0;sum=0.0;
gettimeofday(&tstart,NULL);
sum=dot_prod_critical(a, b, N);
gettimeofday(&tend,NULL);
timeuse=1000000* (double) (tend.tv_sec-tstart.tv_sec) + (double)(tend.tv_usec-tstart.tv_usec);
timeuse=timeuse/1000.;
printf("Cri Time:%lf ",timeuse);
timeuse=0.0;sum=0.0;
gettimeofday(&tstart,NULL);
sum=dot_prod_schedule(a, b, N);
gettimeofday(&tend,NULL);
timeuse=1000000* (double) (tend.tv_sec-tstart.tv_sec) + (double)(tend.tv_usec-tstart.tv_usec);
timeuse=timeuse/1000.;
printf("Sch Time:%lf ",timeuse);
timeuse=0.0;sum=0.0;
gettimeofday(&tstart,NULL);
sum=dot_prod_atomic(a, b, N);
gettimeofday(&tend,NULL);
timeuse=1000000* (double) (tend.tv_sec-tstart.tv_sec) + (double)(tend.tv_usec-tstart.tv_usec);
timeuse=timeuse/1000.;
printf("Ato Time:%lf\n",timeuse);
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -