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
相關文章
- (Python程式設計 | 系統程式設計 | 並行系統工具 | 程式退出)Python程式設計並行
- 並行程式設計並行行程程式設計
- 最簡單的C程式設計--順序程式設計C程式程式設計
- .NET併發程式設計-資料並行程式設計並行
- 順序程式設計習題程式設計
- python的順序程式設計Python程式設計
- 碼農很多,但程式設計師並不多......程式設計師
- 高效能運算-openmp程式設計-深入理解(for-collapse)程式設計
- MPI矩陣向量乘法程式碼《並行程式設計導論》矩陣並行行程程式設計
- Python並行程式設計Python並行行程程式設計
- sql?server?累計求和實現程式碼簏攔SQLServer
- GPU程式設計(四):並行規約優化GPU程式設計並行優化
- 併發程式設計-6.並行程式設計概念程式設計並行行程
- 1.3順序結構程式設計程式設計
- 無程式碼程式設計程式設計
- 併發程式設計-8.並行資料結構和並行Linq程式設計並行資料結構
- Go包中程式碼執行順序Go
- Python 並不合適職場程式設計,SPL 才行Python程式設計
- .NET併發程式設計-任務函式並行程式設計函式並行
- 【程式設計測試題】素數對、不要二、求和程式設計
- 線性表的順序儲存C++程式碼C++
- 小程式 LRU 儲存設計
- 程式設計師是怎麼存檔並管理檔案版本的?程式設計師
- 入門程式碼程式設計程式設計
- java類內部程式碼執行順序Java
- 程式雖小,智慧並存
- 一行 Python 程式碼實現並行Python並行
- .NET併發程式設計-TPL Dataflow並行工作流程式設計並行
- 如何從初級程式設計師順利晉升到高階程式設計師?程式設計師
- iOS程式設計師如何成為程式設計高手,並以此創業iOS程式設計師創業
- C#並行,多執行緒程式設計並行集合和PLINQ的例項講解並行執行緒程式設計
- 如何順利通過程式設計面試程式設計面試
- Python程式設計:探索有趣的程式碼設計模式Python程式設計設計模式
- Java普通程式碼塊,構造程式碼塊,靜態程式碼塊區別,執行順序的程式碼例項Java
- 手機pydroid3,手機上的小程式碼,創造程式設計大世界程式設計
- C#並行Parallel程式設計模型實戰技巧手冊C#並行Parallel程式設計模型
- 深入C#並行程式設計(1) -- 瞭解執行緒C#並行行程程式設計執行緒
- LR.Net解放程式設計師雙手的自動生成程式碼程式設計師
- 線性表的順序儲存C++程式碼實現C++