没有合适的资源?快使用搜索试试~ 我知道了~
在C++中使用openmp进行多线程编程
5星 · 超过95%的资源 9 下载量 200 浏览量
2021-01-27
14:21:28
上传
评论
收藏 111KB PDF 举报
温馨提示
试读
5页
多线程在实际的编程中的重要性不言而喻。对于C++而言,当我们需要使用多线程时,可以使用boost::thread库或者自从C++ 11开始支持的std::thread,也可以使用操作系统相关的线程API,如在Linux上,可以使用pthread库。除此之外,还可以使用omp来使用多线程。它的好处是跨平台,使用简单。 在Linux平台上,如果需要使用omp,只需在编译时使用"-fopenmp"指令。在Windows的visual
资源推荐
资源详情
资源评论
在在C++中使用中使用openmp进行多线程编程进行多线程编程
前言
多线程在实际的编程中的重要性不言而喻。对于C++而言,当我们需要使用多线程时,可以使用boost::thread库或者自从C++
11开始支持的std::thread,也可以使用操作系统相关的线程API,如在Linux上,可以使用pthread库。除此之外,还可以使用
omp来使用多线程。它的好处是跨平台,使用简单。
在Linux平台上,如果需要使用omp,只需在编译时使用"-fopenmp"指令。在Windows的visual studio开发环境中,开启omp支
持的步骤为“项目属性 -> C/C++ -> 所有选项 -> openmp支持 -> 是(/openmp)”。
本文我们就介绍omp在C++中的使用方法。
c++ openmp入门简介
openmp是由一系列#paragma指令组成,这些指令控制如何多线程的执行程序。另外,即使编译器不支持omp,程序也也能
够正常运行,只是程序不会多线程并行运行。以下为使用omp的简单的例子:
以上代码会自动以多线程的方式运行for循环中的内容。如果你删除"#pragma omp parallel for"这行,程序依然能够正常运行,
唯一的区别在于程序是在单线程中执行。由于C和C++的标准规定,当编译器遇到无法识别的"#pragma"指令时,编译器自动
忽略这条指令。所以即使编译器不支持omp,也不会影响程序的编译和运行。
omp语法
所有的omp指令都是以"#pragma omp“开头,换行符结束。并且除了barrier和flush两个指令不作用于代码以外,其他的指令都
只与指令后面的那段代码相关,比如上面例子中的for循环。
parallel编译指示
parallel告诉编译器开始 一个并行块,编译器会创建一个包含N(在运行时决定,通常为硬件线程数)个线程的线程组,所有
线程都运行接下来的语句或者由”{...}"包含的代码块,在这执行结束之后,又回到主线程,创建的这N个线程会被回收。
以上代码在4双核4线程的cpu的电脑上运行时,输出了4行”parallel run!!!"。即编译器创建了一个包含4个线程的线程组来运行
这段代码。在这段代码运行结束后,程序执行回到主线程。GCC编译器的实现方式是在内部创建一个函数,然后将相关的执
行代码移至这个函数,这样一来代码块中定义的变量成为了线程的局部变量,互不影响。而ICC的实现方式是利用fork()来实
现。
线程之间共享的变量是通过传递引用或者利用register变量来实现同步的,其中register变量在代码执行结束之后或者在flush指
令调用时进行同步。
我们也可以利用if条件判断来决定是否对后续的代码采用并行方式执行,如:
在这个例子中,如果parallelism_enabled为false,那么这个for循环只会由一个线程来执行。
for指令
omp中的for指令用于告诉编译器,拆分接下来的for循环,并分别在不同的线程中运行不同的部分。如果for指令后没有紧接着
for循环,编译器会报错。例如,
以上的代码执行后,会打印出[0,9]这10个数字。但是它们的顺序是随机出现的,在我的电脑上,运行的输出是"0 1 2 8 9 6 7 3
4 5"。事实上,输出结果不会是完全随机的,输出的序列是局部有序的,因为在编译器对for循环的拆分相当于下面的代码:
以上代码中,omp_get_thread_num()用于获取当前线程在当前线程组中的序号;omp_get_num_threads()用于获取县城组中
的线程数。所以线程组中每个线程都运行了for循环中的不同部分。
这里提到for循环的不同部分在线程组中的不同线程中执行的,线程组是在程序遇到"#pragma omp parallel"时创建,在程序块
(parallel后的”{...}"或者语句)结束后,线程组中的只有一个主线程。因此上面示例中的代码事实上是以下代码的缩写:
此处的"#pragma omp for"即使在“#pragma omp parallel”指令创建的线程组中执行的。加入此处没有#pragma omp parallel指
令,那么for循环只会在主线程中执行。parallel指令所创建的线程组的线程数默认是有编译器决定的,我们也可以通过
num_threads指令来指定线程数,如”#pragma omp parallel num_threads(3)“即告诉编译器,此处需要创建一个包含3个线程的
线程组。
Schedule指令
Schedule指令提供对for指令中线程调度更多的控制能力。它有两种调度方式:static和dynamic。
static:每个线程自行决定要执行哪个块,即每个线程执行for循环中的一个子块。
dynamic:一个线程并不是执行for循环的一个子块,而是每次都向omp运行时库索取一个for循环中的迭代值,然后执行这次
迭代,在执行完之后再索取新的值。因此,线程有可能执行任意的迭代值,而不是一个子块。
weixin_38636671
- 粉丝: 6
- 资源: 929
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页