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;
}
执行结果: