天天看點

OpenMP并行程式編譯執行語句

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());

執行結果為:

OpenMP并行程式編譯執行語句

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;
}
           

執行結果:

OpenMP并行程式編譯執行語句

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;
}
           

執行結果:

OpenMP并行程式編譯執行語句

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;
}
           

執行結果:

OpenMP并行程式編譯執行語句

繼續閱讀