linux n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
Linux 编程简介 PowerPoint Presentation
Download Presentation
Linux 编程简介

play fullscreen
1 / 63

Linux 编程简介

202 Views Download Presentation
Download Presentation

Linux 编程简介

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

  1. Linux编程简介 曙光信息产业(北京)有限公司 技术支持中心 赵崇山

  2. 第一章 Linux编程概述

  3. 并行程序开发环境 • 共享存储模型(Shared Memory) • 消息传递模型(Message Passing) • HPF(High Performance Fortran)

  4. 共享存储模型 • 特点: • 一个并行程序由多个共享内存的并行任务组成,数据的交换通过隐含地使用共享数据来完成。 • 一般仅需指定可以并行执行的循环,而不需考虑计算与数据如何划分,以及如何进行任务间通信,编译器会自动完成上述功能。 • OpenMP: • 目前流行的共享内存模型开发标准是OpenMP。 • OpenMP定义了一套编译指导语句,用于指定程序的并行性、数据的共享/私有等信息。其目标是为SMP系统提供可移植、可扩展的开发接口。 • OpenMP由OpenMP Architecture Review Board于1997年推出,现在已发展到2.0版。OpenMP支持的编程语言包括Fortran、C和C++。 • OpenMP得到了工业界的广泛支持,有大量的商业编译器和其他开发工具支持OpenMP的开发,如IBM、HP、Sun、SGI、Intel等硬件厂商均有支持OpenMP的编译器产品,另外还有一些第三方厂商的OpenMP编译器。

  5. 消息传递模型 • 特点: • 一个并行程序由多个并行任务组成 • 每个并行任务拥有自己的数据并对其进行计算操作 • 任务之间数据的交换是通过显式的消息传递语句来完成的 • 现在广泛使用的消息传递模型有两个:PVM和MPI • PVM即Parallel Virtual Machine(并行虚拟机) • MPI即Message Passing Interface(消息传递界面) • 几乎所有的高性能计算系统都支持PVM和MPI

  6. HPF • HPF(High Performance Fortran)的思想与OpenMP类似,都是通过定义编译指导语句来帮助编译器生成并行代码。 • HPF的目标系统与OpenMP不同,它支持DMP系统。因此,除了指定并行性的编译指导语句外,HPF还指定数据划分的编译指导语句。 • HPF与消息传递模型的不同之处则在于:HPF通过编译器来生成通信语句,不需要程序员手工编写。 • HPF得到了工业界的广泛支持,如IBM、HP、Sun都有HPF编译器。第三方产品则有PGI的PGHPF、APR的Forge xHPF等。其不足是对于某些问题无法得到与手工编写的消息传递程序相同的性能。

  7. 并行库 • 基本思想是:用户不需要自己编写通用的并行算法代码,而由程序库提供并行算法,并对用户透明。用户只需要根据自己的需求,调用相应的库函数,就可以编写出并行程序。 • 由于库函数的编写者一般经验丰富,而且库函数会采取较为优化的算法,并采用优化编译,使得库函数的执行效率很高。对于大量使用通用计算算法的用户来说,使用并行库是一种高效的开发模式。 • 并行库的缺点是无法帮助那些需要自己书写非通用并行算法的用户。

  8. 常用并行库 • 目前的并行库很多,包括PBLAS(Parallel Basic Linear Algebra Subroutines),以及建立在其基础上的LAPACK和ScaLAPACK,提供了一些线性代数问题的并行求解算法,如求特征值、最小二乘问题等。LAPACK是为SMP系统优化的,ScaLAPACK是为DMP系统优化的。大多数高性能计算系统都提供在本系统上优化的PBLAS、LAPACK、ScaLAPACK。 • 另一个著名的并行库是PETSc。PETSc是一套基于MPI的数据结构和库函数,用于解决基于偏微分方程的典型科学计算问题。 • MATLAB是很常用的科学计算软件。很多公司和研究机构也在进行并行化MATLAB的工作,如RTExpress。

  9. 开发工具 • 调试工具 • 性能分析与预测 • 资源管理和负载平衡系统

  10. 调试工具 • IBM的pdb(命令行方式)、pedb(Xwindow图形界面)、HP的DDE(XWindow图形界面)和LaDebug(用于Alpha系统)、Sun的Prism等 • Etnus公司的TotalView是最著名的第三方并行调试器。它提供对C、C++、Fortran程序的图形化符号调试,可以调试MPI、PVM、HPF、OpenMP程序,支持SGI、Sun、HP、IBM等几乎所有的高性能厂商的产品,还提供对Linux的支持。 • Intel公司的 Thread Analyzer是一个支持OpenMP的程序正确性检测工具,用于自动发现程序中的常见错误。它目前仅支持IA32和IA64上的Linux

  11. 性能分析与预测 • 程序性能分析(profiling)可以帮助用户找到程序中最费时的部分,从而集中精力进行改进和优化,是改进程序性能的有效手段 • 传统的性能分析工具一般仅提供子程序级的性能分析 • 但对于高性能程序来说,对于循环程序的性能分析是必不可少的。现有的大部分高性能计算系统中大都具有能够进行循环级性能分析的性能分析器,有些还提供了友好的用户界面,如Intel的VTune、IBM的Xprofiler等。 • 一些第三方厂商也提供性能分析工具,比如Pallas的Vampir,它支持从Linux PC到IBM、HP、Sun、SGI等几乎所有的高性能厂商的产品。

  12. 资源管理和负载平衡系统 • 严格地说负载平衡系统是运行时环境,而不是开发环境 • 对于SMP系统来说,操作系统内置的任务调度器可以完成任务的调度功能 • 对于DMP系统来说,需要专门的软件来进行任务调度,达到负载平衡和单一系统映象(SSI) • 负载平衡系统通过了解系统中各个结点的负载状况、计算能力、内存状况等,可以合理地分配任务的执行结点,必要时迁移现有的任务到其他结点,从而达到提高系统吞吐量的作用。 • 著名的负载平衡系统包括Platform公司的LSF(Load Sharing Facility)和Veridian的PBS(Portable Batch System)

  13. 串行程序自动并行化 • 优点:可以将现有的很多串行代码转换成并行代码 • 并行化分为全自动并行化和交互式并行化两种模式 • 全自动并行化的并行过程不需要人的干预,可以自动发现程序中可并行的部分,生成并行代码;对大多数程序来说,并行化的效果还不理想 • 交互式并行化工具通过给用户提供程序中的有效信息,包括相关性分析结果、程序调用图、性能预测结果等帮助用户进行并行化工作,但是如何更好地结合用户和并行化工具的能力还需要进一步研究。目前产品化的交互式并行化工具主要有APR的Forge,该系统支持Fortran77的并行化,并同时支持SMP系统和DMP系统。

  14. 发展趋势 • OpenMP将成为支持SMP系统编程的主要标准,将来的工作在于研究和开发更加有效的OpenMP编译器,以及更加强大友好的开发、调试工具 • MPI和PVM将仍然是DMP系统的主要标准 • 并行库是很有前途的开发方式和研究方向,随着更多的并行程序库的出现,并行化编程会越来越容易。 • 程序自动并行化技术也能大大缩短并行程序的开发时间,但目前的技术即使对SMP系统也没有达到实用的水平,还需要技术上的突破。 • 网格计算是现在的热门话题,也是将来高性能计算的发展方向之一。为网格计算制定标准,提供所需的开发环境和运行环境将是未来的发展方向。

  15. 第二章 vi编辑器快速入门

  16. Linux下的文本编辑器 Linux系统提供了一个完整的编辑器家族系列,如ed,ex,vi和emacs等,按功能它们可以分为两大类: • 行编辑器(Ed、Ex) • 全屏幕编辑器(vi、Emacs) vi简介vi是“visual interface”的简称。它可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需要对其进行定制,这是其他编辑程序所没有的。 vi不是一个排版程序,它不象Word或WPS那样可以对字体、格式、段落等其他属性进行编排,它只是一个文本编辑程序。vi没有菜单,只有命令,且命令繁多。vi有三种基本工作模式:命令模式、文本输入模式和末行模式。

  17. Vi的三种模式 命令模式  任何时候,不管用户处于何种模式,只要按一下<Esc>键,即可使vi进入命令模式;进入vi编辑器时,默认处于该模式下。  在该模式下,用户可以输入各种合法的vi命令,用于管理自己的文档。此时从键盘上输入的任何字符都被当做编辑命令来解释,若输入的字符是合法的vi命令,则vi在接受用户命令之后完成相应的动作。但需注意的是,所输入的命令并不在屏幕上显示出来。若输入的字符不是vi的合法命令,vi会响铃报警。文本输入模式  在命令模式下输入插入命令i、附加命令a 、打开命令o、修改命令c、取代命令r或替换命令s都可以进入文本输入模式。在该模式下,用户输入的任何字符都被vi当做文件内容保存起来,并将其显示在屏幕上。在文本输入过程中,若想回到命令模式下,按<Esc>键即可。末行模式 在vi中,命令通常是单个键,如i。在命令模式下,用户按“:”键即可进入末行模式下,此时vi会在屏幕的最后一行显示一个“:”作为末行模式的提示符,等待用户输入命令。多数文件管理命令都是在此模式下执行的(如把编辑缓冲区的内容写到文件中等)。末行命令执行完后,vi自动回到命令模式。  可按<Esc>键,或用退格键将输入的命令全部删除之后,再按一下退格键,即可使vi回到命令模式下。

  18. 三种模式之间的转换 Vi编辑器的三种工作模式之间的转换如下: 如果要从命令模式转换到编辑模式,可以键入命令a或者i;如果需要从文本模式返回,则按Esc键即可。在命令模式下输入“:”即可切换到末行模式,然后输入命令

  19. Vi的使用(1) 1. vi的启动和退出 1)vi的启动 • vi • vi file1 • vi + file1 定位在最后一行 • vi +N file1 2) vi的退出(即可切换到末行模式) • :w 或 :w filename • :wq • :x 或 :ZZ • :q! 或 :quit 2. vi的基本命令 1)插入 • i---光标前插入 • a---光标后插入 • o---行下新增一空行 • I---插于行首 • A---插于行尾 • O---行上新增一空行

  20. Vi的使用(2) 2)移动光标 • hjkl---左、下、上、右 • Ctrl+b ---往前一页 • Ctrl+f ---往后一页 • G ---移到文件最后 • w ---移到下个 word 的开头 • b ---跳至上个 wore 的开头 3)删除 • x ---删除所在位置的一个字符 • #x --- 5x 表示删除 5 个字符 • dd --- 删除光标所在之行 • #dd --- 例,5dd 表删除自光标算起之 5 行 • :1,#d ---删除行1至行#的文字 • X ---删除所在前面一个字符 • D ---删除至行尾 4)更改 • cw ----更改光标处之字到此一单字之字尾处 • c#w ----例,c3w表更改 3 个字 • cc ----修改行 • C ----替换到行尾

  21. Vi的使用(3) 5)取代 • r----取代光标处之字符 • R----取代字符直到按 ESC 为止 6)复制 • yw----拷贝光标处之字到字尾至缓冲区 • P ----把缓冲区之资料贴在所在行的后 • p ----把缓冲区之资料贴在所在行的前 • yy----拷贝光标所在之行至缓冲区 • #yy----5yy,拷贝光标所在之处以下5行至缓冲区 7)复原 u ----undo,复原至上一动作 8)跳至指定之行 g ----列出行号,及相关信息 8)重复上一个命令 . 3. vi的末行模式基本命令 使用前请先按 ESC 键确定在命令模式下按 ':' 或 '/' 或 '?' 叁键即可进入末行模式 1)列出行号 :set nu

  22. Vi的使用(4) 2)寻找字串 /word ( 由首至尾寻找 ),按 n 可往下继续找 ?word ( 由尾至首寻找 ),按 N 可往前继续找 3)跳行 :100 --- 可跳至第 100 行 4)替换字符串 :1,$ s/pattern1/pattern2/g 例1:从文件第一行至文件尾将大写A全部替换成小写 :1,$s /A/a/g 为精确查找和替换字符串可加入如下: ^ ---- 匹配行首 $ ---- 匹配行尾 \< ---- 匹配词首 \> ---- 匹配词尾 . ---- 匹配任意字符 4. 编辑多个文件 1)将一个文件插入另一个文件 :r filename 1)编辑多个文件 vi file1 file2 file3 通过 :n 文件名 切换

  23. 第三章 Shell编程

  24. 标准的shell变量 • 标准的shell变量,用set可以查看 HOME Home directory PWD Current working directory OLDPWD Previous working directory PATH Search command’s path PS1 指定主提示符 PS2 指定次提示 HISTFILE 记录历史的文件名 HISTSIZE 记录历史命令数 ENV bash environment file TERM 定义用户所用终端类型 VISUAL Defines the visual (screen) editor EDITOR Default editor (if VISUAL is not set)

  25. 标准输入、输出和出错 • 标准的 I/O • stdin (标准输入):缺省的命令输入处 代码为0 • stdout (标准输出): 缺省的命令输出都到这里. 代码为1 • stderr (标准的错误输出): 所有的错误信息都输出到这里 代码为2 Find / -name mtod 2>/dev/null 1>/root/c 查找mtod文件名,把相关错误信息抛出,正确信息写入到c 文件内。

  26. 进程间通信—重定向 • 输出重定向 • 重写:cat “export PATH=/opt/mpi/bin:$PATH” > .bashrc • 追加:mpirun –np 4 –machinefile ./ma ./vasp >> out.log • 输出全部: ./a.out >> output.log 2>&1 • 输入重定向: ./a.out < input.file • 输入输出重定向: ./mdrun < input.file >> output.log 2>&1

  27. 进程间通信—管道 • 管道是UNIX IPCC(InterProcess Communication)的最老形式,并且所有UNIX系统都提供此种通信机制,管道有两种限制: • 它们是半双工的。数据只能在一个方向上流动 • 它们只能在具有公共祖先的进程之间使用。通常,一个管道由一个进程创建,然后该进程调用fork,此后父、子进程之间就可应用该管道 • Ls | grep zhaocs

  28. 第四章 编译器

  29. 文件名约定-Input files • 命令行中的filename可以是多种扩展名的文件,具体如下: • filename.f :表示一个Fortran源文件 • filename.F:表示一个Fortran源文件但可以包含宏和预处理代码 • filename.f90:表示一个Fortran90源文件 • filename.hpf:表示一个HPF源文件 • filename.c:表示一个C源文件但可以包含宏和预处理代码

  30. 文件名约定-Input files • filename.i:表示一个经过预处理的C或C++源文件 • filename.cc:表示一个C++源文件但可以包含宏和预处理代码 • filename.s:表示一个汇编语言文件 • filename.o:表示一个目标文件 • filename.a:表示一个库目标文件 • filename.so:表示一个共享库目标文件(仅在UNIX系统中存在)

  31. 常用编译选项 • -Idirname:将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。C程序中的头文件包含两种情况: A)#include <stdio.h> B)#include “myinc.h” 其中,A类使用尖括号(< >),B类使用双引号(“”)。对于A类,预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件,而对于B类,cpp在当前目录中搜寻头文件,这个选项的作用是告诉cpp,如果在当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。在程序设计中,如果我们需要的这种包含文件分别分布在不同的目录中,就需要逐个使用-I选项给出搜索路径

  32. 常用编译选项 • -Ldirname:将dirname所指出的目录加入到程序函数档案库文件的目录列表中,是在连接过程中使用的参数。在预设状态下,连接程序ld在系统的预设路径中(如/usr/lib)寻找所需要的档案库文件,这个选项告诉连接程序,首先到-L指定的目录中去寻找,然后到系统预设路径中寻找,如果函数库存放在多个目录下,就需要依次使用这个选项,给出相应的存放目录 • -llibrary:在连接时,装载名字为“libname.a”的函数库,该函数库位于系统预设的目录或者由-L选项确定的目录下。例如,-lm表示连接名为“libm.a”的数学函数库

  33. GCC 编译器 • GNU Compiler Collection:http://gcc.gnu.org • 最新版本: GCC 4.1.1 • 自由软件,一般操作系统都自带 • 支持C/C++、Fortran77/90/95、Java、Ada等等许多语言 • 支持大部分硬件平台 • 高性能计算中常用的: • C/C++: gcc (GNU C/C++ Compiler) • Fortran 77: gfortran(v4), g77(v2,v3) • Fortran 90/ 95: gfortran • 不支持OpenMP

  34. GCC应用举例 1.gcc hello.c 生成a.out 2. gcc –o hello helo.c 生成hello 3. gcc –O –o hello hello.c 生成hello 4. gcc –O2 –o hello hello.c 生成hello 5. gcc –c hello.c 生成hello.o gcc –o hello hello.o 生成hello 6. gcc –c hello1.c 生成hello1.o gcc –c hello2.c 生成hello2.o gcc –o hello hello1.o hello2.o 生成hello 7. gcc –o test test1.o –lm –I/home/zhaocs/include

  35. 概 述 • PGI Compiler • 由Portland公司开发的编译器 • 支持AMD Opteron/Althon处理器、Intel Xeon处理器等,在Opteron上同时支持32-bit和64-bit • 支持Linux、Windows • 支持C/C++、Fortran77、Fortran90/95、HPF • 支持多线程和OpenMP • 最新版本:6.2.3 • 需要购买,但可以从网上得到15天试用版本 http://www.pgroup.com

  36. PGI编译器工具

  37. 基本步骤 • 编辑或者修改一个扩展名为.f(或其他合适的扩展名)的源程序文件 • 根据文件类型,使用相应的编译命令来编译源程序 • 执行、调试或评测编译后的可执行程序

  38. 一个简单例子 • 1.编辑如下代码并存入文件 hello.f 中: • 2.使用pgf90编译: • 3.默认情况下,产生的可执行程序名为a.out。也可以通过-o选项来指定程序名: • 4.键入可执行文件名来执行程序:

  39. 命令行语法 • 以pgf90为例: pgf90 [options] [ path] filename [...] • 其中: • pgf90:编译器名(pgf77,pgcc,pghpc等) • options:编译器所需要的参数(如果几个参数之间有矛盾,最后一个参数有效) • path:指定文件的路径,默认是当前目录 • filename:源文件名

  40. 常用编译选项 • -c:只编译,不连接成为可执行文件,编译器只是由输入的.c/.f等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件 • -o output_filename:确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,就给出预设的可执行文件a.out • -g、-O0:产生符号调试工具所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项 • -O1:对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些 • -O2、-O3:比-O1更好的优化编译、连接,当然整个编译、连接过程会更慢

  41. PGI的库链接 • PGI可以链接多种数学库,如LAPACK、BLAS、FFT等等 • 一般情况下,PGI链接的LAPACK、BLAS库放在如下目录中: $PGI/<target>/lib/lapack.a $PGI/<target>/lib/blas.a 其中<target>可以是linux86或者linux86-64 • 也可以通过指定的路径链接库

  42. PGI的库链接 • 编译时,在命令行中使用-l选项链接指定的库,如下例所示: $ pgf90 myprog.f -llapack $ pgf90 myprog.f -lblas

  43. Intel编译器 • 由Intel公司针对Intel处理器开发(Itanium,Xeon,Pentium),9.0以上版本可以在AMD处理器上使用 • 支持Linux、Windows • 支持C/C++(icc:Intel C/C++ Compiler)、Fortran77/90/95(ifc/ifort: Intel Fortran Compiler) • 支持多线程和OpenMP • 最新版本:9.0 • 需要购买,但可以从网上得到30天试用版本 http://www.intel.com/software

  44. 数学库简介 • BLAS和LAPACK为线性代数操作提供了一套标准的Fortran 77接口,应用代码通过访问库中的程序来完成线性代数计算 • FFT用来计算离散傅立叶变换(DFT,Discrete Fourier Transform),它可以将计算复杂度从O(n*n) 减少到 O(n*log n)

  45. BLAS简介 • Basic Linear Algebra Subprograms是一套用来处理基本的向量和矩阵计算的程序库,它可以进一步细分为三个部分: • Level 1 BLAS :处理 向量-向量操作 • Level 2 BLAS :处理 矩阵-向量操作 • Level 3 BLAS :处理 矩阵-矩阵操作

  46. 什么是ScaLAPACK? • Scalable Linear Algebra PACKage是为在基于消息传递的分布式并行编程环境上并行求解数值线性代数问题而编写的 • ScaLAPACK是面向分布式并行计算环境的数学软件包,是LAPACK软件包的并行版,在科学计算中广为使用 • 由美国橡树岭国家实验室和田纳西大学等联合开发

  47. ScaLAPACK的组成 • BLAS(Basic Linear Algebra Subprograms)和BLACS (Basic Linear Algebra Communication Subprograms)是ScaLAPACK的两个基础软件包,其中: • BLAS负责ScaLAPACK程序的浮点计算,决定了ScaLAPACK的计算速度 • BLACA负责ScaLAPACK程序的通讯,决定了ScaLAPACK的通信速度

  48. ACML简介 • ACML(AMD Core Math Library)是一套专门针对AMD Opteron™处理器编制的数学程序,它包括三个部分: • BLAS-Basic Linear Algebra Subprograms • LAPACK-Linear Algebra PACKage,包含一套高性能的线性代数程序 • FFT-Fast Fourier Transform,包含一套实数和复数的快速傅立叶变换程序

  49. ACML数学库关系图 BLAS 调用 调用 LAPACK FFT 调用 调用 调用 ACML

  50. 第四章 Make简介