初步认识并行计算openmp

openmp

  1. openmp是一种内存共享的并行计算解决方案,用于单台多核计算机,采用fork-join多线程进行并行计算。为用户提供了编译指导语句运行时库函数
  2. MPI 则是非内存共享的并行计算解决方案,用于计算机群,多台计算机并行计算。

案例1

openmp.c文件内容如下,使用 gcc -fopenmp openmp.c -o openmp进行编译。

#include<stdio.h>
#include"omp.h"

int main(int argc, char * argv[]) {
	omp_set_num_threads(3);
#pragma omp parallel for
	for (int i = 0; i < 3; i++)
		printf("i = %d, I am Thread %d\n", i, omp_get_thread_num());
	getchar();
}

上述代码同:

#include<stdio.h>
#include"omp.h"

int main(int argc, char * argv[]) {
#pragma omp parallel for num_threads(3)
	for (int i = 0; i < 3; i++)
		printf("i = %d, I am Thread %d\n", i, omp_get_thread_num());
	getchar();
}

从结果可以看出,开了三个线程进行计算。库函数omp_set_num_threads(3);表示开启3个进程数。编译指令#pragma omp parallel for表对for开启多线程并行计算。

lmz@X280-1:~/桌面/code/c/test/openmp$ gcc -fopenmp openmp.c -o openmp
lmz@X280-1:~/桌面/code/c/test/openmp$ ./openmp 
i = 1, I am Thread 1
i = 0, I am Thread 0
i = 2, I am Thread 2

编译指导语句

#pragma omp 指令 [子句[子句]…]

指令

指令解释
parallel用在一个代码段之前,表示这段代码将被多个线程并行执行
for用于for循环之前,将循环分配到多个线程中并行执行,必须保证每次循环之间无相关性。
parallel forparallel 和 for语句的结合,也是用在一个for循环之前,表示for循环的代码将被多个线程并行执行
sections用在可被并行执行的代码段之前,用于实现多个结构块语句的任务分担,可并行执行的代码段各自用section指令标出(注意区分sections和section);
parallel sectionsparallel和sections两个语句的结合,类似于parallel for
critical用在一段代码临界区之前
single用在一段只被单个线程执行的代码段之前,表示后面的代码段将被单线程执行。
flush保证各个OpenMP线程的数据影像的一致性
barrier用于并行区内代码的线程同步,所有线程执行到barrier时要停止,直到所有线程都执行到barrier时才继续往下执行。
atomic用于指定一块内存区域被自动更新
master用于指定一段代码块由主线程执行
ordered用于指定并行区域的循环按顺序执行
threadprivate用于指定一个变量是线程私有的。

子句

子句解释
private指定一个或多个变量在每个线程中都有它自己的私有副本;
firstprivate指定一个或多个变量在每个线程都有它自己的私有副本,并且私有变量要在进入并行域或任务分担域时,继承主线程中的同名变量的值作为初值;
lastprivate是用来指定将线程中的一个或多个私有变量的值在并行处理结束后复制到主线程中的同名变量中,负责拷贝的线程是for或sections任务分担中的最后一个线程;
reduction用来指定一个或多个变量是私有的,并且在并行处理结束后这些变量要执行指定的归约运算,并将结果返回给主线程同名变量;
nowait指出并发线程可以忽略其他制导指令暗含的路障同步;
num_threads指定并行域内的线程的数目;
schedule指定for任务分担中的任务分配调度类型;
shared指定一个或多个变量为多个线程间的共享变量;
ordered用来指定for任务分担域内指定代码段需要按照串行循环次序执行;
copyprivate配合single指令,将指定线程的专有变量广播到并行域内其他线程的同名变量中;
copyin用来指定一个threadprivate类型的变量需要用主线程同名变量进行初始化;
default用来指定并行域内的变量的使用方式,缺省是shared。

运行时库函数

库函数解释
omp_get_num_procs返回运行本线程的多处理机的处理器个数。
omp_get_num_threads返回当前并行区域中的活动线程个数。
omp_get_thread_num返回线程号
omp_set_num_threads设置并行执行代码时的线程个数
omp_init_lock初始化一个简单锁
omp_set_lock上锁操作
omp_unset_lock解锁操作,要和omp_set_lock函数配对使用。
omp_destroy_lockomp_init_lock函数的配对操作函数,关闭一个锁
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值