天天看点

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并行程序编译执行语句

继续阅读