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=%lld\n",sum);
    printf("parallel time=%d\n",t2-t1);
    
    sum=0;
    t1=clock();
    for(long i=0;i<=1e9;++i)
        sum+=i;
    t2=clock(); 
    printf("sum=%lld\n",sum);
    printf("serial time=%d\n",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=%lld\n",sum);
    printf("parallel time=%d\n",t2-t1);

    sum=0;
    t1=clock();
    for(long i=0; i<=1e9; ++i)
        sum+=i;
    t2=clock();
    printf("sum=%lld\n",sum);
    printf("serial time=%d\n",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=%lld\n",sum);
    printf("parallel time=%d\n",t2-t1);
    sum=0;
    t1=clock();
    for(long i=0; i<=1e9; ++i)
        sum+=i;
    t2=clock();
    printf("sum=%lld\n",sum);
    printf("serial time=%d\n",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=%lld\n",sum);
    printf("parallel time=%d\n",t2-t1);

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


output:1219 2922

output:1250 2922

output:1250 2906

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值