OpenMP并行程式設計基礎
實驗目的
(1)掌握OpenMP基礎知識
(2)掌握OpenMP并行程式設計方法
1、單獨使用parallel
編譯制導指令以#pragma omp 開始,後邊跟具體的功能指令,格式如:
#pragma omp 指令[子句],[子句] …]
parallel :用在一個結構塊之前,表示這段代碼将被多個線程并行執行;
#include "stdafx.h"
#include "omp.h"
int _tmain(int argc, _TCHAR* argv[]){
printf("Hello from serial.\n");
printf("Thread number = %d\n", omp_get_thread_num()); //串行執行
#pragma omp parallel num_threads(4) //開始并行執行,四個線程并行執行
{
printf("Hello from parallel. Thread number = %d\n", omp_get_thread_num());
}
printf("Hello from serial again.\n");
return 0;
}
該例并行執行代碼為: printf(“Hello from parallel. Thread number = %d\n”, omp_get_thread_num());
執行結果為:
2、單獨使用for
for:用于for循環語句之前,表示将循環計算任務配置設定到多個線程中并行執行,以實作任務分擔,必須由程式設計人員自己保證每次循環之間無資料相關性;
// openmp2.cpp : 單獨使用for
//
#include "stdafx.h"
#include "omp.h"
#include "windows.h"
int _tmain(int argc, _TCHAR* argv[]){
#pragma omp for
for (int j = 0; j < 4; j++ ){
printf("j = %d, ThreadId = %d\n", j, omp_get_thread_num());
}
system("pause");
return 0;
}
執行結果:
3、parallel和for聯合使用
parallel for :parallel和for指令的結合,也是用在for循環語句之前,表示for循環體的代碼将被多個線程并行執行,它同時具有并行域的産生和任務分擔兩個功能;
此外parallel和for分開使用時parallel塊裡可以有多個for
// openmp3.cpp : parallel和for聯合使用
//
#include "stdafx.h"
#include "omp.h"
#include "windows.h"
int _tmain(int argc, _TCHAR* argv[]){
#pragma omp parallel for
for (int j = 0; j < 4; j++ ){
printf("j = %d, ThreadId = %d\n", j, omp_get_thread_num());
}
system("pause");
return 0;
}
執行結果:
4、并行區域與循環并行化的差別
并行區域采用複制執行的方式
程式并行化采用工作配置設定的方式
// openmp4.cpp :
//并行區域與循環并行化的差別
//把程式3改寫,去掉for指令。
//運作下面的程式:
//
#include "stdafx.h"
#include "omp.h"
#include "windows.h"
int _tmain(int argc, _TCHAR* argv[]){
#pragma omp parallel
for (int j = 0; j < 4; j++ ){
printf("j = %d, ThreadId = %d\n", j, omp_get_thread_num());
}
system("pause");
return 0;
}
執行結果: