概述
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求和(顺手存代码)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复