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
相關文章
- 完數的OpenMP並行程式設計-平行計算並行行程程式設計
- OpenMP並行化例項----Mandelbrot集合並行化計算並行
- (Python程式設計 | 系統程式設計 | 並行系統工具 | 程式退出)Python程式設計並行
- 寫程式碼容易,程式設計並不容易程式設計
- 並行程式設計並行行程程式設計
- 最簡單的C程式設計--順序程式設計C程式程式設計
- 併發程式設計和並行程式設計程式設計並行行程
- .NET併發程式設計-資料並行程式設計並行
- 順序程式設計習題程式設計
- 碼農很多,但程式設計師並不多......程式設計師
- OpenMP平行計算程式設計-n以內的完數的個數程式設計
- sql?server?累計求和實現程式碼簏攔SQLServer
- GPU程式設計(四):並行規約優化GPU程式設計並行優化
- MPI矩陣向量乘法程式碼《並行程式設計導論》矩陣並行行程程式設計
- python的順序程式設計Python程式設計
- 1.3順序結構程式設計程式設計
- 併發程式設計-6.並行程式設計概念程式設計並行行程
- 《雲端程式碼:Google App Engine程式設計指南 》小編手記GoAPP程式設計
- Go包中程式碼執行順序Go
- 【程式設計測試題】素數對、不要二、求和程式設計
- .NET併發程式設計-任務函式並行程式設計函式並行
- Python 並不合適職場程式設計,SPL 才行Python程式設計
- 無程式碼程式設計程式設計
- Python並行程式設計Python並行行程程式設計
- 並行程式設計隨記並行行程程式設計
- 並口與程式設計 (轉)程式設計
- 線性表的順序儲存C++程式碼C++
- 併發程式設計-8.並行資料結構和並行Linq程式設計並行資料結構
- 如何順利通過程式設計面試程式設計面試
- js陣列求和程式碼例項JS陣列
- 程式設計師是怎麼存檔並管理檔案版本的?程式設計師
- java類內部程式碼執行順序Java
- 小程式 LRU 儲存設計
- PHP多程式並行執行php指令碼PHP並行指令碼
- 程式設計師如何成為程式設計高手,並以此創業程式設計師創業
- 程式雖小,智慧並存
- .NET併發程式設計-TPL Dataflow並行工作流程式設計並行
- 入門程式碼程式設計程式設計