并行编程环境设置和编译示例

合集下载

Linux下的软件开发和编译环境配置

Linux下的软件开发和编译环境配置

Linux下的软件开发和编译环境配置在Linux操作系统中,配置适合软件开发和编译的环境是非常重要的。

正确地设置开发环境,可以提高开发效率,同时确保软件的质量和稳定性。

本文将介绍如何在Linux下配置软件开发和编译环境,以帮助开发人员顺利进行开发工作。

一、安装必要的开发工具在开始配置软件开发环境之前,您需要安装一些必要的开发工具。

在Linux中,常用的开发工具包括GCC编译器、Make工具、调试器(如GDB)、版本控制工具(如Git)等。

您可以通过包管理器(如APT、YUM等)来安装这些工具。

以下是安装这些工具的示例命令(以基于Debian的系统为例):```sudo apt-get updatesudo apt-get install build-essentialsudo apt-get install gdbsudo apt-get install git```通过执行这些命令,您可以安装所需的开发工具,以便后续的配置步骤。

二、配置开发环境要配置软件开发环境,您需要设置一些环境变量和配置文件。

以下是一些常见的配置步骤:1. 配置PATH环境变量在Linux中,PATH环境变量用于指定可执行程序的搜索路径。

为了方便地访问开发工具和编译器,您应该将它们所在的目录添加到PATH环境变量中。

您可以通过编辑`.bashrc`文件来实现这一点。

打开终端,输入以下命令编辑文件:```vi ~/.bashrc```在文件末尾添加以下行(假设开发工具的路径为`/usr/local/bin`):```export PATH=$PATH:/usr/local/bin```保存并退出文件。

然后,使用以下命令使更改生效:```source ~/.bashrc```现在,您可以在任何目录下直接运行开发工具和编译器。

2. 配置编辑器选择一个适合您的编辑器来编写代码是很重要的。

在Linux中有多种编辑器可供选择,如Vim、Emacs、Sublime Text等。

MPI并行程序设计实例教程

MPI并行程序设计实例教程

编辑推荐◆书中内容侧重于以MPI库为基础开发并行应用程序,对MP规范定义的各项功能和特征在阐述其特点基础上均配以实例加以说明和印证。

◆书中所附实例尽量采用独立的功能划分,其中的代码片段可直接用于并行应用程序开发 ◆在讲述基本原理的同时,注重对各项消息传递和管理操作的功能及局限性、适用性进行分析从而使熟读此书的读者能够编写出适合应用特点,易维护、高效率的并行程序。

◆与本书配套的电子教案可在清华大学出版社网站下载。

本书简介本书旨在通过示例全面介绍MP1并行程序开发库的使用方法、程序设计技巧等方面的内容,力争完整讨论MP1规范所定义的各种特征。

主要也括MPI环境下开发并行程序常用的方法、模式、技巧等内容。

在内容组织上力求全面综合地反映MPl-1和MPI-2规范。

