OpenMP並行程式設計-1e9求和(順手存程式碼)

kewlgrl發表於2016-09-28

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

相關文章