我是靠谱客的博主 深情爆米花,最近开发中收集的这篇文章主要介绍OpenMP并行程序设计-1e9求和(顺手存代码),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1、使用并行区域方法进行求和

// x.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "time.h"
#include "windows.h"
#include "omp.h"
#define NUM_THREADS 2
int _tmain(int argc, _TCHAR* argv[])
{
    omp_set_num_threads(NUM_THREADS);
    long long sum=0;
    long long sumtmp[NUM_THREADS];
    clock_t t1=clock();
    
    #pragma omp parallel
    {
        long i;
        long id=omp_get_thread_num();
        long long temp=0l;
        
        for(i=id;i<=1e9;i=i+NUM_THREADS)
            temp+=i;
        sumtmp[id]=temp;
    }
    for(long i=0;i<NUM_THREADS;++i)
        sum+=sumtmp[i];
    
    clock_t t2=clock();
    printf("sum=%lldn",sum);
    printf("parallel time=%dn",t2-t1);
    
    sum=0;
    t1=clock();
    for(long i=0;i<=1e9;++i)
        sum+=i;
    t2=clock(); 
    printf("sum=%lldn",sum);
    printf("serial time=%dn",t2-t1);
	system("pause");
	return 0;
}


output:1234 2407

output:1250 2406

output:1250 2391

2、for指令方法进行求和

// x.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "time.h"
#include "windows.h"
#include "omp.h"
#define NUM_THREADS 2
int _tmain(int argc, _TCHAR* argv[])
{
    omp_set_num_threads(NUM_THREADS);
    long long sum=0;
    long long sumtmp[NUM_THREADS];
    clock_t t1=clock();

    #pragma omp parallel
    {
        long i;
        long id=omp_get_thread_num();
        long long temp=0l;

        #pragma omp for
        for(i=1; i<=1000000000; ++i)//不能写成1e9
            temp+=i;
        sumtmp[id]=temp;
    }
    for(long i=0; i<NUM_THREADS; ++i)
        sum+=sumtmp[i];

    clock_t t2=clock();
    printf("sum=%lldn",sum);
    printf("parallel time=%dn",t2-t1);

    sum=0;
    t1=clock();
    for(long i=0; i<=1e9; ++i)
        sum+=i;
    t2=clock();
    printf("sum=%lldn",sum);
    printf("serial time=%dn",t2-t1);
    system("pause");
    return 0;
}


output:1328 2406

output:1328 2390

3、reduction子句方法进行求和

// x.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "time.h"
#include "windows.h"
#include "omp.h"
#define NUM_THREADS 2
int _tmain(int argc, _TCHAR* argv[])
{
    clock_t t1=clock();
    omp_set_num_threads(NUM_THREADS);
    long long sum=0;

    #pragma omp parallel for reduction(+:sum)
    for(long i=1; i<=1000000000; ++i)//不能写成1e9
        sum+=i;
    clock_t t2=clock();
    printf("sum=%lldn",sum);
    printf("parallel time=%dn",t2-t1);
    sum=0;
    t1=clock();
    for(long i=0; i<=1e9; ++i)
        sum+=i;
    t2=clock();
    printf("sum=%lldn",sum);
    printf("serial time=%dn",t2-t1);
    system("pause");
    return 0;
}

 


output:1344 2390

output:1328 2406

4、临界区方法进行求和

// x.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "time.h"
#include "windows.h"
#include "omp.h"
#define NUM_THREADS 2
int _tmain(int argc, _TCHAR* argv[])
{
    omp_set_num_threads(NUM_THREADS);
    long long sum=0;
    long long sumtmp[NUM_THREADS];
    clock_t t1=clock();

    #pragma omp parallel
    {
        long i;
        long id=omp_get_thread_num();
        long long sumtmp=0;

        for(i=id+1; i<=1e9; i=i+NUM_THREADS)
            sumtmp+=i;
        #pragma omp critical
        sum+=sumtmp;
    }

    clock_t t2=clock();
    printf("sum=%lldn",sum);
    printf("parallel time=%dn",t2-t1);

    sum=0;
    t1=clock();
    for(long i=0; i<=1e9; ++i)
        sum+=i;
    t2=clock();
    printf("sum=%lldn",sum);
    printf("serial time=%dn",t2-t1);
    system("pause");
    return 0;
}


output:1219 2922

output:1250 2922

output:1250 2906

最后

以上就是深情爆米花为你收集整理的OpenMP并行程序设计-1e9求和(顺手存代码)的全部内容,希望文章能够帮你解决OpenMP并行程序设计-1e9求和(顺手存代码)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(30)

评论列表共有 0 条评论

立即
投稿
返回
顶部