对MPI所定义的各种功能、特征分别给出可验证和测试其工作细节的示例程序目录第1章 MPI并行环境及编程模型 1.1 MPICH2环境及安装和测试 1.1.1 编译及安装 1.1.2 配置及验汪 1.1.3 应用程序的编译、链接 1.1.4 运行及调试 1.1.5 MPD中的安全问题 1.2 MPI环境编程模型 1.2.1 并行系统介绍 1.2.2 并行编程模式 1.2.3 MPI程序工作模式 1.3 MPI消息传递通信的基本概念 1.3.1 消息 1.3.2 缓冲区 1.3.3 通信子 1.3.4 进样号和进程纰 1.3.5 通价胁议 1.3.6 隐形对象第2章 点到点通信 2.1 阻糍通信 2.1.1 标准通信模式 2.1.2 缓冲通信模式 2.1.3 就绪通信模式 2.1.4 同步通信模式 2.1.5 小结 2.2 非阻塞通信 2.2.1 通信结束测试 2.2.2 非重复的非阻塞通信 2.2.3 可醺复的非阻塞通信 2.2.4 Probe和Cancel 2.3 组合发送接收 2.3.1 MPl_Send,MPI_RecvoMPl_Sendreev 2.3.2 MPI_Bsend←→MPl_Sendrecv 2.3.3 MPI_Rsend←→MPI_Sendrecv 2.3.4 MPl_Ssend←→MPl_Sendrecv 2.3.5 MPl_lsend←→MP1一Sendrecv 2.3.6 MPl_Ibsend←→MPI_Sendrecv 2.3.7 MPI_Irsend←→MPI_Sendrecv 2.3.8 MPl_Issend,MPI_Irecv←→MPI_Sendrecv 2.3.9 MPI Send_init←→MPl_Sendrecv 2.3.10 MPI一Bsendj init←→MPl_Sendrecv 2.3.11 MPI_Rsend_init←→MPI_Sendrecv 2.3.12 MPl_Ssend_init,MPl_Recv_init←→MPl_Sendrecv 2.4 点到点通信总结 2.4.1 关于预防死锁 2.4.2 关于阻塞与非阻塞、同步与异步 2.4.3 关于操作的执行顺序及“公平性”第3章 组与通信子 3.1 简介 3.2 组管理API 3.2.1 组的构建及取消 3.2.2 访问组的相关信息和属性 3.3 组问通信 3.3.1 创建与取消 3.3.2 访问通信子信息 3.4 组间通信 3.4.1 访问函数 3.4.2 构造和取消函数 3.5 属性 3.5.1 创建及释放属性操作 3.5.2 访问属性操作 3.5.3 设置及删除属性操作 3.5.4 命名通信子对象 3.6 错误处理 3.7 组及通信子的小结第4章 集合通信 4.1 1←→N 4.1.1 MPI_Bcast 4.1.2 MPI_Scatter/MPI_Scatterv 4.2 N←→1 4.2.1 MPl_Gather/MPI_Gatherv 4.2.2 MPI_Reduce 4.3 N←→N 4.3.1 MPI_Allgather/MPI_Allgatherv. 4.3.2 MPI_Allreduce 4.3.3 MPl_Reduce scatter 4.3.4 MPI_Alltoall/MPI Alltoallv/MPI_Alltoallw 4.3.5 MPI_Scan/MPI_Exscan 4.4 同步操作--MPI_Barrier第5章 数据类型 5.1 类型图 5.2 与数据类型相关的API函数 5.2.1 创建 5.2.2 访问 5.2.3 注册与取消 5.3 数据类型在通信函数缓冲区的构成 5.4 数据类型的属性 5.4.1 属性创建与释放 5.4.2 属性操作 5.4.3 复制数据类型 5.4.4 类型属性举例 5.4.5 数据类型命名 5.5 数据类型的析构 5.5.1 获取创建数据类型MPI函数所使用参数数量信息 5.5.2 获取创建数据类型MPI函数所使用实际参数信息 5.5.3 示例 5.6 打包/解包第6章 进程拓扑第7章 动态进程管理第8章 单向通信/远端内存访问第9章 并行I/O第10章 MPI与外部环境的信息交互第11章 MPE参考文献下载后 点击此处查看更多内容。

intelvisualfortran在visualstudio中如何正常的使用openmp并行程序

intelvisualfortran在visualstudio中如何正常的使用openmp并行程序

