hw1.c

来自「使用OpenMP」· C语言 代码 · 共 109 行

C
109
字号
#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 + =
减小字号Ctrl + -
显示快捷键?