(原创)OpenMP并行编程简易教程(一)
作者:mobiledu2502891487 | 来源:互联网 | 2017-07-23 10:53
(原创)OpenMP并行编程简易教程(一)--Linux通用技术-Linux编程与内核信息,下面是详情阅读。
近来在学校做实习,需要使用OpenMP来优化一些SAT问题的算法,便接触到了OpenMP,它是基于多处理器的,分享同一内存的,并行的编程模式。对于多核的CPU计算机,仅需要通过增加简单的语句,便可以得到立竿见影的性能提升。
本文教程由自己的学习笔记而来,通过4个例子简单的阐述OpenMP的基本编程语句。
例子1 helloworld.c
01 #include
02 int main( argc, argv)
03 int argc;
04 char **argv;
05 {
06 #pragma omp parallel
07 printf( "Hello world!\n" );
08 return 0;
09 }
程序helloworld.c的本质就是在屏幕上打印字符串”Hello world!”。
”#pragma omp parallel”是一条OpenMP标准的语句,它的含义是让它后面的语句按照多线程来执行。需要注意的是每个线程都去做相同的事情。
[root@localhost zf]# gcc ?fopenmp helloworld.c
[root@localhost zf]# ./a.out
Hello world!
编译,执行程序。屏幕上打印出了一遍”Hello world”。
-fopenmp 是gcc编译支持OpenMP程序的参数,gcc4.2以上的版本默认支持OpenMP。
由于系统环境变量中的NUM_OMP_THREADS的值默认为1,所以程序在执行的时候只使用了一个线程来执行。
[root@localhost zf]# NUM_OMP_THREADS=5
[root@localhost zf]# export NUM_OMP_THREADS
[root@localhost zf]# ./a.out
Hello world!
Hello world!
Hello world!
Hello world!
Hello world!
给表示线程数量的环境变量NUM_OMP_THREADS赋值为5并导出,再执行程序,得到5遍的”Hello world!”,说明程序将打印语句用5个线程分别执行了一遍。
当然,我们不希望受到运行系统环境变量的限制,所以我们也可以通过替换06行代码为” #pragma omp parallel num_threads(10)”,编译之后再执行程序,我们得到10遍的”Hello world!”,这时无论环境变量NUM_OMP_THREADS的值为多少,我们依然只能得到10遍的”Hello world!”。
例子2 RankNum.c
01 #include
02 #include
03 int main( int argc, char **argv)
04 {
05 int rank, size;
06 #pragma omp parallel private(rank)
07 {
08 rank= omp_get_thread_num();
09 size= omp_get_num_threads();
10 printf( "Hello world! I'm %d of %d\n", rank, size );
11 }
12 return 0;
13 }
导入omp.h文件以支持OpenMP的函数。
函数omp_get_threads_num() 返回当前的线程标号。函数omp_get_num_threads() 返回当前的线程数量。(不再程序中定义线程数,使用环境变量中的数据,当前是10)
[root@localhost zf]# gcc ?fopenmp RankNum.c
[root@localhost zf]# ./a.out
Hello world! I’m 8 of 10
Hello world! I’m 0 of 10
Hello world! I’m 4 of 10
Hello world! I’m 6 of 10
Hello world! I’m 3 of 10
Hello world! I’m 2 of 10
Hello world! I’m 7 of 10
Hello world! I’m 1 of 10
Hello world! I’m 9 of 10
Hello world! I’m 5 of 10
编译,执行,得到10条输出,10个线程分别执行了打印语句。
线程执行的顺序随机,与编号无关。
未完待续……
注:本文源于Robert Roy博士的教学教案(法语),如有人感兴趣可以发邮件向我索要教案原文。
推荐阅读
-
在给定的数组中,除了一个数字外,其他所有数字都是相同的。任务是找到这个唯一的不同数字。例如,findUniq([1, 1, 1, 2, 1, 1]) 返回 2,findUniq([0, 0, 0.55, 0, 0]) 返回 0.55。 ...
[详细]
蜡笔小新 2024-12-27 12:19:16
-
本文探讨了卷积神经网络(CNN)中感受野的概念及其与锚框(anchor box)的关系。感受野定义了特征图上每个像素点对应的输入图像区域大小,而锚框则是在每个像素中心生成的多个不同尺寸和宽高比的边界框。两者在目标检测任务中起到关键作用。 ...
[详细]
蜡笔小新 2024-12-27 12:03:44
-
-
通过Google工程师的专业视角,带你系统掌握算法的核心概念与实践技巧。 ...
[详细]
蜡笔小新 2024-12-26 16:49:25
-
本文深入探讨了 Python 列表切片的基本概念和实际应用,通过具体示例展示了不同切片方式的使用方法及其背后的逻辑。 ...
[详细]
蜡笔小新 2024-12-26 16:46:25
-
本文详细介绍了K-Medoids聚类算法,这是一种基于划分的聚类方法,适用于处理大规模数据集。文章探讨了其优点、缺点以及具体实现步骤,并通过实例进行说明。 ...
[详细]
蜡笔小新 2024-12-26 16:43:45
-
本文探讨如何利用人工智能算法自动区分网页是详情页还是列表页,介绍具体的实现思路和技术细节。 ...
[详细]
蜡笔小新 2024-12-26 16:00:58
-
本文探讨了 C++ 中普通数组和标准库类型 vector 的初始化方法。普通数组具有固定长度,而 vector 是一种可扩展的容器,允许动态调整大小。文章详细介绍了不同初始化方式及其应用场景,并提供了代码示例以加深理解。 ...
[详细]
蜡笔小新 2024-12-26 15:38:03
-
本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ...
[详细]
蜡笔小新 2024-12-26 15:32:56
-
本文介绍了一种通过逐对比较线段来求解交点的简单算法。此外,还提到了一种基于排序的方法,但该方法较为复杂,尚未完全理解。文中详细描述了如何根据线段端点求交点,并判断交点是否在线段上。 ...
[详细]
蜡笔小新 2024-12-26 14:48:56
-
友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ...
[详细]
蜡笔小新 2024-12-26 14:11:47
-
本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ...
[详细]
蜡笔小新 2024-12-26 13:30:37
-
本文介绍了一款用于帝国CMS的多图上传插件,该插件通过Flash技术实现批量图片上传功能,显著提升了多图上传效率。文章详细说明了插件的安装、配置和使用方法。 ...
[详细]
蜡笔小新 2024-12-26 13:30:01
-
当在Windows 10系统中遇到无法正确加载ICA文件的情况时,可以通过下载并安装Citrix Receiver,并将其设置为ICA文件的默认打开方式来解决问题。具体操作步骤包括找到ICA文件,选择合适的打开程序路径(通常是C:\Program Files (x86)\Citrix\ICA Client\wfcrun32.exe),并确保该程序被设为始终使用。 ...
[详细]
蜡笔小新 2024-12-26 12:36:21
-
本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ...
[详细]
蜡笔小新 2024-12-26 12:24:25
-
本文探讨了图数据库及其技术生态系统在知识表示和推理问题上的应用。通过理解图数据结构,尤其是属性图的特性,可以为复杂的数据关系提供高效且优雅的解决方案。我们将详细介绍属性图的基本概念、对象建模、概念建模以及自动推理的过程,并结合实际代码示例进行说明。 ...
[详细]
蜡笔小新 2024-12-26 12:11:47
-
mobiledu2502891487
这个家伙很懒,什么也没留下!