⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hw1.c

📁 使用OpenMP
💻 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 + -