intelvisualfortran在visualstudio中如何正常的使⽤openmp并⾏程序在vs中利⽤ivf进⾏openmp的程序设计⼀:设置成openmp的可使⽤配置我的配置是IVF11.1,vstudio2008,Openmp3,进⼊代码界⾯后要设置属性,---fortran--language--process--OpenMp Dirctives为Generate parallel code如图所⽰:右键/属性这个并⾏的问题,我研究了很长时间,⾸先你要明确以下⼏点才能并⾏:1 你的计算机是双核以上的2 计算机的系统是64位的如XP64位(原因是现在的CPU多是采⽤64位架构,因此系统也要是64位的0,当然23位的也是可以的。

关键是确定你的cpu和对应的ivf3 你所⽤的IVF有64位组件,也异是在安装时会有64MT。

(在安装的过程中可以看到这个组件的安装)4 在IVF中要配置参数,project--(×)properties/fortran/language/process/openMP Directives ——generate parallelcode(Qopenmp)5 你的程序可以并⾏,即程序中有可以并⾏的地⽅,前后没有逻辑关系基本上把这⼏点弄懂了,差不多可以进⾏简单的并⾏计算了program main!*****************************************************************************8 0!!! MAIN is the main program for TEST_OMP.!! Discussion:!! TEST_OMP estimates the value of PI.!! This program uses Open MP parallelization directives.!! It should run properly whether parallelization is used or not.!! However, the parallel version computes the sum in a different! order than the serial version; some of the quantities added are! quite small, and so this will affect the accuracy of the results.!! Modified:! Author:!! John Burkardt!! A FORTRAN 90 module may be available:!! use omp_lib!! A FORTRAN 77 include file may be available:!! include 'omp_lib.h'!implicit noneinteger, parameter :: r4_logn_max = 9integer idinteger nthreadsinteger omp_get_num_procsinteger omp_get_num_threadsinteger omp_get_thread_numcall timestamp ( )write ( *, '(a)' ) ' 'write ( *, '(a)' ) 'TEST_OMP'write ( *, '(a)' ) ' FORTRAN90 version'write ( *, '(a)' ) ' 'write ( *, '(a)' ) ' Estimate the value of PI by summing a series.'write ( *, '(a)' ) ' 'write ( *, '(a)' ) ' This program includes Open MP directives, which' write ( *, '(a)' ) ' may be used to run the program in parallel.' write ( *, '(a)' ) ' 'write ( *, '(a)' ) ' The number of processors available:'write ( *, '(a,i8)' ) ' OMP_GET_NUM_PROCS () = ', omp_get_num_procs ( ) nthreads = 4write ( *, '(a)' ) ' 'write ( *, '(a,i8,a)' ) ' Call OMP_SET_NUM_THREADS, and request ', &nthreads, ' threads.'! Note that the call to OMP_GET_NUM_THREADS will always return 1! if called outside a parallel region!!!$OMP parallel private ( id )id = omp_get_thread_num ( )write ( *, '(a,i3)' ) ' This is process ', idif ( id == 0 ) thenwrite ( *, '(a)' ) ' 'write ( *, '(a)' ) ' Calling OMP_GET_NUM_THREADS inside a 'write ( *, '(a)' ) ' parallel region, we get the number of'write ( *, '(a,i3)' ) ' threads is ', omp_get_num_threads ( )write ( *, '(a)' ) ' 'end if!$OMP end parallelcall r4_test ( r4_logn_max )write ( *, '(a)' ) ' 'write ( *, '(a)' ) 'TEST_OMP'write ( *, '(a)' ) ' Normal end of execution.'write ( *, '(a)' ) ' 'call timestamp ( )stopendsubroutine r4_test ( logn_max )!*****************************************************************************8 0!!! R4_TEST estimates the value of PI using single precision.!! Discussion:!! PI is estimated using N terms. N is increased from 10^2 to 10^LOGN_MAX.! The calculation is repeated using both sequential and Open MP enabled code. ! Wall clock time is measured by calling SYSTEM_CLOCK.!! 06 January 2003!! Author:!! John Burkardt!implicit noneinteger clock_maxinteger clock_rateinteger clock_startinteger clock_stopreal errorreal estimateinteger logninteger logn_maxcharacter ( len = 3 ) modeinteger nreal r4_pireal timewrite ( *, '(a)' ) ' 'write ( *, '(a)' ) 'R4_TEST:'write ( *, '(a)' ) ' Estimate the value of PI,'write ( *, '(a)' ) ' using single precision arithmetic.'write ( *, '(a)' ) ' 'write ( *, '(a)' ) ' N = number of terms computed and added;' write ( *, '(a)' ) ' 'write ( *, '(a)' ) ' ESTIMATE = the computed estimate of PI;' write ( *, '(a)' ) ' 'write ( *, '(a)' ) ' ERROR = ( the computed estimate - PI );'write ( *, '(a)' ) ' 'write ( *, '(a)' ) ' TIME = elapsed wall clock time;'write ( *, '(a)' ) ' 'write ( *, '(a)' ) ' Note that you can''t increase N forever, because:'write ( *, '(a)' ) ' B) maximum integer size is a problem.'write ( *, '(a)' ) ' 'write ( *, '(a,i12)' ) ' The maximum integer:' , huge ( n )write ( *, '(a)' ) ' 'write ( *, '(a)' ) ' 'write ( *, '(a)' ) ' N Mode Estimate Error Time' write ( *, '(a)' ) ' 'n = 1do logn = 2, logn_maxmode = 'OMP'call system_clock ( clock_start, clock_rate, clock_max )call r4_pi_est_omp ( n, estimate )call system_clock ( clock_stop, clock_rate, clock_max )time = real ( clock_stop - clock_start ) / real ( clock_rate )error = abs ( estimate - r4_pi ( ) )write ( *, '( i12, 2x, a3, 2x, f14.10, 2x, g14.6, 2x, g14.6 )' ) &n, mode, estimate, error, timen = n * 10end doreturnendsubroutine r4_pi_est_omp ( n, estimate )!*****************************************************************************8 0 !!! R4_PI_EST_OMP estimates the value of PI, using Open MP.!! Discussion:!! The calculation is based on the formula for the indefinite integral:!! Integral 1 / ( 1 + X**2 ) dx = Arctan ( X )!! Hence, the definite integral!! Integral ( 0 <= X <= 1 ) 1 / ( 1 + X**2 ) dx!! A standard way to approximate an integral uses the midpoint rule.! If we create N equally spaced intervals of width 1/N, then the! midpoint of the I-th interval is!! X(I) = (2*I-1)/(2*N).!! The approximation for the integral is then:!! Sum ( 1 <= I <= N ) (1/N) * 1 / ( 1 + X(I)**2 )!! In order to compute PI, we multiply this by 4; we also can pull out! the factor of 1/N, so that the formula you see in the program looks like: !! ( 4 / N ) * Sum ( 1 <= I <= N ) 1 / ( 1 + X(I)**2 )!! Until roundoff becomes an issue, greater accuracy can be achieved by ! increasing the value of N. !! Modified:!! 06 January 2003!! Author:!! John Burkardt!! Parameters:!! Input, integer N, the number of terms to add up.!! Output, real ESTIMATE, the estimated value of pi.!implicit nonereal hinteger nreal sum2real xh = 1.0E+00 / real ( 2 * n )sum2 = 0.0E+00!!$OMP parallel do private(x) shared(h) reduction(+: sum2)!do i = 1, nx = h * real ( 2 * i - 1 )sum2 = sum2 + 1.0E+00 / ( 1.0E+00 + x**2 )end doestimate = 4.0E+00 * sum2 / real ( n )returnendfunction r4_pi ( )!*****************************************************************************8 0 !!! R4_PI returns the value of pi.!! Modified:!! 02 February 2000!! Author:!! John Burkardt!! Parameters:!! Output, real R4_PI, the value of pi.!implicit noner4_pi = 3.14159265358979323846264338327950288419716939937510E+00 returnendsubroutine timestamp ( )!*****************************************************************************8 0!!! TIMESTAMP prints the current YMDHMS date as a time stamp.!! Example:!! May 31 2001 9:45:54.872 AM!! Modified:!! 31 May 2001!! Author:!! John Burkardt!! Parameters:!! None!implicit nonecharacter ( len = 8 ) ampminteger dcharacter ( len = 8 ) dateinteger hinteger minteger mmcharacter ( len = 9 ), parameter, dimension(12) :: month = (/ &'January ', 'February ', 'March ', 'April ', &'May ', 'June ', 'July ', 'August ', &integer ninteger scharacter ( len = 10 ) timeinteger values(8)integer ycharacter ( len = 5 ) zonecall date_and_time ( date, time, zone, values ) y = values(1)m = values(2)d = values(3)h = values(5)n = values(6)s = values(7)mm = values(8)if ( h < 12 ) thenampm = 'AM'else if ( h == 12 ) thenif ( n == 0 .and. s == 0 ) thenampm = 'Noon'elseampm = 'PM'end ifelseh = h - 12if ( h < 12 ) thenampm = 'PM'else if ( h == 12 ) thenif ( n == 0 .and. s == 0 ) thenampm = 'Midnight'elseampm = 'AM'end ifend ifend iftrim ( month(m) ), d, y, h, ':', n, ':', s, '.', mm, trim ( ampm ) returnend!===================================== COPY上⾯的程序,可以完全运⾏成功,运⾏界⾯如下:。

Windows平台Compaq Visual Fortran 6.6 并行编程环境的配置

Windows平台Compaq Visual Fortran 6.6 并行编程环境的配置

各版本MPICH2下载地址:/research/projects/mpich2/index.php*如果下不来换搜狗浏览器外网加速下。

如果本机上没有安装过Microsoft .NET .Framework,安装mpich2时,会提示安装,2.0版本以上的都行,然后把mpich2-1.2.1装上。

在Windows下安装此程序,其默认安装目录为C:\ProgramFiles\MPICH2。

安装成功后,在此目录下有四个子目录,分别为bin,example,include和lib。

其中bin目录下有两个执行文件:smpd.exe和mpiexec.exe。

在“我的电脑”环境变量设置中将bin目录写入路径path变量,这样就可以在任何地方执行此目录下的文件了。

*1、准备工作(1) 将{MPICH_root} \Include和{MPICH_root} \Lib目录下的所有文件分别拷贝到{Microsoft Visual Studio}\Df98\Include和{Microsoft Visual Studio}\Df98\Lib 目录下;(2) 将{MPICH_root}\Bin加入到系统的PATH环境变量中。

如:将路径C:\Program Files\MPICH2\include添加到环境变量path 中。

右击“我的电脑”->“属性”->“高级”选项卡->环境变量->双击PATH,添加C:\Program Files\MPICH2\include。

(3)打开CVF,在Tools->Options->Directories的Include files和Library files中分别添加mpich2的include和lib路径。

2、编译、链接MPI应用程序为了方便使用Visual Fortran 6.x编译器进行并行程序编译链接,在第一次使用其编译程序前,可以增加一个Fortran项目环境:(1) 点击菜单File->New...;(2) 在Projects标签中选择Fortran Console Application,然后在右侧输入新项目名称,点OK;(3) 在接下来的对话框中选择An empty project,点击Finish;(4) 在接下来的对话框中直接点击OK;(5) 点击菜单Project->Settings...,进行下面操作:I、在setting for中,选择Win32 debug;II、选择Fortran标签,在Category一栏中选择“External Procedures”,在“Argument Passing”一栏中选择“C, By Reference”;在“String Length Argument”一栏中选择“After All Args”;III、在C/C++ 标签,在Category一栏中选择“Preprocessor”,将“C:\mpich2\include”添加到“Additional include directories”中。

oneapi编译过程

oneapi编译过程

oneapi编译过程摘要:一、前言二、oneAPI 的概述三、oneAPI 的编译过程1.安装oneAPI2.配置环境变量3.编译器与工具链的选择4.编译示例程序5.编译结果与分析四、总结正文:oneAPI 是一个由Intel 公司开发的用于并行编程的应用程序接口(API),它可以帮助开发人员更加高效地编写并行应用程序。

在本文中,我们将详细介绍oneAPI 的编译过程。

首先,我们需要安装oneAPI。

你可以从Intel 官方网站上下载最新版本的oneAPI,并按照官方文档的指引进行安装。

安装完成后,接下来需要配置环境变量。

在安装oneAPI 的过程中,会自动设置一些环境变量,例如:oneAPI_ROOT、oneAPI_INSTALL_DIR 等。

你需要确保这些环境变量在你的系统路径中。

在编译之前,还需要选择合适的编译器和工具链。

Intel 提供了多种编译器和工具链供开发者选择,例如:Intel C++ Compiler、Intel Fortran Compiler 等。

你可以根据项目需求和个人喜好选择合适的编译器和工具链。

下面我们以编译一个简单的示例程序为例,来演示oneAPI 的编译过程。

假设我们已经编写好了一个名为“example.cpp”的程序,接下来需要对这个程序进行编译。

1.使用以下命令打开终端:```cd /path/to/your/oneAPI/installation```2.选择合适的编译器,例如:Intel C++ Compiler:```icpc example.cpp -o example```3.编译完成后,可以使用以下命令运行编译后的程序:```./example```4.编译结果会在终端中显示,你可以根据输出结果对程序进行调试和优化。

总之,oneAPI 的编译过程包括安装、配置环境变量、选择编译器和工具链、编译程序等步骤。

PLC步进编程应用—并行分支编程方法

PLC步进编程应用—并行分支编程方法

X2
S27
Y4
右限位X4
右移Y4 X4
对应梯形图
M8002 SET S0
S0 X5 RST Y1
RST Y0
Y2 X6
RST Y3
Y4 X0 X4 X2 Y1
SRY S20 S20
Y0
X1
S21
SET S21
T0 K10
SET Y1
T0 SET S22
S22 S23 S24 S25
S26 S27
END
(4) 并行分支、汇合编程应注意的问题
②并行分支与汇合流程中,并联分支后面不能使用选择转移条件※,在转移 条件*后不允许并行汇合,如下图(a)所示,应改成图 (b)后,方可编程。
【应用系统设计】 简易红绿灯控制系统
选择分支与汇合流程设计
项目说明:
①若方式选择开关(COS)置于手动方式,当按下START启动后,
状态编程思想在非状态元件编程中的应用
一、 用辅助继电器实现状态编程
左图为小 车往返辅助 继电器状态 编程梯形图
辅助继电 器实现的状 态编程方法, 同基本指令 梯形图的编 程完全相同。
注意!
在设计每个工序的梯形图时,应将前工序辅助继 电器的复位操作放在本工序负载驱动的前面,防止 编程时出现逻辑错误,导致控制混乱。
②因为只有一个放在工件补充位置的PH0来侦测工件的有无,而另 外的钻孔、测孔及搬运位置并没有其他传感装置,那么应如何得知相 应位置有无工件呢?本题所使用的方式是为工件补充、钻孔、测孔及 搬运设置4个标志,即M10-M13。当PH0侦测到传送带送来的工件时,则设 定M10为1,当转盘转动后,用左移指令将M10-M13左移一个位元,亦即 M11为1,钻孔机因此标志为1而动作。其他依此类推,测孔机依标志M12 动作、包装搬运依M13动作。

在C++中实现并行计算和并行算法

在C++中实现并行计算和并行算法

在C++中实现并行计算和并行算法并行计算和并行算法是指通过同时运行多个计算任务来提高计算效率的一种计算方法。

在C++中,可以使用多线程、OpenMP和MPI等工具实现并行计算和并行算法。

1.多线程:C++提供了多线程编程的支持,可以使用std::thread库来创建和管理线程。

多线程可以将一个计算任务划分为多个子任务,在多个线程中同时执行,从而提高计算效率。

下面以一个简单的例子来说明多线程的使用:```cpp#include <iostream>#include <thread>//子线程执行的函数void task(int id) {std::cout << "Thread " << id << " is running" <<std::endl;int main() {const int numThreads = 4;std::thread threads[numThreads];//创建多个线程,并分配不同的子任务for (int i = 0; i < numThreads; ++i) { threads[i] = std::thread(task, i);}//等待所有线程执行完毕for (int i = 0; i < numThreads; ++i) { threads[i].join();}return 0;}运行这段代码,我们可以看到输出结果显示了四个线程同时执行的情况。

2. OpenMP:OpenMP是一种并行编程接口,可以在C++中使用它来实现并行计算。

OpenMP提供了一系列的指令和函数,可以在循环、函数和代码段等级别上实现并行化。

下面是一个使用OpenMP实现的并行循环的例子:```cpp#include <iostream>#include <omp.h>int main() {const int size = 100;int arr[size];//使用OpenMP并行化循环初始化数组#pragma omp parallel forfor (int i = 0; i < size; ++i) { arr[i] = i;}//输出数组的内容for (int i = 0; i < size; ++i) { std::cout << arr[i] << " ";if (i % 10 == 9) {std::cout << std::endl;}}return 0;}```运行结果显示数组中的元素是按照顺序初始化的,这表明循环在多个线程中并行执行。

openmp用法

openmp用法

openmp用法OpenMP是一种支持共享内存多线程编程的标准API。

它提供了一种简单而有效的方法,用于在计算机系统中利用多核和多处理器资源。

本文将逐步介绍OpenMP的用法和基本概念,从简单的并行循环到复杂的并行任务。

让我们一步一步来学习OpenMP吧。

第一步:环境设置要开始使用OpenMP,我们首先需要一个支持OpenMP的编译器。

常见的编译器如GCC、Clang和Intel编译器都支持OpenMP。

我们需要确保在编译时启用OpenMP支持。

例如,在GCC中,可以使用以下命令来编译包含OpenMP指令的程序:gcc -fopenmp program.c -o program第二步:并行循环最简单的OpenMP并行化形式是并行循环。

在循环的前面加上`#pragma omp parallel for`指令,就可以让循环被多个线程并行执行。

例如,下面的代码演示了如何使用OpenMP并行化一个简单的for循环:c#include <stdio.h>#include <omp.h>int main() {int i;#pragma omp parallel forfor (i = 0; i < 10; i++) {printf("Thread d: d\n", omp_get_thread_num(), i);}return 0;}在上面的例子中,`#pragma omp parallel for`指令会告诉编译器将for 循环并行化。

`omp_get_thread_num()`函数可以获取当前线程的编号。

第三步:数据共享与私有变量在并行编程中,多个线程可能会同时访问和修改共享的数据。

为了避免数据竞争和不一致的结果,我们需要显式地指定哪些变量是共享的,哪些变量是私有的。

我们可以使用`shared`和`private`子句来指定。

`shared`子句指定某个变量为共享变量,对所有线程可见。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

并行编程环境设置和注意事项
一.远程登陆服务器
请同学们使用服务器分配的原始密码通过SSH工具登陆到实验集群bl6000的登陆节点:202.38.192.99,然后使用命令passwd对初始密码进行修改。

PS:Linux下密码不可见。

接着在自己的账号下使用命令mkdir分别建立2个目录:OpenMP,MPI用来存放不同实验数据和代码。

二.设置编译环境
使用命令vi ~/.bash_profile设置环境变量,添加路径如下文,然后使用. ~/.bash_profile(注意~前有个点+空格)使设置生效,整个操作过程如下:
[zhaotiezhu@bl6000 ~]$ vi ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=/opt/gcc-4.2.4/bin:/opt/mpich-1.2.7pl/bin:/opt/intel/Compiler/11.0/069/bin/ia32:$PATH:$H OME/bin:/usr/sbin
LD_LIBRARY_PA TH=/opt/gcc-4.2.4/lib64:$LD_LIBRARY_PA TH:opt/mpich-1.2.7pl/lib/:/opt/in tel/Compiler/11.0/069/lib/ia32
export PATH
export LD_LIBRARY_PA TH
unset USERNAME
[zhaotiezhu@bl6000 ~]$. ~/.bash_profile
然后使用which mpirun命令检测路径,如果屏幕显示/opt/mpich/gnu/bin/mpirun表明设置成功。

如下所示:
[zhaotiezhu@bl6000~]# which mpirun
/opt/mpich-1.2.7pl/bin/mpirun
三.跳转计算节点
本次实验除了bl6000的登陆头节点(202.38.192.99)还有4个计算节点,分别是:
c0-0, c0-1, c0-2, c0-3
使用命令ssh可以从当前节点转到计算节点,例如ssh c0-1则可从当前节点转到计算节点c0-1,其他如此类推。

MPI实验在登陆节点上运行程序一定要加-nolocal或者-machinefile 参数,禁止使用登陆节点计算。

四.清除异常进程
请明确你的程序在哪个节点上运行,万一出现问题你必须停止(kill)该节点上的
程序进程。

请不定时对你所在的节点进行查询,以观测你的进程是否还在上面正常运行,命令如下(使用自己的用户名取代username):ps -aux | grep username
另外,对出现问题的进程必须停止,命令如下(pid为进程号): kill -9 pid
五.清除异常信号量
上传附录中的清除信号量文件夹里的cleanipc.sh脚本到自己的帐号下,在各个计算节点使用。

首先,可以在头节点可以使用命令cluster-fork ipcs -a命令检查自己是否在所有计算节点还存在大量残留信号量。

然后使用ssh跳转到各个计算节点。

不要忘记用命令chmod 777 cleanipc.sh使得Shell脚本可读写运行(文件颜色从黄色变为绿色)
使用方法:
1.进入到每一个计算节点清除残余进程。

.
2.使用./cleanipc清除信号量,用ipcs能看到是否还存有残余的信号量,其他节点也一样
3.对所有还存在残余信号量的计算节点(共4个)都进行一次以上步骤,完成清除工作. 六.编译运行OpenMP程序
以OpenMP实验附录的程序Helloworld.c为例:
[zhaotiezhu@bl6000 ~]$ cd OpenMP/
[zhaotiezhu@bl6000 OpenMP]$ ls
Helloworld.c
[zhaotiezhu@bl6000 OpenMP]$ icc -openmp -o Helloworld Helloworld.c
Helloworld.c(10): (col. 1) remark: OpenMP DEFINED REGION WAS PARALLELIZED. [zhaotiezhu@bl6000 OpenMP]$ ssh c0-0
[zhaotiezhu@compute-0-0 ~]$ cd OpenMP/
[zhaotiezhu@compute-0-0 OpenMP]$ ls
Helloworld Helloworld.c
[zhaotiezhu@compute-0-0 OpenMP]$ ./Helloworld
Hello, world from OMP thread0
Number of threads 4
Hello, world from OMP thread1
Hello, world from OMP thread3
Hello, world from OMP thread2
七.编译运行MPI程序
编译:mpicc src.c 或者mpicxx src.cpp
默认用gcc作为编译器,一般mpicc –O2 可获得不错的优化后的程序
运行:mpirun [参数] [执行文件]
-nolocal参数,不要在frontend上执行计算任务。

-np 参数,指定进程数目
-machinefile参数,指定机器,推荐使用该参数,可以避免信号传输过程中的一些错误。

默认使用/opt/mpich/gnu/share/machinefile.LINUX
Mpirun –machinefile myfile,其中myfile指定自己想要按顺序执行的机器目录,例如格式为:compute-0-3.local
compute-0-2.local
compute-0-1.local
顺序可以自由设置,若不使用,mpich将机械地从头(节点0)开始选择机器。

高级:可使用SGE、PBS乃至ganglia来生成machinefile,自动选择较为不忙的机器)
以OpenMP实验附录的cannon.c(-lm是因为使用了math类库)为例:
[zhaotiezhu@bl6000 MPI]$mpicc –o cannon cannon .c –lm
[zhaotiezhu@ bl6000 MPI]$mpirun -nolocal –np 4 cannon 10
在mpirun命令之前加上time即可计算程序执行实际时间:
[zhaotiezhu@ bl6000 MPI $time mpirun –nolocal –np 4 cannon 10
另外不想程序从屏幕输出矩阵浪费大量时间的可以通过重定向解决,如下:
[zhaotiezhu@ bl6000 MPI]$mpirun –machinefile myfile –np 9 cannon 400 > 400.txt
八.一些MPI程序常见问题
1、p4_error: semget failed for setnum: 0
原因:MPI程序没有正常退出,占用信号量没有释放
检查:ipcs –s
对策:杀死程序,清除异常进程和异常信号量。

需要同时清理frontend和计算节点的。

2、P4_GLOBMEMSIZE (in bytes); the current size is 4194304
Killed by signal 2.
原因:需要大容量共享内存通信
对策:export P4_GLOBMEMSIZE=较大数值
3、SIGSEGV
原因:程序本身有问题,一般为数组、指针越界
对策:修改程序。

相关文档
最新文档