中国科学技术大学超级计算中心瀚海20超级计算系统使用指南李会民2020年12月13日目录I前言10II瀚海20超级计算系统简介11III用户登录与文件传输15IV设置编译及运行环境16V串行及OpenMP程序编译及运行191串行C/C++程序的编译191.
1输入输出文件后缀与类型的关系191.
2串行C/C++程序编译举例212串行Fortran程序的编译222.
1输入输出文件后缀与类型的关系222.
2串行Fortran程序编译举例24目录23OpenMP程序的编译与运行253.
1OpenMP程序的编译253.
2OpenMP程序的运行26VIIntel、PGI及GNUC/C++Fortran编译器介绍274IntelC/C++Fortran编译器274.
1IntelC/C++Fortran编译器简介274.
2编译错误284.
3Fortran程序运行错误294.
4IntelParallelStudioXE版重要编译选项294.
4.
1优化选项304.
4.
2代码生成选项304.
4.
3过程间优化(IPO)选项324.
4.
4高级优化选项334.
4.
5概要导向优化(PGO)选项334.
4.
6优化报告选项344.
4.
7OpenMP和并行处理选项344.
4.
8浮点选项364.
4.
9内联选项394.
4.
10输出、调试及预编译头文件(PCH)选项394.
4.
11预处理选项404.
4.
12C/C++语言选项424.
4.
13Fortran语言选项434.
4.
14数据选项454.
4.
15编译器诊断选项464.
4.
16兼容性选项484.
4.
17链接和链接器选项494.
4.
18其它选项50目录35PGIC/C++Fortran编译器515.
1PGIC/C++Fortran编译器简介515.
2编译错误515.
3Fortran程序运行错误525.
4PGIC/C++编译器重要编译选项525.
4.
1一般选项525.
4.
2优化选项535.
4.
3调试选项545.
4.
4预处理选项545.
4.
5链接选项555.
4.
6C/C++语言选项555.
4.
7Fortran语言选项565.
4.
8平台相关选项576GNUC/C++Fortran编译器576.
1GNUC/C++Fortran编译器简介576.
2编译错误576.
3GNUC/C++编译器GCC重要编译选项586.
3.
1控制文件类型的选项586.
3.
2C/C++语言选项596.
3.
3Fortran语言选项596.
3.
4警告选项606.
3.
5调试选项616.
3.
6优化选项616.
3.
7预处理选项616.
3.
8链接选项626.
3.
9i386和x8664平台相关选项626.
3.
10约定成俗选项62VIIMPI并行程序编译及运行63目录47MPI并行程序的编译637.
1HPCXScalableHPC工具集637.
1.
1MellanoxFabric集合通信加速(FabricCollectiveAccelerator,FCA)657.
1.
2统一通信X架构(UnifiedCommunicationXFramework,UCX).
.
687.
1.
3PGAS共享内存访问(OpenSHMEM)737.
2OpenMPI库767.
3IntelMPI库787.
3.
1编译命令787.
3.
2编译命令参数787.
3.
3环境变量817.
3.
4编译举例827.
3.
5调试837.
3.
6追踪837.
3.
7正确性检查837.
3.
8统计收集847.
4与编译器相关的编译选项848MPI并行程序的运行84VIII程序调试859GDB调试器简介8510基本启动方式8510.
1选择启动时文件8610.
2记录日志8711退出GDB8712准备所需要调试的程序8812.
1准备调试代码源代码8812.
2准备编译器和链接器环境88目录512.
3调试优化编译的代码8812.
4准备所需要调试的并行程序8912.
5编译所要调试的程序8913开始调试程序9013.
1显示源代码9013.
2运行程序9013.
3设置和删除断点9013.
4控制进程环境9113.
5执行一行代码9113.
6执行代码直到9213.
7执行一行汇编指令9213.
8显示变量或表达式值9214传递命令给调试器9214.
1命令、文件名和变量补全9214.
2自定义命令9215调试并行程序9315.
1调试OpenMP等多线程程序9315.
2调试MPI并行应用94IXIntelMKL数值函数库9616IntelMKL9617IntelMKL主要内容9618IntelMKL目录内容9719链接IntelMKL9719.
1快速入门9719.
1.
1利用mkl编译器参数97目录619.
1.
2使用单一动态库9719.
1.
3选择所需库进行链接9919.
1.
4使用链接行顾问9919.
1.
5使用命令行链接工具9919.
2链接举例10019.
2.
1在Intel64架构上链接10019.
2.
2在IA32架构上链接10119.
3链接细节10319.
3.
1在命令行上列出所需库链接10319.
3.
2动态选择接口和线程层链接10319.
3.
3使用接口库链接10419.
3.
4使用线程库链接10519.
3.
5使用计算库链接10719.
3.
6使用编译器运行库链接10819.
3.
7使用系统库链接10819.
3.
8冗长(Verbose)启用模式链接10820性能优化等109X应用程序的编译与安装11021二进制程序的安装11022源代码程序的安装111XISlurm作业管理系统11323基本概念11323.
1三种模式区别11323.
2基本用户命令11423.
3基本术语115目录723.
4常用参考11524显示队列、节点信息:sinfo11724.
1主要输出项11824.
2主要参数11925查看队列中的作业信息:squeue12325.
1主要输出项12325.
2主要参数12526查看详细队列信息:scontrolshowpartition13426.
1主要输出项13527查看详细节点信息:scontrolshownode13627.
1主要输出项13728查看详细作业信息:scontrolshowjob13828.
1主要输出项13929查看服务质量(QoS)14230查看作业屏幕输出:speek14231提交作业命令共同说明14331.
1主要参数14331.
2IO重定向15132交互式提交并行作业:srun15232.
1主要输入环境变量15232.
2主要输出环境变量15532.
3多程序运行配置15732.
4常见例子15833批处理方式提交作业:sbatch161目录833.
1主要输入环境变量16333.
2主要输出环境变量16533.
3串行作业提交16733.
4OpenMP共享内存并行作业提交16833.
5MPI并行作业提交16933.
6GPU作业提交17033.
7作业获取的节点名及对应CPU核数解析17034分配式提交作业:salloc17234.
1主要选项17334.
2主要输入环境变量17334.
3主要输出环境变量17534.
4例子17635将文件同步到各节点:sbcast17735.
1主要参数17735.
2主要环境变量17835.
3例子17836吸附到作业步:sattach17836.
1主要参数17836.
2主要输入环境变量17936.
3例子17937查看记账信息:sacct17938其它常用作业管理命令18038.
1终止作业:scanceljob_id18038.
2挂起排队中尚未运行的作业:scontrolholdjob_list18138.
3继续排队被挂起的尚未运行作业:scontrolreleasejob_list18138.
4重新运行作业:scontrolrequeuejob_list18138.
5重新挂起作业:scontrolrequeueholdjob_list181目录938.
6最优先等待运行作业:scontroltopjob_id18138.
7等待某个作业运行完:scontrolwait_jobjob_id18238.
8更新作业信息:scontrolupdateSPECIFICATION182XII联系方式18310PartI前言本用户使用指南主要将对在中国科学技术大学超级计算中心瀚海20超级计算系统上进行编译以及运行作业做一基本介绍,详细信息请参看相应的文档.
为了便于查看,主要排版约定如下:文件名:/path/file环境变量:MKLROOT命令:commandparameters脚本文件内容或长命令:§exportOPENMPI=/opt/openmpi/1.
8.
2_intel-compiler-2015.
1.
133exportPATH=$OPENMPI/bin:$PATHexportMANPATH=$MANPATH:$OPENMPI/share/man命令输出:PARTITIONAVAILTIMELIMITNODESSTATENODELISTCPU-Large*upinfinite720alloccnode[001-720]GPU-V100upinfinite8mixgnode[01-02,05-10]GPU-V100upinfinite2idlegnode[03-04]2TB-AEP-Memupinfinite8idleanode[01-08]由于受水平和时间所限,错误和不妥之处在所难免,欢迎指出错误和改进意见,本人将尽力完善.
本指南会经常更新,请从超算中心主页上下载更新后的手册.
11PartII瀚海20超级计算系统简介中国科学技术大学超级计算中心瀚海20超级计算系统采用MellonaxHDR100Gbps高速互联,具有IntelXeonScale6248、华为鲲鹏9205250等不同类型CPU及NVIDIATeslaV100GPU和华为Atlas300AI卡等协处理器,共计2个管理节点、2个用户登录节点、720个普通CPU计算节点(采用高效节能的板级液冷技术)、10个双V100GPU计算节点、8个2TBIntelAEP大内存节点、20个华为鲲鹏CPU计算节点构成(其中10个各含6颗华为Atlas300AI加速卡),计算节点共30480颗CPU核心和20块NVIDIAV100GPU卡,总双精度浮点计算能力:2.
51PFlops(千万亿次/秒,CPU:2.
37PFlops,GPU:0.
14PFlops),Atlas计算能力:3840TOPSINT8+15360TFLOPSFP16.
管理节点(2个):用于系统管理,普通用户无权登录.
节点名CPU内存硬盘型号admin01admin022*IntelXeonScale6248(2.
5GHz,20核,27.
5MB)192GBDDR42933MHz2*1TBNVMe华为FusionServer2288HV5用户登录节点(3个):–用于用户登录、编译与通过作业调度系统提交管理作业等.
–禁止在此节点上不通过作业调度系统直接运行作业.
节点名CPU内存硬盘型号login01login022*IntelXeonScale6248(2.
5GHz,20核,27.
5MB)192GBDDR42933MHz2*1TBNVMe华为FusionServer2288HV5TaishanLogin16*Hi1620ARMCPU(2.
6GHz)64GBDDR42666MHz50GB华为泰山2280HV212IntelXeonCPU普通计算节点(720个):用于多数作业.
节点名CPU内存硬盘型号cnode001cnode7202*IntelXeonScale6248(2.
5GHz,20核,27.
5MB)192GBDDR42933MHz1*240GBSSD华为FusionServerXH321LV5IntelXeonCPU2TBAEP内存计算节点(8个):AEP内存性能低于普通内存,性价比高,适合大内存应用.
节点名CPU普通内存AEP内存硬盘型号anode01anode082*IntelXeonScale6248(2.
5GHz,20核,27.
5MB)384GBDDR42933MHz2TB(8*256GB)1*1TBNVMe华为FusionServer2288HV5GPU计算节点(10个):适合GPU应用,加速性能:https://developer.
nvidia.
com/hpc-application-performance.
节点名CPUGPU内存硬盘型号gnode01gnode102*IntelXeonScale6248(2.
5GHz,20核,27.
5MB)2*NVIDIATeslaV100384GBDDR42933MHz1*1TBNVMe华为FusionServerG530V5表1:单颗NVIDIATeslaV100GPU参数GPU单元显存主频核心数计算能力(TFlops)TensorCUDA深度学习半精度单精度双精度GV10032GBHBM2基准1230MHz,加速1370MHz640512011228147鲲鹏计算节点(20个):–华为ARMV8CPU,参见:https://developer.
nvidia.
com/hpc-application-performance.
–华为AtlasAI卡,主要提供推理能力,参见:https://support.
huawei.
com/enterprise/zh/ai-computing-platform/atlas-300-pid-23464095–注:使用华为Atlas卡,需特殊申请,加入HwHiAiUser组才可以(运行id可以查看自己所在组).
13节点名CPU内存硬盘计算网络型号rnode02rnode212*鲲鹏9205250(48核,2.
6GHz)256GBDDR42666MHz1*300GBSAS25Gbps以太网华为TaiShan2280V2其中:rnode[1221]每台配置6颗Atlas300AI卡,rnode[0211]未配置.
表2:单颗Atlas300AI卡参数内存AI算力编解码能力LPDDR4x32GB,3200Mbps64TOPSINT8,256TFLOPSFP16–支持H.
264硬件解码,64路1080P30FPS(2路3840*216060FPS)–支持H.
265硬件解码,64路1080P30FPS(2路3840*216060FPS)–支持H.
264硬件编码,4路1080P30FPS–支持H.
265硬件编码,4路1080P30FPS–JPEG解码能力4x1080P256FPS,编码能力4x1080P64FPS–PNG解码能力4x1080P48FPS存储系统:–1台长虹DDNGS7990GRIDScaler及2台DDNSS9012磁盘扩展柜,配置280块8TBSATA硬盘–文件系统:GRIDScaler并行存储–实际可用空间1.
5PB–默认用户磁盘配额:100GB计算网络:MellonaxHDR100Gbps管理网络:千兆以太网操作系统:x86_64架构的64位CentOSLinux7.
7.
1908编译器:Intel、PGI和GNU等C/C++Fortran编译器数值函数库:IntelMKL并行环境:IntelMPI和OpenMPI等,支持MPI并行程序;各节点内的CPU共享内存,节点内既支持分布式内存的MPI并行方式,也支持共享内存的OpenMP并行方式;同时支持在节点内部共享内存,节点间分布式内存的混合并行模式.
资源管理和作业调度:Slurm19.
05.
514常用公用软件安装目录:/opt.
请自己查看有什么软件,有些软件需要在自己~/.
bashrc等配置文件中设置后才可以使用.
图1:瀚海20超级计算系统拓扑15PartIII用户登录与文件传输本超算系统的操作系统为64位CentOS7.
7Linux,用户需以SSH方式(在MSWindows下可利用PuTTY、Xshell等支持SSH协议的客户端软件1,Win10的命令行也支持ssh及sftp命令)登录到用户登录节点(X86_64CPU节点:login01、login02,ARMCPU节点:TaishanLogin)后进行编译、提交作业等操作.
用户数据可以利用SFTP(不支持FTP)协议进行数据传输.
本超算系统禁止SSH密钥登录,并且采用googleauthenticator二次验证,用法参见:http://scc.
ustc.
edu.
cn/2018/0926/c409a339006/page.
htm.
用户若10分钟内5次密码错误登录,那么登录时所使用IP将被自动封锁10分钟,之后自动解封,可以等待10分钟后再尝试,或换个IP登录,或联系超算中心老师解封.
本超算系统可从校内IP登录,校外一般无法直接访问.
如果需要从校外等登录,可以使用学校的VPN(教师的网络通带有此功能,学生的不带),或者申请校超算中心VPN(http://scc.
ustc.
edu.
cn/vpn/).
用户修改登录密码及shell,只能通过http://scc.
ustc.
edu.
cn/user/chpasswd.
php修改密码,而不能通过passwd和chsh修改.
请不要设置简单密码和向无关人员泄漏密码,以免给用户造成损失.
如果忘记密码,请邮件(sccadmin@ustc.
edu.
cn)联系中心老师申请重置,并需提供帐号名、所在超算系统名称等必要信息.
用户登录进来的默认语言环境为zh_CN.
UTF8中文2,以方便查看登录后的中文提示.
如果希望使用英文或GBK中文,可以在自己的~/.
bashrc中添加exportLC_ALL=C或exportLC_ALL=zh_CN.
GBK.
登录进来后请注意登录后的中文提示,或运行cat/etc/motd查看登录提示,也可以运行faq命令查看常见问题的回答.
您可运行duhs目录可以查看目录占用的空间.
请及时清除不需要的文件,以释放空间.
如需更大存储空间,请与超算中心老师联系,并说明充分理由及所需大小.
超算中心不提供数据备份服务,数据一但丢失或误删将无法恢复,请务必及时下载保存自己的数据.
CentOS(CommunityENTerpriseOperatingSystem)是Linux主流发行版之一,它来自于RedHatEnterpriseLinux依照开放源代码规定释出的源代码所编译而成.
一般来说可以用man命令或命令加h或–help等选项来查看该命令的详细用法,详细信息可参考CentOS、RedHatEnterpriseLinux手册或通用Linux手册.
1客户端下载:http://scc.
ustc.
edu.
cn/411/list.
htm2SSHSecureShellClient不支持UTF8中文,不建议使用16PartIV设置编译及运行环境本超算系统安装了多种编译环境及应用等,为方便用户使用,采用EnvironmentModules工具对其进行了封装,用户可以利用module命令设置、查看所需要的环境等.
编译和运行程序时在命令行可用moduleloadmodulefile加载对应的模块(仅对该次登录生效),如不想每次都手动设置,可将其设置在~/.
bashrc或~/.
modulerc文件中:~/.
bashrc,只Bash启动时设置:§moduleloadintel/2020~/.
modulerc,每次module命令启动时都设置:§#%Module1.
0moduleloadintel/2020注意第一行#%Module1.
0是需要的.
module基本语法为:module[switches][subcommand][subcommandargs]常用开关参数(switches):–help,H:显示帮助.
–force,f:强制激活依赖解决.
–terse,t:以短格式显示.
–long,l:以长格式显示.
–human,h:以易读方式显示.
–verbose,v:显示module命令执行时的详细信息.
–silent,s:静默模式,不显示出错信息等.
–icase,i:搜索时不区分大小写.
常用子命令(subcommand):avail[path.
.
.
]:显示MODULEPATH环境变量中设置的目录中的某个目录下可用的模块,如有参数指定,则显示MODULEPATH中符合这个参数的路径.
如moduleavail:17opt/Modules/appgaussian/g16.
C01vasp/5.
4.
4/intel-2020vasp/5.
4.
4/vtst/intel-2020matlab/2019bvasp/5.
4.
4/intelmpimkl2018u4vasp/5.
4.
4/hpcx-intel-2019.
update5-novtstvasp/5.
4.
4/vtst/hpcx-intel-2019.
update5opt/Modules/compilercuda/10.
2.
89gcc/7.
5.
0gcc/8.
3.
0gcc/9.
2.
0intel/2018.
update4intel/2019.
update5intel/2020opt/Modules/libmkl/2018.
update4mkl/2019.
update5mkl/2020opt/Modules/mpihpcx/hpcxhpcx/hpcx-mthpcx/hpcx-prof-ompiintelmpi/2020openmpi/4.
0.
2/intel/2020hpcx/hpcx-debughpcx/hpcx-mt-ompihpcx/hpcx-stackopenmpi/3.
0.
5/gcc/9.
2.
0hpcx/hpcx-debug-ompihpcx/hpcx-ompiintelmpi/2018.
update4openmpi/3.
0.
5/intel/2020hpcx/hpcx-intel-2019.
update5hpcx/hpcx-profintelmpi/2019.
update5openmpi/4.
0.
2/gcc/9.
2.
0opt/Modules/pythonanaconda3python/3.
8.
1上面输出:–/opt/Modules/mpi:模块所在的目录,由MODULEPATH环境变量中设定.
–openmpi/3.
0.
5/intel/2020:模块名或模块文件modulefile,此表示此为3.
0.
5版本OpenMPI,而且是采用2020版本Intel编译器编译的.
help[modulefile.
.
.
]:显示每个子命令的用法,如给定modulefile参数,则显示modulefile中的帮助信息.
add|loadmodulefile.
.
.
:加载modulefile中设定的环境,如moduleloadopenmpi/3.
0.
5/intel/2020.
rm|unloadmodulefile.
.
.
:卸载已加载的环境modulefile,如moduleunloadopenmpi/3.
0.
5/intel/2020.
swap|switch[modulefile1]modulefile2:用modulefile2替换当前已加载的modulefile1,如modulefile1没指定,则交换与modulefile2同样根目录下的当前已加载modulefile.
show|displaymodulefile.
.
.
:显示modulefile环境变量信息.
如moduleshowopenmpi/3.
0.
5/intel/2020/opt/Modules/mpi/openmpi/3.
0.
5/intel/2020:module-whatisOpenMPI3.
0.
5utilitiesrworkwithIntelcompiler2020(moduleloadintel/2020)conflictopenmpiconflictintelmpiconflictmvapich2prepend-pathPATH/opt/openmpi/3.
0.
5/intel/2020/binprepend-pathLD_LIBRARY_PATH/opt/openmpi/3.
0.
5/intel/2020/libprepend-pathINCLUDE/opt/openmpi/3.
0.
5/intel/2020/includeprepend-pathMANPATH/opt/openmpi/3.
0.
5/intel/2020/share/man上面输出:–第一行是modulefile具体路径.
–modulewhatis:模块说明,后面可用子命令whatis、apropos、keyword等显示或搜索.
–moduleload:表示自动加载的模块.
–prependpath:表示将对应目录加到对应环境变量的前面.
18clear:强制module软件相信当前没有加载任何modulefiles.
purge:卸载所有加载的modulefiles.
refresh:强制刷新所有当前加载的不安定的组件.
一般用于aliases需要重新初始化,但环境比那两已经被当前加载的模块设置了的派生shell中.
whatis[modulefile.
.
.
]:显示modulefile中modulewhatis命令指明的关于此modulefile的说明,如果没有指定modulefile,则显示所有modulefile的.
apropos|keywordstring:在modulefile中modulewhatis命令指明的关于此modulefile的说明中搜索关键字,显示符合的modulefile.
其它一些不常用命令及参数,请manmodule查看.
用户也可自己生成自己所需要的modulefile文件,用MODULEFILE和环境变量来指该modulefile文件所在目录,用module来设置,具体请manmodule及manmodulefile.
1串行C/C++程序的编译19PartV串行及OpenMP程序编译及运行在本超算系统上可运行C/C++、Fortran的串行程序,以及与OpenMP和MPI结合的并行程序.
编译程序时,用户只需在登录节点(login01、login02)上以相应的编译命令和选项进行编译即可(用户不应到其余节点上进行编译,以免影响系统效率.
其它节点一般只设置了运行作业所需要的库路径等,未必设置了编译环境).
当前安装的编译环境主要为:C/C++、Fortran编译器:Intel、PGI3和GNU编译器,支持OpenMP并行.
MPI并行环境:HPCX、OpenMPI和IntelMPI并行环境.
安装目录为/opt等,系统设置采用module进行管理(参见IV),用户可以采用下述方式之一等需设置自己所需的编译环境运行,如:moduleloadintel/2020在~/.
bashrc中设置(设置完成后需要source~/.
bashrc或重新登录以便设置生效):§.
/opt/intel/2020/bin/compilervars.
shintel64注意:在~/.
bashrc中设置的级别有可能要高于使用moduleload设置的,可以运行iccv或whichicc等命令查看实际使用的编译环境.
建议采用对一般程序来说性能较好的Intel编译器,用户也可以选择适合自己程序的编译器,以取得更好的性能.
本部分主要介绍串行C/C++Fortran源程序和OpenMP并行程序的编译,MPI并行程序的编译将在后面介绍.
1串行C/C++程序的编译1.
1输入输出文件后缀与类型的关系编译器默认将按照输入文件的后缀判断文件类型,见表3.
编译器默认将输出按照文件类型与后缀相对应,见表4.
3目前尚未配置,等以后配置上1串行C/C++程序的编译20表3:输入文件后缀与类型的关系文件名解释动作filename.
cC源文件传给编译器filename.
Cfilename.
CCfilename.
ccC++源文件传给编译器filename.
cppfilename.
cxxfilename.
a静态链接库文件filename.
so动态链接库文件传递给链接器filename.
i已预处理的文件传递给标准输出filename.
o目标文件传递给链接器filename.
s汇编文件传递给汇编器表4:输出文件后缀与文件类型的关系文件名解释filename.
i已预处理的文件,一般使用p选项生成filename.
o目标文件,一般使用c选项生成filename.
s汇编文件,一般使用s选项生成a.
out默认生成的可执行文件1串行C/C++程序的编译211.
2串行C/C++程序编译举例IntelC/C++编译器:–将C程序yourprog.
c编译为可执行文件yourprog:iccoyourprogyourprog.
c–将C++程序yourprog.
cpp编译为可执行文件yourprog:icpcoyourprogyourprog.
cpp–将C程序yourprog.
c编译为对象文件yourprog.
o而不是可执行文件:icccyourprog.
c–将C程序yourprog.
c编译为汇编文件yourprog.
s而不是可执行文件:iccSyourprog.
c–生成带有调试信息的可执行文件以用于调试:iccgyourprog.
coyourprog–指定头文件路径编译:iccI/alt/includeoyourprogyourprog.
c–指定库文件路径及库名编译:iccL/alt/liblxyzoyourprogyourprog.
cPGIC/C++编译器:–将C程序yourprog.
c编译为可执行文件yourprog:pgccoyourprogyourprog.
c–将C++程序yourprog.
cpp编译为可执行文件yourprog:pgCCoyourprogyourprog.
cpp–将C程序yourprog.
c编译为对象文件yourprog.
o而不是可执行文件:pgcccyourprog.
c–将C程序yourprog.
c编译为汇编文件yourprog.
s而不是可执行文件:pgccSyourprog.
c–生成带有调试信息的可执行文件以用于调试:pgccgyourprog.
coyourprog–指定头文件路径编译:pgccI/alt/includeoyourprogyourprog.
c–指定库文件路径及库名(l)编译:pgccL/alt/liblxyzoyourprogyourprog.
c2串行FORTRAN程序的编译22GNUC/C++编译器:–将C程序yourprog.
c编译为可执行文件yourprog:gccoyourprogyourprog.
c–将C++程序yourprog.
cpp编译为可执行文件yourprog:g++oyourprogyourprog.
cpp–将C程序yourprog.
c编译为对象文件yourprog.
o而不是可执行文件:gcccyourprog.
c–将C程序yourprog.
c编译为汇编文件yourprog.
s而不是可执行文件:gccSyourprog.
c–生成带有调试信息的可执行文件以用于调试:gccgyourprog.
coyourprog–指定头文件路径编译:gccI/alt/includeoyourprogyourprog.
c–指定库文件路径及库名编译:gccL/alt/liblxyzoyourprogyourprog.
c2串行Fortran程序的编译2.
1输入输出文件后缀与类型的关系编译器默认将按照输入文件的后缀判断文件类型,见表5.
编译器默认将输出按照文件类型与后缀相对应,见表6.
2串行FORTRAN程序的编译23表5:输入文件后缀与文件类型的关系文件名解释动作filename.
a静态链接库文件,多个.
o文件的打包集合传给编译器filename.
ffilename.
forfilename.
ftn固定格式的Fortran源文件被Fortran编译器编译filename.
ifilename.
fppfilename.
FPPfilename.
F固定格式的Fortran源文件自动被Fortran编译器预处理后再被编译filename.
FORfilename.
FTNfilename.
f90filename.
i90自由格式的Fortran源文件被Fortran编译器编译filename.
F90自由格式的Fortran源文件自动被Fortran编译器预处理后再被编译filename.
s汇编文件传递给汇编器filename.
so动态链接库文件,多个.
o文件的打包集合传递给链接器filename.
o目标文件传递给链接器表6:输出文件后缀与类型的关系文件名解释生成方式filename.
o目标文件编译时添加c选项生成filename.
so共享库文件编译时指定为共享型,如添加shared,并不含cfilename.
mod模块文件编译含有MODULE声明时的源文件生成filename.
s汇编文件编译时添加S选项生成a.
out默认生成的可执行文件编译时没有指定c时生成2串行FORTRAN程序的编译242.
2串行Fortran程序编译举例IntelFortran编译器:–将Fortran77程序yourprog.
for编译为可执行文件yourprog:ifortoyourprogyourprog.
for–将Fortran90程序yourprog.
f90编译为可执行文件yourprog:ifortoyourprogyourprog.
f90–将Fortran90程序yourprog.
90编译为对象文件yourprog.
o而不是可执行文件:ifortcyourprog.
f90–将Fortran程序yourprog.
f90编译为汇编文件yourprog.
s而不是可执行文件:ifortSyourprog.
f90–生成带有调试信息的可执行文件以用于调试:ifortgyourprog.
f90oyourprog–指定头文件路径编译:ifortI/alt/includeoyourprogyourprog.
f90–指定库文件路径及库名编译:ifortL/alt/liblxyzoyourprogyourprog.
f90PGIFortran编译器:–将Fortran77程序yourprog.
for编译为可执行文件yourprog:pgf77oyourprogyourprog.
for–将Fortran90程序yourprog.
f90编译为可执行文件yourprog:pgf90oyourprogyourprog.
f90–将Fortran程序yourprog.
f90编译为对象文件yourprog.
o而不是可执行文件:pgf90cyourprog.
f90–将Fortran程序yourprog.
f90编译为汇编文件yourprog.
s而不是可执行文件:pgf90Syourprog.
f90–生成带有调试信息的可执行文件以用于调试:pgf90gyourprog.
f90oyourprog–指定头文件路径编译:pgf90I/alt/includeoyourprogyourprog.
f90–指定库文件路径及库名编译:pgf90L/alt/liblxyzoyourprogyourprog.
f903OPENMP程序的编译与运行25GNUFortran编译器:–将Fortran77程序yourprog.
for编译为可执行文件yourprog:*gcc4.
x系列:gfortranoyourprogyourprog.
for*gcc3.
x系列:g77oyourprogyourprog.
for–将Fortran90程序yourprog.
f90编译为可执行文件yourprog:gfortranoyourprogyourprog.
f90–将Fortran程序yourprog.
f90编译为对象文件yourprog.
o而不是可执行文件:gfortrancyourprog.
f90–将Fortran程序yourprog.
f90编译为汇编文件yourprog.
s而不是可执行文件:gfortranSyourprog.
f90–生成带有调试信息的可执行文件以用于调试:gfortrangyourprog.
f90oyourprog–指定头文件路径编译:gfortranI/alt/includeoyourprogyourprog.
f90–指定库文件路径及库名编译:gfortranL/alt/liblxyzoyourprogyourprog.
f90注意:g77既不支持OpenMP,也不支持Fortran90及之后的标准.
3OpenMP程序的编译与运行3.
1OpenMP程序的编译Intel、PGI和GNU编译器都支持OpenMP并行,只需利用相关编译命令结合必要的OpenMP编译选项编译即可.
对应此三种编译器的OpenMP编译选项:Intel编译器:qopenmp(2015及之后版)PGI编译器:mpGNU编译器:fopenmp3OPENMP程序的编译与运行26采用这三种编译器的OpenMP源程序编译例子如下:Intel编译器:–将C程序yourprogomp.
c编译为可执行文件yourprogomp:iccqopenmpoyourprogompyourprog.
c–将Fortran90程序yourprogomp.
f90编译为可执行文件yourprogomp:ifortqopenmpoyourprogompyourprog.
f90PGI编译器:–将C程序yourprogomp.
c编译为可执行文件yourprogomp:pgccmpoyourprogompyourprog.
c–将Fortran90程序yourprogomp.
f90编译为可执行文件yourprogomp:pgf90mpoyourprogompyourprog.
f90GNU编译器:–将C程序yourprogomp.
c编译为可执行文件yourprogomp:gccfopenmpoyourprogompyourprog.
c–将Fortran90程序yourprogomp.
f90编译为可执行文件yourprogomp:gfortranfopenmpoyourprogompyourprog.
f903.
2OpenMP程序的运行OpenMP程序的运行一般是通过在运行前设置环境变量OMP_NUM_THREADS来控制线程数,比如在BASH中利用exportOMP_NUM_THREADS=40设置使用40个线程运行.
注意,本系统为节点内共享内存节点间分布式内存的架构,因此只能在一个节点上的CPU之间运行同一个OpenMP程序作业,在提交作业时需要使用相应选项以保证在同一个节点运行.
4INTELC/C++FORTRAN编译器27PartVIIntel、PGI及GNUC/C++Fortran编译器介绍4IntelC/C++Fortran编译器4.
1IntelC/C++Fortran编译器简介IntelParallelStudioXECluster版C/C++Fortran编译器,是一种主要针对Inetl平台的高性能编译器,可用于开发复杂且要进行大量计算的C/C++、Fortran程序.
系统当前安装目录为/opt/intel,其下有多种年份版本.
官方手册目录为/opt/intel/版本/documentation_年份.
用户可以采用molule命令来设置所需的环境,请参看设置编译及运行环境.
Intel编译器编译C和C++源程序的编译命令分别为icc和icpc;编译Fortran源程序的命令为ifort.
icpc命令使用与icc命令相同的编译器选项,利用icpc编译时将后缀为.
c和.
i的文件看作为C++文件;而利用icc编译时将后缀为.
c和.
i的文件则看作为C文件.
用icpc编译时,总会链接C++库;而用icc编译时,只有在编译命令行中包含C++源文件时才链接C++库.
编译命令格式为:command[options][@response_file]file1[file2.
.
.
],其中response_file为文件名,此文件包含一些编译选项,请注意调用时前面有个@.
在Intel数学库(Intelmath)中的许多函数针对Intel微处理器相比针对非Intel微处理器做了非常大的优化处理.
为了使用Intel数学库中的函数,需要在程序源文件中包含头文件mathimf.
h,例如使用实函数:§//real_math.
c#include#includeintmain(){floatfp32bits;doublefp64bits;longdoublefp80bits;longdoublepi_by_four=3.
141592653589793238/4.
0;4INTELC/C++FORTRAN编译器28//pi/4radiansisabout45degreesfp32bits=(float)pi_by_four;//floatapproximationtopi/4fp64bits=(double)pi_by_four;//doubleapproximationtopi/4fp80bits=pi_by_four;//longdouble(extended)approximationtopi/4//Thesin(pi/4)isknowntobe1/sqrt(2)orapproximately.
7071067printf("Whenx=%8.
8f,sinf(x)=%8.
8f\n",fp32bits,sinf(fp32bits));printf("Whenx=%16.
16f,sin(x)=%16.
16f\n",fp64bits,sin(fp64bits));printf("Whenx=%20.
20Lf,sinl(x)=%20.
20f\n",fp80bits,sinl(fp80bits));return0;}编译:iccreal_math.
c4.
2编译错误C/C++程序编译时的出错信息类似以下:netlog.
c(140):error:identifier"hhh"isundefinedfor(inthhh=domain_cnt+1;hhh>TMP;hhh--){^netlog.
c(156):error:expectedanexpressionfor(inti=0;i=D+3'.
6060format(/i2,'-thlayer',i2,'-thelement:z=',i3,'a=',f9.
5/'Ef=',f7.
5)编译错误的格式为:源文件名(行数):错误类型:具体说明源代码,^指示出错位置4INTELC/C++FORTRAN编译器29错误类型可以为:Warning:警告,报告对编译有效但也许存在问题的语法,请根据信息及程序本身判断,不一定需要处理.
Error:存在语法或语义问题,必须要处理.
FatalError:报告环境错误,如磁盘空间没有了.
4.
3Fortran程序运行错误根据运行时错误代码可以在官方手册中查找对应错误解释.
4.
4IntelParallelStudioXE版重要编译选项Intel编译器选项分为几类,可以用icchelp类别查看对应的选项,类别与选项对应关系如下:advancedAdvancedOptimizations,高级优化codegenCodeGeneration,代码生成compatibilityCompatibility,兼容性componentComponentControl,组件控制dataData,数据deprecatedDeprecatedOptions,过时选项diagnosticsCompilerDiagnostics,编译器诊断floatFloatingPoint,浮点helpHelp,帮助inlineInlining,内联ipoInterproceduralOptimization(IPO),过程间优化languageLanguage,语言linkLinking/Linker,链接/链接器miscMiscellaneous,杂项4INTELC/C++FORTRAN编译器30optOptimization,优化outputOutput,输出pgoProfileGuidedOptimization(PGO),概要导向优化preprocPreprocessor,预处理reportsOptimizationReports,优化报告openmpOpenMPandParallelProcessing,OpenMP和并行处理可以运行icchelphelp查看选项分类情况.
4.
4.
1优化选项fast:最大化整个程序的速度,相当于设置ipo、O3、noprecdiv、static、fpmodelfast=2和xHost.
这里是所谓的最大化,还是需要结合程序本身使用合适的选项,默认不使用此选项.
nolibinline:取消标准库和内在函数的内联展开.
On:设定优化级别,默认为O2.
O与O2相同,推荐使用;O3为在O2基础之上增加更激进的优化,比如包含循环和内存读取转换和预取等,但在有些情况下速度反而慢,建议在具有大量浮点计算和大数据处理的循环时的程序使用.
Ofast:设定一定的优化选项提高程序性能,设定O3,noprecdiv和fpmodelfast=2.
在Linux系统上提供与gcc的兼容.
Os:启用优化,但不增加代码大小,并且产生比O2优化小的代码.
它取消了一些优化不明显却增大了代码的优化选项.
4.
4.
2代码生成选项axcode:在有性能提高时,生成针对Intel处理器的多特征面向的自动调度代码路径.
code可为:–COMMONAVX512:生成Intel(R)AdvancedVectorExtensions512(Intel(R)AVX512)基础指令.
–COREAVX2:生成IntelAdvancedVectorExtensions2(IntelAVX2)、IntelAVX、SSE4.
2、SSE4.
1、SSE3、SSE2、SSE和SSSE3指令.
4INTELC/C++FORTRAN编译器31–COREAVXI:生成Float16转换指令和RDRND(随机数)指令、IntelAdvancedVectorExtensions(IntelAVX)、IntelSSE4.
2、SSE4.
1、SSE3、SSE2、SSE和SSSE3指令.
–AVX:生成IntelAdvancedVectorExtensions(IntelAVX)、IntelSSE4.
2、SSE4.
1、SSE3、SSE2、SSE和SSSE3指令.
–SSE4.
2:生成IntelSSE4.
2、SSE4.
1、SSE3、SSE2、SSE和SSSE3指令.
–SSE4.
1:生成IntelSSE4.
1、SSE3、SSE2、SSE和SSSE3指令–SSSE3:生成SSSE3指令和IntelSSE3、SSE2和SSE指令.
–SSE3:生成IntelSSE3、SSE2和SSE指令.
–SSE2:生成IntelSSE2和SSE指令.
fexceptions、fnoexceptions:是否生成异常处理表.
xcode:设置启用编译目标的特征,包含采取何种指令集和优化.
–COMMONAVX512–COREAVX2–COREAVXI–AVX–SSE4.
2–SSE4.
1–SSSE3–SSE3–SSE2mcode:需要生成目标特征的指令集.
code可为:–avx:生成IntelAdvancedVectorExtensions(IntelAVX)、IntelSSE4.
2、SSE4.
1、SSE3、SSE2、SSE和SSSE3指令.
–sse4.
2:生成IntelSSE4.
2、SSE4.
1、SSE3、SSE2、SSE和SSSE3指令.
–sse4.
1:生成IntelSSE4.
1、SSE3、SSE2、SSE和SSSE3指令.
–ssse3:生成SSSE3指令和IntelSSE3、SSE2和SSE指令.
–sse3:生成IntelSSE3、SSE2和SSE指令.
–sse2:生成IntelSSE2和SSE指令.
–sse:已过时,现在与ia32一样.
4INTELC/C++FORTRAN编译器32–ia32:生成与IA32架构兼容的x86/x87通用代码.
取消任何默认扩展指令集,任何之前的扩展指令集.
并且取消所有面向特征的优化及指令.
此值仅在Linux系统上使用IA32架构时有效.
m32和m64:生成IA32或Intel64位代码,默认由主机系统设定.
march=processor:生成支持某种处理器特定特征的代码.
processor可为:–generic–coreavx2–coreavximtune=processor:针对特定处理器优化.
processor可为:–generic(默认)–coreavx2–coreavxixHost:生成编译主机处理器能支持的最高指令集.
建议使用.
4.
4.
3过程间优化(IPO)选项ip:在单个文件中进行过程间优化(InterproceduralOptimizationsIPO).
ipnoinlining:禁止过程间优化时启用的全部和部分内联.
ipnopinlining:禁止过程间优化时启用的部分内联.
ipo[n]、noipo:是否在多文件中进行过程间优化,非负整数n为可生成的对象文件数.
ipoc:在多文件中进行过程间优化,并生成一个对象文件.
ipojobsn:指定在过程间优化的链接阶段时的命令(作业)数.
ipoS:在多文件中进行过程间优化,并生成一个汇编文件.
iposeparate:在多文件中进行过程间优化,并为每个文件分别生成一个对象文件.
4INTELC/C++FORTRAN编译器334.
4.
4高级优化选项funrollallloops:即使在循环次数不确定的情况下也展开所有循环.
默认为否.
guide[=n]:设置自动向量化、自动并行及数据变换的指导级别.
n为1到4,1为标准指导,4为最高指导,如果n忽略,则默认为4.
默认为不启用.
guidedatatrans[=n]:设置数据变换时的指导级别.
n为1到4,1为标准指导,4为最高指导,如果n忽略,则默认为4.
默认为不启用.
guidefile[=filename]:将自动并行的结果输出到文件filename中.
guidefileappend[=filename]:将自动并行的结果追加到文件filename中.
guidepar[=n]:设置自动并行的指导级别.
n为1到4,1为标准指导,4为最高指导,如果n忽略,则默认为4.
默认为不启用.
guidevec[=n]:设置自动向量化的指导级别.
n为1到4,1为标准指导,4为最高指导,如果n忽略,则默认为4.
默认为不启用.
mkl[=lib]:链接时自动链接IntelMKL库,默认为不启用.
lib可以为:–parallel:采用线程化部分的MKL库链接,此为lib如果没指明时的默认选项.
–sequential:采用未线程化的串行MKL库链接.
–cluster:采用集群部分和串行部分MKL链接.
simd、nosimd:是否启用SIMD编译指示的编译器解释.
unroll[=n]:设置循环展开的最大层级.
unrollaggressive、nounrollaggressive:设置对某些循环执行激进展开.
默认不启用.
vec、novec:是否启用向量化.
默认启用.
4.
4.
5概要导向优化(PGO)选项p:使用gprof编译和链接函数.
profdirdir:设定存储概要导向优化信息的文件目录.
proffilefilename:设定概要摘要文件名.
4INTELC/C++FORTRAN编译器344.
4.
6优化报告选项qoptreport[=n]:设定显示优化报告信息的级别,为每个对象文件生成一个对应的文件.
n为0(不显示)到5(最详细).
qopqoptreportfile=keyword:设定报告文件名.
keyword可以为:–filename:保存输出的文件名.
–stderr:输出到标准错误输出.
–stdout:输出到标准输出.
qoptreportfilter=string:设置报告的过滤器.
string可以为filename、routine、range等.
qoptreportformat=keyword:设置报告的格式.
keyword可以为text和vs,分别对应纯文本和VisualStudio格式.
qoptreporthelp:显示使用qoptreportphase选项时可用于报告生成的各优化阶段,并显示各级别报告的简短描述.
qoptreportperobject:为各对象文件生成独立的报告文件.
qoptreportphase:对生成的优化报告指明一个或多个优化阶段.
phase可以为:cg、ipo、loop、openmp、par、pgo、tcollect、vec和all等.
qoptreportroutine=substring:让编译器对含有substring的子程序生成优化报告.
qoptreportnames=keyword:是否在优化报告中显示重整的或未重整的名字.
keyword可以为:mangled和unmangled.
tcheck:对线程应用启用分析.
tcollect[lib]:插入测试探测调用IntelTraceCollectorAPI.
lib为一种IntelTraceCollector库,例如:VT、VTcs、VTmc或VTfs.
tcollectfilterfilename:对特定的函数启用或禁止测试.
vecreport[=n]:设置向量化诊断信息详细程度.
n为0(不显示)到7(最详细).
4.
4.
7OpenMP和并行处理选项fmpcprivatize、fnompcprivatize:是否启用针对多处理器计算环境(MPC)所有静态数据私有.
paraffinity=[modifier,…]type[,permute][,offset]:设定线程亲和性.
4INTELC/C++FORTRAN编译器35–modifier:可以为以下值之一:granularity=fine|thread|core、[no]respect、[no]verbose、[no]warnings、proclist=proc_list.
默认为granularity=core,respect,noverbose.
–type:指示线程亲和性.
此选项是必需的,并且需为以下之一:compact、disabled、explicit、none、scatter、logical、physical.
默认为none.
logical和physical已经过时.
分别使用compact和scatter,并且没有permute值.
–permute:非负整数.
当type设置为explicit、none或disabled时,不能使用此选项.
默认为0.
–offset:非负整数.
当type设置为explicit、none或disabled时,不能使用此选项.
默认为0.
parnumthreads=n:设定并行区域内的线程数.
parreportn:设定自动并行时诊断信息的显示级别.
n可以为0到5.
parruntimecontroln、noparruntimecontrol:设定是否对符号循环边界的循环执行运行时检查代码.
parschedulekeyword[=n]:设定循环迭代的调度算法.
keyword可以为:–auto:由编译器或者运行时系统设定调度算法.
–static:将迭代分割成连续块.
–staticbalanced:将迭代分割成偶数大小的块.
–staticsteal:将迭代分割成偶数大小的块,但允许线程从临近线程窃取部分块.
–dynamic:动态获取迭代集.
–guided:设定迭代的最小值.
–guidedanalytical:使用指数分布或动态分布分割迭代.
–runtime:直到运行时才设定调度分割.
n为每个迭代数或块大小.
此设置,只能配合static、dynamic和guided使用.
parthresholdn:设定针对循环自动并行的阈值.
n为一个在0到100间的整数,限定针对循环自动并行的阈值:–如n为0,则循环总会被并行.
–如n为100,则循环只有在基于编译器分析应用的数据能达到预期收益时才并行.
–1到99为预期可能的循环加速百分比.
4INTELC/C++FORTRAN编译器36parallel:让自动并行器针对可以安全并行执行的循环生成多线程代码.
parallelsourceinfo=n、noparallelsourceinfo:设定当生成OpenMP或自动并行代码是否显示源位置.
n为显示级别:–0:禁止显示源位置信息.
–1:显示子程序名和行信息.
–2:显示路径、文件名、子程序名和行信息.
qopenmp:编译OpenMP程序.
注意:在一般只能在同一个节点内的CPU上运行OpenMP程序.
qopenmplib=type:设定链接时使用的OpenMP运行时库.
当前type只能设定为compat.
qopenmplink=library:设定采用动态还是静态链接OpenMP运行时库.
library可以为static和dynamic,分别表示静态和动态链接OpenMP运行时库.
qopenmpreportn:设定OpenMP并行器的诊断信息的显示级别.
n可以为0、1和2.
qopenmpsimd、noqopenmpsimd:设定是否启用OpenMPSIMD编译.
qopenmpstubs:使用串行模式编译OpenMP程序.
qopenmptask=model:设定OpenMP的任务模型.
model可以为:–intel:让编译接受Intel任务序列指导指令(#pragmaintel_omp_taskq和#pragmaintel_omp_task).
OpenMPAPI3.
0将被忽略.
–omp:让编译接受OpenMPAPI3.
0任务序列指导指令(#pragmaomp_task).
Intel任务序列指导指令将被忽略.
qopenmpthreadprivate=type:设定OpenMP线程私有的实现.
type可以为:–legacy:让编译器继承使用以前Intel编译器使用的OpenMP线程私有实现.
–compat:让编译器使用基于对每个私有线程变量应用__declspec(thread)属性的兼容OpenMP线程私有实现.
4.
4.
8浮点选项fasttranscendentals:让编译器使用超越函数代替,超越函数是较快但精度较低的实现.
fimfabsoluteerror=value[:funclist]:定义对于数学函数返回值允许的最大绝对误差的值.
value为正浮点数,funclist为函数名列表.
如:fimfabsoluteerror=0.
00001:sin,sinf.
4INTELC/C++FORTRAN编译器37fimfaccuracybits=bits[:funclist]:定义数学函数返回值的相对误差,包含除法及开方.
bits为正浮点数,指明编译器应该使用的正确位数,funclist为函数名列表.
如:fimfaccuracybits=23:sin,sinf.
bits与ulps之间的变换关系为:ulps=2p1bits,其中p为目标格式尾数bits的位数(对应单精度、双精度和长双精度分别为23、53和64).
fimfmaxerror=ulps[:funclist]:定义对于数学函数返回值的最大允许相对误差,包含除法及开方.
value为正浮点数,指定编译器可以使用的最大相对误差,funclist为函数名列表,如:fimfmaxerror=4.
0:sin,sinf.
fimfprecision[=value[:funclist]]:当设定使用何种数学库函数时,定义编译器应该使用的精度.
value可以为:–high:等价于maxerror=0.
6–medium:等价于maxerror=4–low:等价于accuracybits=11(对单精度)和accuracybits=26(对双精度)funclist为函数名列表,如:fimfprecision=high:sin,sinf.
fma、nofma:是否对存在融合乘加(fusedmultiplyaddFMA)的目标处理器启用融合乘加.
此选项只有在x或march参数设定COREAVX2或更高时才有效.
fpmodelkeyword:控制浮点计算的语义,keyword可以为:–precise:取消浮点数据的非值安全优化.
–fast[=1|2]:对浮点数据启用更加激进的优化.
–strict:启用精度和异常,禁止收缩,启用编译指示stdc和fenv_access.
–source:四舍五入中间结果到源定义精度.
–double:四舍五入中间结果到53bit(双)精度.
–extended:四舍五入中间结果到64bit(扩展)精度.
–[no]except:定义严格浮点异常编译指令是否启用.
keyword可以分成以下三组使用:–precise,fast,strict–source,double,extended–exceptfpport、nofpport:是否对浮点操作启用四舍五入.
fpspeculation=mode:设定推测浮点操作时使用的模式.
mode可以为:4INTELC/C++FORTRAN编译器38–fast:让编译器推测浮点操作.
–safe:让编译器在推测浮点操作有可能存在浮点异常时停止推测.
–strict:让编译器禁止浮点操作时推测.
–off:与strict相同.
fptrap=mode[,mode,.
.
.
]:设置主函数的浮点异常捕获模式.
mode可以为:–[no]divzero:是否启用被0除时的IEEE捕获.
–[no]inexact:是否启用不精确结果时的IEEE捕获.
–[no]invalid:是否启用无效操作时的IEEE捕获.
–[no]overflow:是否启用上溢时的IEEE捕获.
–[no]underflow:是否启用下溢时的IEEE捕获.
–[no]denormal:是否启用非正规时的IEEE捕获.
–all:启用上述所有的IEEE捕获.
–none:禁止启用上述所有的IEEE捕获.
–common:启用最常见的IEEE捕获:被0除、无效操作和上溢.
fptrapall=mode[,mode,.
.
.
]:设置所有函数的浮点异常捕获模式.
mode可以为:–[no]divzero:是否启用被0除时的IEEE捕获.
–[no]inexact:是否启用不精确结果时的IEEE捕获.
–[no]invalid:是否启用无效操作时的IEEE捕获.
–[no]overflow:是否启用上溢时的IEEE捕获.
–[no]underflow:是否启用下溢时的IEEE捕获.
–[no]denormal:是否启用非正规时的IEEE捕获.
–all:启用上述所有的IEEE捕获.
–none:禁止启用上述所有的IEEE捕获.
–common:启用最常见的IEEE捕获:被0除、无效操作和上溢.
ftz:赋值非常规操作结果为0.
mp1:提高浮点操作的精度和一致性.
pcn:设定浮点尾数精度.
n可以为:–32:四舍五入尾数到24位(单精度).
–64:四舍五入尾数到53位(双精度).
4INTELC/C++FORTRAN编译器39–80:四舍五入尾数到64位(扩展精度).
precdiv、noprecdiv:是否提高浮点除的精度.
precsqrt、noprecsqrt:是否提高开根的精度.
rcd:启用快速浮点数到整数转换.
4.
4.
9内联选项gnu89inline:设定编译器在C99模式时使用C89定义处理内联函数.
finline、fnoinline:是否对__inline声明的函数进行内联,并执行C++内联.
finlinefunctions、fnoinlinefunctions:对单个文件编译时启用函数内联.
finlinelimit=n:设定内联函数的最大数.
n为非负整数.
inlinecalloc、noinlinecalloc:是否设定编译器内联调用calloc()为调用malloc()和memset().
inlinefactor、noinlinefactor:是否设定适用于所有内联选项定义的上限的比例乘法器.
inlinelevel=n:设定内联函数的展开级别.
n可以为0、1、2.
4.
4.
10输出、调试及预编译头文件(PCH)选项c:仅编译成对象文件(.
o文件).
debug[keyword]:设定是否生成调试信息.
keyword可以为:–none:不生成调试信息.
–full或all:生成完全调试信息.
–minimal:生成最少调试信息.
–[no]emit_column:设定是否针对调试生成列号信息.
–[no]exprsourcepos:设定是否在表达式粒度级别生成源位置信息.
–[no]inlinedebuginfo:设定是否针对内联代码生成增强调试信息.
–[no]macros:设定是否针对C/C++宏生成调试信息.
–[no]pubnames:设定是否生成DWARFdebug_pubnames节.
–[no]semanticstepping:设定是否生成针对断点和单步的增强调试信息.
4INTELC/C++FORTRAN编译器40–[no]variablelocations:设定是否编译器生成有助于寻找标量局部变量的增强型调试信息.
–extended:设定关键字值semanticstepping和variablelocations.
–[no]parallel:设定是否编译器生成并行调试代码指令以有助于线程数据共享和可重入调用探测.
g:包含调试信息.
g0:禁止生成符号调试信息.
gdwarfn:设定生成调试信息时的DWARF版本,n可以为2、3、4.
ofile:指定生成的文件名.
pch:设定编译器使用适当的预编译头文件.
pchcreatefilename:设定生成预编译头文件.
pchdirdir:设定搜索预编译头文件的目录.
pchusefilename:设定使用的预编译头文件.
printmultilib:打印哪里系统库文件应该被发现.
S:设定编译器只是生成汇编文件但并不进行链接.
4.
4.
11预处理选项Bdir:设定头文件、库文件及可执行文件的搜索路径.
Dname[=value]:设定编译时的宏及其值.
dD:输出预处理的源文件中的#define指令.
dM:输出预处理后的宏定义.
dN:与dD类似,但只输出的#define指令的宏名.
E:设定预处理时输出到标注输出.
EP:设定预处理时输出到标注输出,忽略#line指令.
gcc、nogcc、gccsys:判定确定的GNU宏(__GNUC__、__GNUC_MINOR__和__GNUC_PATCHLEVEL__)是否定义.
4INTELC/C++FORTRAN编译器41gccincludedir、nogccincludedir:设定是否将gcc设定的头文件路径加入到头文件路径中.
H:编译时显示头文件顺序并继续编译.
I:设定头文件附加搜索路径.
icc、noicc:设定Intel宏(__INTEL_COMPILER)是否定义.
idirafterdir:设定dir路径到第二个头文件搜索路径中.
imacrosfilename:允许一个头文件在编译时在其它头文件前面.
iprefixprefix:指定包含头文件的参考目录的前缀.
iquotedir:在搜索的头文件路径前面增加dir目录以供那些使用引号而不是尖括号的文件使用.
isystemdir:附加dir目录到系统头文件的开始.
iwithprefixdir:附加dir目录到通过iprefix引入的前缀后,并将其放在头文件目录末尾的头文件搜索路径中.
iwithprefixbeforexdir:除头文件目录dir放置的位置与I声明的一样外,与iwithprefix类似.
M:让编译器针对各源文件生成makefile依赖行.
MD:预处理和编译,生成后缀为.
d包含依赖关系的输出文件.
MFfilename:让编译器在一个文件中生成makefile依赖信息.
MG:让编译器针对各源文件生成makefile依赖行.
与M类似,但将缺失的头文件作为生成的文件.
MM:让编译器针对各源文件生成makefile依赖行.
与M类似,但不包含系统头文件.
MMD:预处理和编译,生成后缀为.
d包含依赖关系的输出文件.
与M类似,但不包含系统头文件.
MP:让编译器对每个依赖生成伪目标.
MQtarget:对依赖生成改变默认目标规则.
target是要使用的目标规则.
与MT类似,但引用特定Make字符.
MTtarget:对依赖生成改变默认目标规则.
target是要使用的目标规则.
4INTELC/C++FORTRAN编译器42nostdinc++:对C++不搜索标准目录下的头文件,而搜索其它标准目录.
P:停止编译处理,并将结果写入文件.
pragmaoptimizationlevel=interpretation:指定如没有前缀指定时,采用何种优化级别编译指令解释.
interpretation可以为:–Intel:Intel解释.
–GCC:GCC解释.
Uname:取消某个宏的预定义.
undef:取消所有宏的预定义.
X:从搜索路径中去除标准搜索路径.
4.
4.
12C/C++语言选项ansi:与gcc的ansi选项兼容.
check=keyword[,keyword.
.
.
]:设定在运行时检查某些条件.
keyword可以为:–[no]conversions:设定是否在转换成较小类型时进行检查.
–[no]stack:设定是否在堆栈帧检查.
–[no]uninit:设定是否对未初始化变量进行检查.
fnognukeywords:让编译器不将typeof作为一个关键字.
fpermissive:让编译器允许非一致性代码.
fsyntaxonly:让编译器仅作语法检查,不生成目标代码.
funsignedchar:将默认字符类型变为无符号类型.
helppragma:显示所有支持的编译指令.
intelextensions、nointelextensions:是否启用IntelC和C++语言扩展.
restrict、norestrict:设定是否采用约束限定进行指针消岐.
std=val:val可以为c89、c99、gnu89、gnu++89或c++0x,分别对应相应标准.
stdlib[=keyword]:设定链接时使用的C++库.
keyword可以为:–libstdc++:链接使用GNUlibstdc++库.
4INTELC/C++FORTRAN编译器43–libc++:链接使用libc++库.
strictansi:让编译器采用严格的ANSI一致性语法.
xtype:type可以为c、c++、cheader、cppoutput、c++cppoutput、assembler、assemblerwithcpp或none,分别表示c源文件等,以使所有源文件都被认为是此类型的.
Zp[n]:设定结构体在字节边界的对齐.
n是字节大小边界,可以为1、2、4、8和16.
4.
4.
13Fortran语言选项autoscalar:INTEGER、REAL、COMPLEX和LOGICAL内在类型变量,如未声明有SAVE属性,将分配到运行时堆栈中,下次调用此函数时变量赋值.
allowkeyword:设定编译器是否允许某些行为.
keyword可以为[no]fpp_comments,声明fpp预处理器如何处理在预处理指令行中的Fortran行尾注释.
altparam、noaltparam:设定是否允许不同的语法(不带括号)PARAMETER声明.
assumekeyword[,keyword.
.
.
]:设定某些假设.
keyword可以为:none、[no]bscc、[no]buffered_io、[no]buffered_stdout、[no]byterecl、[no]cc_omp、[no]dummy_aliases、[no]fpe_summary、[no]ieee_fpe_flags、[no]minus0、[no]old_boz、[no]old_ldout_format、[no]old_logical_ldio、[no]old_maxminloc、[no]old_unit_star、[no]old_xor、[no]protect_constants、[no]protect_parens、[no]realloc_lhs、[no]source_include、[no]std_intent_in、[no]std_minus0_rounding、[no]std_mod_proc_name、[no]std_value、[no]underscore、[no]2underscores、[no]writeablestrings等ccdefaultkeyword:设置文件显示在终端上时的回车类型.
keyword可以为:–none:设定编译器使用无回车控制预处理.
–default:设定编译器使用默认回车控制设定.
–fortran:设定编译器使用通常的第一个字符的Fortran解释.
如字符0使得在输出一个记录时先输出一个空行.
–list:设定编译器记录之间出输出换行.
check=keyword[,keyword.
.
.
]:设定在运行时检查某些条件.
keyword可以为:–none:禁止所有检查.
–[no]arg_temp_created:设定是否在子函数调用前检查实参.
4INTELC/C++FORTRAN编译器44–[no]assume:设定是否在测试在ASSUME指令中的标量布尔表达式为真,或在ASSUME_ALIGNED指令中的地址对齐声明的类型边界时进行检查.
–[no]bounds:设定是否对数组下标和字符子字符串表达式进行检查.
–[no]format:设定是否对格式化输出的数据类型进行检查.
–[no]output_conversion:设定是否对在指定的格式描述域内的数据拟合进行检查.
–[no]pointers:设定是否对存在一些分离的或未初始化的指针或为分配的可分配目标时进行检查.
–[no]stack:设定是否在堆栈帧检查.
–[no]uninit:设定是否对未初始化变量进行检查.
–all:启用所有检查.
cpp:对源代码进行预处理,等价于fpp.
extendsource[size]:指明固定格式的Fortran源代码宽度,size可为72、80和132.
也可直接用72、80和132指定,默认为72字符.
fixed:指明Fortran源代码为固定格式,默认由文件后缀设定格式类别.
free:指明Fortran源程序为自由格式,默认由文件后缀设定格式类别.
nofree:指明Fortran源程序为固定格式.
implicitnone:指明默认变量名为未定义.
建议在写程序时添加implicitnone语句,以避免出现由于默认类型造成的错误.
nameskeyword:设定如何解释源代码的标志符和外部名.
keyword可以为:–lowercase:让编译器忽略标识符的大小写不同,并转换外部名为小写.
–uppercase:让编译器忽略标识符的大小写不同,并转换外部名为大写.
–as_is:让编译器区分标识符的大小写,并保留外部名的大小写.
padsource、nopadsource:对固定格式的源码记录是否采用空白填充行尾.
standkeyword:以指定Fortran标准进行编译,编译时显示源文件中不符合此标准的信息.
keyword可为f03、f90、f95和none,分别对应显示不符合Fortran2003、90、95的代码信息和不显示任何非标准的代码信息,也可写为stdkeyword,此时keyword不带f,可为03、90、95.
standardsemantics:设定编译器的当前Fortran标准行为是否完全实现.
syntaxonly:仅仅检查代码的语法错误,并不进行其它操作.
4INTELC/C++FORTRAN编译器45wrapmargin、nowrapmargin:提供一种在Fortran列表输出时禁止右边缘包装.
us:编译时给外部用户定义的函数名添加一个下划线,等价于assumeunderscore,如果编译时显示_函数找不到时也许添加此选项即可解决.
4.
4.
14数据选项共有选项–fcommon、fnocommon:设定编译器是否将common符号作为全局定义.
–fpic、fnopic:是否生成位置无关代码.
–fpie:类似fpic生成位置无关代码,但生成的代码只能链接到可执行程序.
*gcc:定义GNU宏.
*nogcc:取消定义GNU宏.
*gccsys:只有在编译系统头文件时定义GNU宏.
–mcmodel=mem_model:设定生成代码和存储数据时的内存模型.
mem_model可以为:*small:让编译器限制代码和数据使用最开始的2GB地址空间.
对所有代码和数据的访问可以使用指令指针(IP)相对地址.
*medium:让编译器限制代码使用最开始的2GB地址空间,对数据没有内存限制.
对所有代码的访问可以使用指令指针(IP)相对地址,但对数据的访问必须采用绝对地址.
*large:对代码和数据不做内存限制.
所有访问都得使用绝对地址.
–mlongdoublen:覆盖掉默认的长双精度数据类型配置.
n可以为:*64:设定长双精度数据为64位.
*80:设定长双精度数据为80位.
C/C++专有选项–autoilp32:让编译器分析程序设定能否将64位指针缩成32位指针,能否将64位长整数缩成32位长整数.
–autop32:让编译器分析程序设定能否将64位指针缩成32位指针.
–checkpointers=keyword:设定编译器是否检查使用指针访问的内存边界.
keyword可以为:*none:禁止检查,此为默认选项.
*rw:检查通过指针读写的内存边界.
*write:只检查通过内存写的内存边界.
4INTELC/C++FORTRAN编译器46–checkpointersdanglingkeyword:设定编译器是否对悬挂(dangling)指针参考进行检查.
keyword可以为:*none:禁止检查悬挂指针参考,此为默认选项.
*heap:检查heap的悬挂指针参考.
*stack:检查stack的悬挂指针参考.
*all:检查上述所有的悬挂指针参考.
–fkeepstaticconsts、fnokeepstaticconsts:设定编译器是否保留在源文件中没有参考的变量分配.
Fortran专有选项–convert[keyword]:转换无格式数据的类型,比如keyword为big_endian和little_endian时,分别表示无格式的输入输出为big_endian和little_endian格式,更多格式类型,请看编译器手册.
–doublesizesize:设定DOUBLEPRECISION和DOUBLECOMPLEX声明、常数、函数和内部函数的默认KIND.
size可以为64或128,分别对应KIND=8和KIND=16.
–dyncom"common1,common2,.
.
.
":对指定的common块启用运行时动态分配.
–fzeroinitializedinbss、fnozeroinitializedinbss:设定编译器是否将数据显式赋值为0的变量放置在DATA块内.
–intconstant、nointconstant:让编译器使用FORTRAN77语法设定整型常数的KIND参数.
–integersizesize:设定整型和逻辑变量的默认KIND.
size可以为16、32或64,分别对应KIND=2、KIND=4或KIND=8.
–nobssinit:让编译器将任何未初始化变量和显式初始化为0的变量放置在DATA块.
默认不启用,放置在BSS块.
–realsizesize:设定实型变量的默认KIND.
size可以为32、64或18,分别对应KIND=4、KIND=8或KIND=16.
–save:强制变量值存储在静态内存中.
此选项保存递归函数和用AUTOMATIC声明的所有变量(除本地变量外)在静态分配中,下次调用时可继续用.
默认为autoscalar,内在类型INTEGER、REAL、COMPLEX和LOGICAL变量分配到运行时堆栈中.
–zero、nozero:是否将所有保存的但未初始化的内在类型INTEGER、REAL、COMPLEX或LOGICAL的局部变量值初始为0.
4.
4.
15编译器诊断选项diagtype=diaglist:控制显示的诊断信息.
type可以为:4INTELC/C++FORTRAN编译器47–enable:启用一个或一组诊断信息.
–disable:禁用一个或一组诊断信息.
–error:让编译器将诊断信息变为错误.
–warning:让编译器将诊断信息变成警告–remark:让编译器将诊断信息变为备注.
diaglist可为:driver、portwin、thread、vec、par、openmp、warn、error、remark、cpudispatch、id[,id,.
.
.
]、tag[,tag,.
.
.
]等.
traceback、notraceback:编译时在对象文件中生成额外的信息使得在运行出错时可以提供源文件回朔信息.
w:编译时不显示任何警告,只显示错误.
wn:设置编译器生成的诊断信息级别.
n可以为:–0:对错误生成诊断信息,屏蔽掉警告信息.
–1:对错误和警告生成诊断信息.
此为默认选项.
–2:对错误和警告生成诊断信息,并增加些额外的警告信息.
–3:对备注、错误和警告生成诊断信息,并在级别2的基础上再增加额外警告信息.
建议对产品使用此级别.
–4:在级别3的基础上再增加一些警告和备注信息,这些增加的信息一般可以安全忽略.
Wabi、Wnoabi:设定生成的代码不是C++ABI兼容时是否显示警告信息.
Wall:编译时显示警告和错误信息.
Wbrief:采用简短方式显示诊断信息.
Wcheck:让编译器在对特定代码在编译时进行检查.
Werror:将所有警告信息变为错误信息.
Werrorall将所有警告和备注信息变为错误信息.
Winline:设定编译器显示哪些函数被内联,哪些未被内联.
Wunusedfunction、Wnounusedfunctio:设定是否在声明的函数未使用时显示警告信息.
Wunusedvariable、Wnounusedvariable:设定是否在声明的变量未使用时显示警告信息.
4INTELC/C++FORTRAN编译器484.
4.
16兼容性选项f66:FORTRAN程序特有.
使用FORTRAN66标准,默认为使用Fortran95标准.
f77rtl、nof77rtl:FORTRAN程序特有.
是否使用FORTRAN77运行时行为,默认为使用IntelFortran运行时行为.
控制以下行为:–当unit没有与一个文件对应时,一些INQUIRE说明符将返回不同的值:*NUMBER=返回0;*ACCESS=返回'UNKNOWN';*BLANK=返回'UNKNOWN';*FORM=返回'UNKNOWN'.
–PAD=对格式化输入默认为"NO'.
–NAMELIST和列表输入的字符串必需用单引号或双引号分隔.
–当处理NAMELIST输入时:*每个记录的第一列被忽略.
*出现在组名前的'$'或'&'必须在输入记录的第二列.
–fpscomp[keyword[,keyword.
.
.
]]、nofpscomp:FORTRAN程序特有.
设定是否某些特征与IntelFortran或Microsoft*FortranPowerStation兼容.
keyword可以为:*none:没有选项需要用于兼容性.
*[no]filesfromcmd:设定当OPEN声明中FILE=说明符为空时的兼容性.
*[no]general:设定当FortranPowerStation和IntelFortran语法存在不同时的兼容性.
*[no]ioformat:设定列表格式和无格式IO时的兼容性.
*[no]libs:设定可移植性库是否传递给链接器.
*[no]ldio_spacing:设定是否在运行时在数值量后字符值前插入一个空白.
*[no]logicals:设定代表LOGICAL值的兼容性.
*all:设定所有选项用于兼容性.
fabiversion=n:设定使用指定版本的ABI实现.
n可以为:–0:使用最新的ABI实现.
–1:使用gcc3.
2和gcc3.
3使用的ABI实现.
–2:使用gcc3.
4及更高的gcc中使用的ABI实现.
gccname=name:设定使用的gcc编译器的名字.
gxxnamename:设定使用的g++编译器的名字.
4INTELC/C++FORTRAN编译器494.
4.
17链接和链接器选项Bdynamic:在运行时动态链接所需要的库.
Bstatic:静态链接用户生成的库.
cxxlib[=dir]、cxxlibnostd、nocxxlib:设定是否使用gcc提供的C++运行时库及头文件.
dir为gcc二进制及库文件的顶层目录.
Idir:指明头文件的搜索路径.
Ldir:指明库的搜索路径.
lstring:指明所需链接的库名,如库名为libxyz.
a,则可用lxyz指定.
nolibgcc:禁止使用特定gcc库链接.
nodefaultlibs:禁止使用默认库链接.
nostartfiles:禁止使用标准启动文件链接.
nostdlib:禁止使用标准启动和库文件链接.
pie、nopie:设定编译器是否生成需要链接进可执行程序的位置独立代码pthread:对多线程启用pthreads库.
shared:生成共享对象文件而不是可执行文件,必须在编译每个对象文件时使用fpic选项.
sharedintel:动态链接Intel库.
sharedlibgcc:动态链接GNUlibgcc库.
static:静态链接所有库.
staticintel:静态链接Intel库.
staticlibgcc:静态链接GNUlibgcc库.
staticlibstdc++:静态链接GNUlibstdc++库.
usymbol:设定指定的符号未定义.
v:显示驱动工具编译信息.
Wa,option1[,option2,.
.
.
]:传递参数给汇编器进行处理.
Wl,option1[,option2,.
.
.
]:传递参数给链接器进行处理.
4INTELC/C++FORTRAN编译器50Wp,option1[,option2,.
.
.
]:传递参数给预处理器.
Xlinkeroption:将option信息传递给链接器.
4.
4.
18其它选项help[category]:显示帮助.
sox[=keyword[,keyword]]、nosox:设定是否让编译时在生成的可执行文件中保存编译选项和版本等信息,也可以指定是否保存子程序等信息.
–inline:包含在各目标文件中的内联子程序名.
–profile:包含编译时采用profuse的子程序列表,以及存储概要信息的.
dpi文件名和指明使用的和忽略的概要信息.
存储的信息可以使用以下方法查看:–objdumpsj.
commenta.
out–stringsaa.
out|grepcomment:V:显示版本信息.
–version:显示版本信息.
watch[=keyword[,keyword.
.
.
]]、nowatch:设定是否在控制台显示特定信息.
keyword可以为:–none:禁止cmd和source.
–[no]cmd:设定是否显示驱动工具命令及执行.
–[no]source:设定是否显示编译的文件名.
–all:启用cmd和source.
5PGIC/C++FORTRAN编译器515PGIC/C++Fortran编译器目前尚未真正配置,等以后配置5.
1PGIC/C++Fortran编译器简介PGIC/C++Fortran编译器是一种针对多种CPU与操作系统的高性能编译器,可用于开发复杂且要进行大量计算的程序.
当前安装的版本为2016.
7和2014.
10,分别安装在/opt/pgi16.
7/linux8664/16.
7、/opt/pgi/linux8664/14.
10.
安装在/opt/intel,可用moduleavail查看,用moudleload模块名使用,或在自己的~/.
bashrc之类环境设置文件中添加以下代码设置:§PATH=/opt/pgi/linux86-64/14.
10/bin:$PATHMANPATH=$MANPATH:/opt/pgi/linux86-64/14.
10/manexportPATHMANPATHPGI编译器编译C、C++、Fortran77源程序的命令分别为pgcc、pgCC|pgc++4和pgf77,编译Fortran90(为了描述方便,本手册中将Fortran90、95、2003、2008标准统称为Fortran90)的源程序的命令有pgf90、pgf901、pgf902、pgf90_ex、pgf95和pgfortran.
编译工具语言或函数命令PGF77ANSIFORTRAN77pgf77PGFORTRANISO/ANSIFortran2003pgfortran、pgf90、pgf95PGCCISO/ANSIC11andK&RCpgccPGC++ISO/ANSIC++14withGNUcompatibilitypgc++PGDBGSourcecodedebuggerpgdbgPGPROFPerformanceprofilerpgprof官方手册目录:安装目录/doc.
5.
2编译错误编译时的出错信息类似以下:PGF90-S-0034-Syntaxerroratornear*(NOlihm.
f90:2)编译错误的格式为:42016版为pgc++,之前版本为pgCC5PGIC/C++FORTRAN编译器52大写的编译命令严重级别错误编号解释,含指明位置(文件名:行号)错误严重级别分为:I:信息W:警告S:严重F:致命V:其它Fortran程序编译错误解释,参见:PGICompilerReferenceGuide>Chapter9.
MESSAGES>9.
3.
FortranCompilerErrorMessages>9.
3.
2.
MessageList5.
3Fortran程序运行错误Fortran程序运行时错误解释,参见:PGICompilerReferenceGuide>Chapter9.
MESSAGES>9.
4.
FortranRuntimeErrorMessages>9.
4.
2.
MessageList5.
4PGIC/C++编译器重要编译选项PGI编译器选项非常多,下面仅仅是列出一些本人认为常用的关于编译C程序的pgcc命令的重要选项.
编译C++程序的pgc++|pgCC命令有稍微不同,建议仔细查看PGI相关资料.
建议仔细查看编译器手册中关于程序优化的部分,多加测试,选择适合自己程序的编译选项以提高性能.
5.
4.
1一般选项#:显示编译器、汇编器、链接器的调用信息.
c:仅编译成对象文件(.
o文件).
defaultoptions和nodefaultoptions:是否使用默认选项,默认为使用.
flags:显示所有可用的编译选项.
help[=option]:显示帮助信息,option可以为groups、asm、debug、language、linker、opt、other、overall、phase、phase、prepro、suffix、switch、target和variable.
5PGIC/C++FORTRAN编译器53Minform=level:控制编译时错误信息的显示级别.
level可以为fatal、file、severe、warn、inform,默认为Minform=warn.
noswitcherror:显示警告信息后,忽略未知命令行参数并继续进行编译.
默认显示错误信息并且终止编译.
ofile:指定生成的文件名.
show:显示现有pgcc命令的配置信息.
silent:不显示警告信息,与Minform=severe等同.
v:详细模式,在每个命令执行前显示其命令行.
V:显示编译器版本信息.
w:编译时不显示任何警告,只显示错误.
5.
4.
2优化选项fast:编译时选择针对目标平台的普通优化选项.
用pgccfasthelp可以查看等价的开关.
优化级别至少为O2,参看O选项.
fastsse:对支持SSE和SSE2指令的CPU(如IntelXeonCPU)编译时选择针对目标平台的优化选项.
用pgccfastssehelp可以查看等价的开关,优化级别至少为O2,参看O选项.
fpic或fPIC:编译器生成地址无关代码,以便可用于生成共享对象文件(动态链接库).
Kpic或KPIC:与fpic或fPIC相同,为了与其余编译器兼容.
Minfo[=option[,option,…]]:显示有用信息到标准错误输出,选项可为all、autoinline、inline、ipa、loop或opt、mp、time或stat.
Mipa[=option[,option,…]]和Mnoipa:启用指定选项的过程间分析优化,默认为Mnoipa.
Mneginfo=option[,option…]:使编译器显示为什么特定优化没有实现的信息.
选项包括concur、loop和all.
Mnoopenmp:当使用mp选项时,忽略OpenMP并行指令.
Mnosgimp:当使用mp选项时,忽略SGI并行指令.
5PGIC/C++FORTRAN编译器54Mpfi:生成概要导向工具,此时将会包含特殊代码收集运行时的统计信息以用于子序列编译.
Mpfi必须在链接时也得使用.
当程序运行时,会生成概要导向文件pgfi.
out.
Mpfo:启用概要导向优化,此时必须在当前目录下有概要文件pgfi.
out.
Mprof[=option[,option,…]]:设置性能功能概要选项.
此选项可使得结果执行生成性能概要,以便PGPROF性能概要器分析.
mp[=option]:打开对源程序中的OpenMP并行指令的支持.
O[level]:设置优化级别.
level可设为0、1、2、3、4,其中4与3相同.
pg:使用gprof风格的基于抽样的概要刨析.
5.
4.
3调试选项g:包含调试信息.
5.
4.
4预处理选项C:预处理时保留C源文件中的注释.
Dname[=def]:预处理时定义宏name为def.
dD:打印源文件中已定义的宏及其值到标准输出.
dI:打印预处理中包含的所有文件信息,含文件名和定义时的行号.
dM:打印预处理时源文件已定义的宏及其值,含定义时的文件名和行号.
dN:与dD类似,但只打印源文件已定义的宏,而不打印宏值.
E:预处理每个.
c文件,将结果发送给标准输出,但不进行编译、汇编或链接等操作.
Idir:指明头文件的搜索路径.
M:打印make的依赖关系到标准输出.
MD:打印make的依赖关系到文件file.
d,其中file是编译文件的根名字.
MM:打印make的依赖关系到标准输出,但忽略系统头文件.
MMD:打印make的依赖关系到文件file.
d,其中file是编译的文件的根名字,但忽略系统头文件.
5PGIC/C++FORTRAN编译器55P:预处理每个文件,并保留每个file.
c文件预处理后的结果到file.
i.
Uname:去除预处理中的任何name的初始定义.
5.
4.
5链接选项Bdynamic:在运行时动态链接所需的库.
Bstatic:静态链接所需的库.
Bstatic_pgi:动态链接系统库时静态链接PGI库.
g77libs:允许链接GNUg77或gcc命令生成的库.
lstring:指明所需链接的库名.
如库为libxyz.
a,则可用lxyz指定.
Ldir:指明库的搜索路径.
m:显示链接拓扑.
Mrpath和Mnorpath:默认为rpath,以给出包含PGI共享对象的路径.
用Mnorpath可以去除此路径.
pgf77libs:链接时添加pgf77运行库,以允许混合编程.
r:生成可以重新链接的对象文件.
Rdirectory:对共享对象文件总搜索directory目录.
pgf90libs:链接时添加pgf90运行库,以允许混合编程.
shared:生成共享对象而不是可执行文件,必须在编译每个对象文件时使用fpic选项.
sonamename:生成共享对象时,用内在的DT_SONAME代替指定的name.
uname:传递给链接器,以生成未定义的引用.
5.
4.
6C/C++语言选项B:源文件中允许C++风格的注释,指的是以//开始到行尾内容为注释.
除非指定C选项,否则这些注释被去除.
c8x或c89:对C源文件采用C89标准.
c9x或c99:对C源文件采用C99标准.
5PGIC/C++FORTRAN编译器565.
4.
7Fortran语言选项byteswapio或Mbyteswapio:对无格式Fortran数据文件在输入输出时从大端(bigendian)到小端(littleendian)交换比特,或者相反.
此选项可以用于读写Sun或SGI等系统中的无格式的Fortran数据文件.
i2:将INTEGER变量按照2比特处理.
i4:将INTEGER变量按照4比特处理.
i8:将默认的INTEGER和LOGICAL变量按照4比特处理.
i8storage:对INTEGER和LOGICAL变量分配8比特.
Mallocatable[=95|03]:按照Fortran95或2003标准分配数组.
Mbackslash和Mnobackslash:将反斜线(\)当作正常字符(非转义符)处理,默认为Mnobackslash.
Mnobackslash导致标准的C反斜线转义序列在引号包含的字串中重新解析.
Mbackslash则导致反斜线被认为和其它字符一样.
Mextend:设置源代码的行宽为132列.
Mfixed、Mnofree和Mnofreeform:强制对源文件按照固定格式进行语法分析,默认.
f或.
F文件被认为固定格式.
Mfree和Mfreeform:强制对源文件按照自由格式进行语法分析,默认.
f90、.
F90、.
f95或.
F95文件被认为自由格式.
Mi4和Mnoi4:将INTEGER看作INTEGER*4.
Mnoi4将INTEGER看作INTEGER*2.
Mnomain:当链接时,不包含调用Fortran主程序的对象文件.
Mr8和Mnor8:将REAL看作DOUBLEPRECISION,将实(REAL)常数看作双精度(DOUBLEPRECISION)常数.
默认为否.
Mr8intrinsics[=float]和Mnor8intrinsics:将CMPLX看作DCMPLX,将REAL看作DBLE.
添加float选项时,将FLOAT看作DBLE.
Msave和Mnosave:是否将所有局部变量添加SAVE声明,默认为否.
Mupcase和Mnoupcase:是否保留名字的大小写.
Mnoupcase导致所有名字转换成小写.
注意,如果使用Mupcase,那么变量名X与变量名x不同,并且关键字必须为小写.
Mcray=pointer:支持Cray指针扩展.
6GNUC/C++FORTRAN编译器57moduledirectory:指定编译时保存生成的模块文件的目录.
r4:将DOUBLEPRECISION变量看作REAL.
r8:将REAL变量看作DOUBLEPRECISION.
5.
4.
8平台相关选项Kieee和Knoieee:浮点操作是否严格按照IEEE754标准.
使用Kieee时一些优化处理将被禁止,并且使用更精确的数值库.
默认为Knoieee,将使用更快的但精确性低的方式.
Ktrap=[option,[option]…]:控制异常发生时CPU的操作.
选项可为divz、fp、align、denorm、inexact、inv、none、ovf、unf,默认为none.
Msecond_underscore和Mnosecond_underscore:是否对已有_的Fortran函数名添加第二个_.
与g77编译命令兼容时使用,因为g77默认符号后添加第二个_.
mcmodel=small|medium:使内存模型是否限制对象小于2GB(small)或允许数据块大于2GB(medium).
medium时暗含Mlarge_arrays选项.
tptarget:target可以为haswell等,默认与编译时的平台一致.
6GNUC/C++Fortran编译器6.
1GNUC/C++Fortran编译器简介GNUC/C++Fortran(GCC)编译器为系统自带的编译器,当前自带的版本为4.
8.
5,还装有9.
2.
0等.
默认为4.
8.
5版本,用户无需特殊设置即可使用.
GNU编译器编译C、C++源程序的命令分别gcc和g++;LSgfortran可以直接编译Fortran77、90源程序.
6.
2编译错误C/C++程序编译时错误信息类似:netlog.
c:Infunction'main':netlog.
c:84:7:error:'for'loopinitialdeclarationsareonlyallowedinC99modenetlog.
c:84:7:note:useoption-std=c99or-std=gnu99tocompileyourcode编译错误的格式为:6GNUC/C++FORTRAN编译器58源文件名:函数中源文件名:行数:列数:错误类型:具体说明源文件名:行数:列数:注解:解决办法Fortran程序编译时错误信息类似:NOlihm.
f90:146.
14:n2nd=0;npr=01Error:Symbol'npr'at(1)hasnoIMPLICITtype编译错误的格式为:源文件名:行数:列数:源文件代码1指示出错位置错误类型:具体说明6.
3GNUC/C++编译器GCC重要编译选项GNU编译器GCC是Linux系统自带的编译器,系统自带的版本为4.
8.
5,另外还装有9.
2.
0等,选项非常多,下面仅仅是列出一些针对4.
8.
5本人认为常用的重要选项,建议仔细看GCC相关资料.
建议仔细查看编译器手册中关于程序优化的部分,多加测试,选择适合自己程序的编译选项以提高性能.
6.
3.
1控制文件类型的选项xlanguage:明确指定而非让编译器判断输入文件的类型.
language可为:–c、cheader、ccppoutput–c++、c++header、c++cppoutput–objectivec、objectivecheader、objectiveccppoutput–objectivec++、objectivec++header、objectivec++cppoutput–assembler、assemblerwithcpp6GNUC/C++FORTRAN编译器59–ada–f95、f95cppinput–java–treelang当language为none时,禁止任何明确指定的类型,其类型由文件名后缀设定.
c:仅编译成对象文件(.
o文件),并不进行链接.
ofile:指定生成的文件名.
v:详细模式,显示在每个命令执行前显示其命令行.
###:显示编译器、汇编器、链接器的调用信息但并不进行实际编译,在脚本中可以用于捕获驱动器生成的命令行.
–help:显示帮助信息.
–targethelp:显示目标平台的帮助信息.
–version:显示编译器版本信息.
6.
3.
2C/C++语言选项ansi:C模式时,支持所有ISOC90指令.
在C++模式时,去除与ISOC++冲突的GNU扩展.
std=val:控制语言标准,可以为c89、iso9899:1990、iso9899:199409、c99、c9x、iso9899:1999、iso9899:199x、gnu89、gnu99、gnu9x、c++98、gnu++98.
B:在源文件中允许C++风格的注释,指的是以//开始到行尾内容为注释.
除非指定C选项,否则这些注释被去除.
c8x或c89:对C源文件采用C89标准.
c9x或c99:对C源文件采用C99标准.
6.
3.
3Fortran语言选项fconvert=conversion:指定对无格式Fortran数据文件表示方式,其值可以为:native,默认值;swap,在输入输出时从大端(bigendian)到小端(littleendian)交换比特,或者相反;bigendian,用大端方式读写;littleendian,用小端方式读写.
ff2c:与g77和f2c命令生成的代码兼容.
6GNUC/C++FORTRAN编译器60ffreeform和ffixedform:声明源文件是自由格式还是固定格式,默认从Fortran90起的源文件为自由格式,之前的Fortran77等的源文件为固定格式.
fdefaultdouble8:设置DOUBLEPRECISION类型为8比特.
fdefaultinteger8:设置INTEGER和LOGICAL类型为8比特.
fdefaultreal8:设置REAL类型为8比特.
fnobackslash:将反斜线(\)当作正常字符(非转义符)处理.
fnounderscoring:不在名字后添加_.
注意:gfortran默认行为与g77和f2c不兼容,为了兼容需要加ff2c选项.
除非使用者了解与现有系统环境的集成,否则不建议使用fnounderscoring选项.
ffixedlinelengthn:设置固定格式源代码的行宽为n.
ffreelinelengthn:设置自由格式源代码的行宽为n.
fimplicitnone:禁止变量的隐式声明,所有变量都需要显式声明.
fmaxidentifierlength=n:设置名称的最大字符长度为n,Fortran95和200x的长度分别为31和65.
fnoautomatic:将每个程序单元的本地变量和数组声明具有SAVE属性.
fcraypointer:支持Cray指针扩展.
fopenmp:编译OpenMP并行程序.
Mdir和Jdir:指定编译时保存生成的模块文件目录.
fsecondunderscore:默认gfortran对外部函数名添加一个_,如果使用此选项,那么将添加两个_.
此选项当使用fnounderscoring选项时无效.
此选项当使用ff2c时默认启用.
std=val:指明Fortran标准,val可以为f95、f2003、legacy.
funderscoring:对外部函数名没有_的加_,以与一些Fortran编译器兼容.
6.
3.
4警告选项fsyntaxonly:仅仅检查代码的语法错误,并不进行其它操作.
w:编译时不显示任何警告,只显示错误.
Wfatalerrors:遇到第一个错误就停止,而不尝试继续运行显示更多错误信息.
6GNUC/C++FORTRAN编译器616.
3.
5调试选项g:包含调试信息.
ggdb:包含利用gbd调试时所需要的信息.
6.
3.
6优化选项O[level]:设置优化级别.
优化级别level可以设置为0、1、2、3、s.
6.
3.
7预处理选项C:预处理时保留C源文件中的注释.
Dname:预处理时定义宏name的值为1.
Dname=def:预处理时定义name为def.
Uname:预处理时去除的任何name初始定义.
undef:不预定义系统或GCC声明的宏,但标准预定义的宏仍旧被定义.
dD:显示源文件中定义的宏及其值到标准输出.
dI:显示预处理中包含的所有文件,包括文件名和定义时的行号信息.
dM:显示预处理时源文件中定义的宏及其值,包括定义时文件名和行号.
dN:与dD类似,但只显示源文件中定义的宏,而不显示宏值.
E:预处理各.
c文件,将结果发给标准输出,不进行编译、汇编或链接.
Idir:指明头文件的搜索路径.
M:打印make的依赖关系到标准输出.
MD:打印make的依赖关系到文件file.
d,其中file是编译文件的根名字.
MM:打印make的依赖关系到标准输出,但忽略系统头文件.
MMD:打印make的依赖关系到文件file.
d,其中file是编译的文件的根名字,但忽略系统头文件.
P:预处理每个文件,并保留每个file.
c文件预处理后的结果到file.
i.
6GNUC/C++FORTRAN编译器626.
3.
8链接选项pie:在支持的目标上生成地址无关的可执行文件.
s:从可执行文件中去除所有符号表.
rdynamic:添加所有符号表到动态符号表中.
static:静态链接所需的库.
shared:生成共享对象文件而不是可执行文件,必须在编译每个对象文件时使用fpic选项.
sharedlibgcc:使用共享libgcc库.
staticlibgcc:使用静态libgcc库.
usymbol:确保符号symbol未定义,强制链接一个库模块来定义它.
Idir:指明头文件的搜索路径.
lstring:指明所需链接的库名,如库为libxyz.
a,则可用lxyz指定.
Ldir:指明库的搜索路径.
Bdir:设置寻找可执行文件、库、头文件、数据文件等路径.
6.
3.
9i386和x8664平台相关选项mtune=cputype:设置优化针对的CPU类型,可为:generic、core2、opteron、opteronsse3、bdver1、bdver2等,bdver1为针对本系统AMDOpteronCPU的.
march=cputype:设置指令针对的CPU类型,CPU类型与上行中一样.
mieeefp和mnoieeefp:浮点操作是否严格按照IEEE标准.
6.
3.
10约定成俗选项fpic:生成地址无关的代码以用于共享库.
fPIC:如果目标机器支持,将生成地址无关的代码.
fopenmp:编译OpenMP并行程序.
fpie和fPIE:与fpic和fPIC类似,但生成的地址无关代码,只能链接到可执行文件中.
7MPI并行程序的编译63PartVIIMPI并行程序编译及运行本系统的通信网络由MellanoxQM8700HDR200交换机和ConnectX6HDR100网卡组成的100Gbps高速计算网络及1Gbps千兆以太网两套网络组成.
InfiniBand网络相比千兆以太网具有高带宽、低延迟的特点,通信性能比千兆以太网要高很多,建议使用.
本系统安装有多种MPI实现,主要有:HPCX(Mellanox官方推荐)、IntelMPI(不建议使用,特别是2019版)和OpenMPI,并可与不同编译器相互配合使用,安装目录分别在/opt/hpcx、/opt/intel和/opt/openmpi5.
用户可以运行moduleaproposMPI或moduleavail查看可用MPI环境,可用类似命令设置所需的MPI环境:moduleloadhpcx/hpcxintel2019.
update5,使用此命令有时需要手动加载对应的编译器等版本,比如报:errorwhileloadingsharedlibraries:libimf.
so:cannotopensharedobjectfile:Nosuchfileordirectory则需要加载对应的Intel编译器,比如moduleloadintel/2019.
update5.
注意:MellanoxHDR是比较新的高速计算网络,老的MPI环境对其支持不好.
7MPI并行程序的编译7.
1HPCXScalableHPC工具集MellanoxHPCXScalableHPC工具集是综合的软件包,含有MPI及SHMEM/PGAS通讯库.
HPCXScalableHPC还包含这些库之上的用于提升性能和扩展性的多种加速包,包括加速点对点通信的UCX(UnifiedCommunicationX)、加速MPI/PGAS中集合操作的FCA(FabricCollectivesAccelerations).
这些全特性的、经完备测试的及打包好的工具集使得MPI和SHMEM/PGAS程序获得高性能、扩展性和效率,且保证了在Mellanox互连系统中这些通信库经过了全优化.
MellanoxHPCXScalableHPC工具集利用了基于Mellanox硬件的加速引擎,可以最大化基于MPI和SHMEM/PGAS的应用性能.
这些应用引擎是Mellanox网卡(COREDirect引擎,硬件标记匹配(TagMatching)等)和交换机(如MellanoxSHARP加速引擎)解决方案的一部分.
Mellanox可扩展的分层聚合和归约协议(ScalableHierarchicalAggregationandReductionProtocol,SHARP)技术通过将集合操作从CPU端卸载到交换机网络端,通过去除在端到端之间发送多次数据的的需要,大幅提升了MPI操作性能.
5具有不同版本的OpenMPI与编译器的组合.
7MPI并行程序的编译64这种创新性科技显著降低了MPI操作时间,释放了重要的CPU资源使其用于计算而不是通信,且降低了到达聚合节点时通过网络的数据量.
HPCX主要特性如下:完整的MPI、PGAS/SHMEM包,且含有MellanoxUCX和FCA加速引擎兼容MPI3.
2标准兼容OpenSHMEM1.
4标准从MPI进程将集合通信从CPU卸载到Mellanox网络硬件上利用底层硬件体系结构最大化提升应用程序性能针对Mellanox解决方案进行了全优化提升应用的可扩展性和资源效率支持RC、DC和UD等多种传输节点内共享内存通信带消息条带的多轨支持支持GPUdirect的CUDAHPCX环境:HPCXCUDA支持:–HPCX默认是对于单线程模式优化的,这支持GPU和无GPU模式.
–HPCX是基于CUDA10.
1编译的,由于CUDA10.
1不支持比比GCCv8新的,因此对于基于v8之后的GCC编译的,不支持CUDA.
HPCX多线程支持hpcxmt:–该选项启用所有多线程支持.
HPCXMPI是OpenMPI的一种高性能实现,利用Mellanox加速能力且无缝结合了业界领先的商业和开源应用软件包进行了优化.
很多用法可参考OpenMPI库,该部分主要介绍其不同的参数设置等.
7MPI并行程序的编译657.
1.
1MellanoxFabric集合通信加速(FabricCollectiveAccelerator,FCA)集合通信执行全体工薪操作占用系统中所有进程/节点,因此必须执行越快越高效越好.
很多应用里面都含有大量的集合通讯,普通的MPI实现那会占用大量的CPU资源及产生系统噪声.
Mellanox将很多类似通信从CPU卸载到Mellanox硬件网卡适配器(HCA)和交换机上及降低噪声,这种技术称之为COREDirect(CollectivesOffloadResourceEngine).
FCA4.
4当前支持阻塞和非阻塞的集合通信:Allgather、Allgatherv、Allreduce、AlltoAll、AlltoAllv、Barrier和Bcast.
采用FCAv4.
x(hcoll)运行MPIHPCX默认启用FCAv4.
3.
采用默认FCA配置参数运行:mpirunmcacoll_hcoll_enable1xHCOLL_MAIN_IB=mlx5_0:1采用FCA运行:oshrunmcascoll_mpi_enable1mcascollbasic,mpimcacoll_hcoll_enable1OpenMPI中启用FCA在OpenMPI中启用FCAv4.
4,通过下述方法显式设定模块化组件架构模块化组件架构MCA(ModularComponentArchitecture)参数:mpirunnp32mcacoll_hcoll_enable1xcoll_hcoll_np=0\xHCOLL_MAIN_IB=:.
/a.
out调整FCAv4.
4配置显示当前信息:/opt/mellanox/hcoll/bin/hcoll_infoallFCAv4.
4的参数是简单的环境变量,可以通过以下方式之一设置:通过mpirun命令设置:mpirun.
.
.
xHCOLL_ML_BUFFER_SIZE=65536从SHELL设置:exportHCOLL_ML_BUFFER_SIZE=65536mpirun.
.
.
7MPI并行程序的编译66选择端口及设备xHCOLL_MAIN_IB=:启用卸载MPI非阻塞集合xHCOLL_ENABLE_NBC=1支持以下非阻塞MPI集合:MPI_IbarrierMPI_IbcastMPI_IallgatherMPI_Iallreduce(4b,8b,SUM,MIN,PROD,AND,OR,LAND,LOR)注意:启用非阻塞MPI集合将在阻塞MPI集合中禁止多播聚合.
启用MellanoxSHARP软件加速集合HPCX支持MellanoxSHARP软件加速集合,这些集合默认是启用的.
启用MellanoxSHARP加速:xHCOLL_ENABLE_SHARP=1禁止MellanoxSHARP加速xHCOLL_ENABLE_SHARP=0更改MellanoxSHARP消息阈值(默认为256):xHCOLL_BCOL_P2P_ALLREDUCE_SHARP_MAX=HCOLLv4.
4中的GPU缓存支持如果CUDA运行时(runtime)是有效的,则HCOLL自动启用GPU支持.
以下集合操作支持GPU缓存:MPI_AllreduceMPI_BcastMPI_Allgather7MPI并行程序的编译67如果libhcoll的其它聚合操作API被启用GPU缓存调用,则会检查缓存类型后返回错误HCOLL_ERROR.
控制参数为HCOLL_GPU_ENABLE,其值可为0、1和1:值含义0禁止GPU支持.
不会检查用户缓存指针.
此情形下,如用户提供在GPU上分配缓存,则这种行为是未定义的.
1启用GPU支持.
将检查缓存指针,且启用HCOLLGPU聚合,这是CUDA运行时有效时的默认行为.
1部分GPU支持.
将检查缓存指针,且HCOLL回退到GPU缓存情形下的运行时.
局限性对于MPI_Allreduce的GPU缓存支持,不是所有(OP,DTYPE)的组合都支持:支持的操作–SUM–PROD–MIN–MAX支持的类型–INT8、INT16、INT32、INt64–UINT8、UINT16、UINT32、UINT64–FLOAT16、FLOAT32、FLOAT64局限性环境变量HCOLL_ALLREDUCE_ZCOPY_TUNE=(默认为dynamic)用于设置HCOLL的大数据全归约操作算法的自动化运行优化级别.
如为Static,则对运行时不优化;如是dynamic,则允许HCOLL基于性能的运行时抽样自动调节算法的基数和zerocopy6阈值.
注:由于dynamic模式可能会导致浮点数归约结果有变化,因此不应该用于要求是数值可再现的情形下,导致该问题的原因在于非固定的归约顺序.
6zerocopy技术就是减少不必要的内核缓冲区跟用户缓冲区间的拷贝,从而减少CPU的开销和内核态切换开销,达到性能的提升7MPI并行程序的编译687.
1.
2统一通信X架构(UnifiedCommunicationXFramework,UCX)UCX是一种新的加速库,并且被集成到OpenMPI(作为pml层)和OpenSHMEM(作为spml层)中作为HPCX的一部分.
这是种开源的通信库,被设计为HPC应用能获得最高的性能.
UCX含有广泛范围的优化,能实现在通信方面接近低级别软件开销,接近原生级别的性能.
UCX支持接收端标记匹配、单边通信语义、有效内存注册和各种增强,能有效提高HPC应用的缩放性和性能.
UCX支持:InfiniBand传输:–不可信数据报(UnreliableDatagram,UD)–可信连接(ReliableConnected,RC)–动态连接(DynamicallyConnected,DC)–加速verbs(Acceleratedverbs)SharedMemorycommunicationwithsupportforKNEM,CMAandXPMEMRoCETCPCUDA更多信息,请参见:https://github.
com/openucx/ucx、http://www.
openucx.
org/OpenMPI中使用UCXUCX在OpenMPI是默认的pml,在OpenSHMEM中是默认的spml,一般安装好设置号后无需用户自己设置就可使用,用户也可利用下面方式显式指定:在OpenMPI中显式指定采用UCX:mpirunmcapmlucxmcaoscucx.
.
.
在OpenSHMEM显示指定采用UCX:oshrunmcaspmlucx.
.
.
7MPI并行程序的编译69调整UCX检查UCX的版本:$HPCX_UCX_DIR/bin/ucx_infovUCX的参数可通过下述方法之一设置:通过mpirun设置:mpirunxUCX_RC_VERBS_RX_MAX_BUFS=128000通过SHELL设置:exportUCX_RC_VERBS_RX_MAX_BUFS=128000mpirun从命令行选择采用的传输:mpirunmcapmlucxxUCX_TLS=sm,rc_x.
.
.
上述命令设置了采用pmlucx和设定其用于使用、共享内存和加速传输verbs.
为了提高缩放性能,可以加大DC传输时使用的网卡的DC发起者(DCI)的QPs数mpirunmcapmlucxxUCX_TLS=sm,dc_xxUCX_DC_MLX5_NUM_DCI=16对于大规模系统,当DC传输不可用或者被禁用时,UCX将回退到UD传输.
在256个连接建立后,RC传输将被禁用,该值可以利用UCX_RC_MAX_NUM_EPS环境变量加大.
设置UCX使用zerocopy时的阈值mpirunmcapmlucxxUCX_ZCOPY_THRESH=16384默认UCX会自己计算优化的该阈值,需要时可利用上面环境变量覆盖掉.
利用UCX_DC_MLX5_TX_POLICY=环境变量设定端点如何选择DC.
策略可以为:–dcs:端点或者采用已指定的DCI或DCI是LIFO顺序分配的,且在不在有操作需要时释放.
–dcs_quota:类似dcs.
另外,该DCI将在发送超过一定配额时,且有端点在等待DCI时被释放.
该DCI一旦完成其所有需要的操作后就被释放.
该策略确保了在端点间没有饥荒.
–rand:每个端点被赋予一个随机选择的DCI.
多个端点有可能共享相同的DCI.
7MPI并行程序的编译70利用UCXCUDA内存钩子也许在静态编译CUDA应用时不会生效,作为一个工作区,可利用下面选项扩展配置:xUCX_MEMTYPE_CACHE=0xHCOLL_GPU_CUDA_MEMTYPE_CACHE_ENABLE=0\xHCOLL_GPU_ENABLE=1GPUDirectRDMA性能问题可以通过分离协议禁止:xUCX_RNDV_SCHEME=get_zcopy共享内存新传输协议命名为:TBD可用的共享内存传输名是:posix、sysv和xpmemsm和mm将被包含咋以上三种方法中.
设备'device'名对于共享内存传输是'memory'(在UCX_SHM_DEVICES中使用)UCX特性硬件标识符匹配(TagMatching)从ConnectX5起,在UCX中之前由软件负责的标识符匹配工作可以卸载到HCA.
对于MPI应用发送消息时附带的数值标志符的加速对收到消息的处理,可以提高CPU利用率和降低等待消息的延迟.
在标识符匹配中,由软件控制的匹配入口表称为匹配表.
每个匹配入口含有一个标志符及对应一个应用缓存的指针.
匹配表被用于根据消息标志引导到达的消息到特定的缓存.
该传输匹配表和寻找匹配入口的动作被称为标识符匹配,该动作由HCA而不再由CPU实现.
在当收到的消息被不按照到达顺序而是基于与发送者相关的数值标记使用时,非常有用.
硬件标识符匹配使得省下的CPU可供其它应用使用.
当前硬件标识符匹配对于加速的RC和DC传输(RC_X和DC_X)是支持的,且可以在UCX中利用下面环境参数启用:对RC_X传输:UCX_RC_MLX5_TM_ENABLE=y对DC_X传输:UCX_DC_MLX5_TM_ENABLE=y默认,只有消息大于一定阈值时才卸载到传输.
该阈值由UCXTM_THRESH环境变量控制,默认是1024比特.
对于硬件标识符匹配,特定阈值时,UCX也许用回弹缓冲区(bouncebuffer)卸载内部预注册缓存代替用户缓存.
该阈值由UCX_TM_MAX_BB_SIZE环境变变量控制,该值等于或小于分片大小,且必须大于UCX_TM_THRESH才能生效(默认为1024比特,即默认优化是被禁止的).
7MPI并行程序的编译71CUDAGPUHPCX中的CUDA环境支持,使得HPCX在针对点对点和集合函数的UCX和HCOLL通信库中使用各自NVIDIAGPU显存.
系统已安装了NVIDIApeermemory,支持GPUDirectRDMA.
片上内存(MEMIC)片上内存允许从UCX层发送消息时使用设备上的内存,该特性默认启用.
它仅支持UCX中的rc_x和dc_x传输.
控制这些特性的环境变量为:UCX_RC_MLX5_DM_SIZEUCX_RC_MLX5_DM_COUNTUCX_DC_MLX5_DM_SIZEUCX_DC_MLX5_DM_COUNT针对这些参数的更多信息,可以运行ucx_info工具查看:$HPCX_UCX_DIR/bin/ucx_infof.
生成OpenMPI/OpenSHMEM的UCX统计信息为生成统计信息,需设定统计目的及触发器,它们可被选择性过滤或/和格式化.
统计目的可以利用UCX_STATS_DEST环境变量设置,其值可以为下列之一:空字符串不会生成统计信息file:存到一个文件中,具有以下替换:%h:host,%p:pid,%c:cpu,%t:time,%e:exe,如文件名有%h,则自动替换为节点名stderr显示标准错误信息stdout显示标准输出udp:[:]通过UDP协议发送到host:port比如:exportUCX_STATS_DEST="file:ucx_%h_%e_%p.
stats"exportUCX_STATS_DEST="stdout"7MPI并行程序的编译72触发器通过UCX_STATS_TRIGGER环境变量设置,其值可以为下述之一:exit在程序退出前存储统计信息timer:每隔一定时间存储统计信息signal:当进程收到信号时存储统计信息比如:exportUCX_STATS_TRIGGER=exitexportUCX_STATS_TRIGGER=timer:3.
5利用UCX_STATS_FILTER环境变量可以过滤报告中的计数器.
它接受以,分割的一组匹配项以指定显示的计数器,统计概要将包含匹配的计数器,批配项的顺序是没关系的.
列表中的每个表达式可以包含任何以下选项:*匹配任意字符,包含没有(显示全部报告)匹配任意单子字符[abc]匹配在括号中的一个字符[az]匹配从括号中一定范围的字符关于该参数的更多信息可以参见:https://github.
com/openucx/ucx/wiki/Statistics.
利用UCX_STATS_FORMAT环境参数可以控制统计的格式:full每个计数器都将被在一个单行中显示agg每个计数器将在一个单行中显示,但是将会聚合类似的计数器summary所有计数器将显示在同一行注意:统计特性只有当编译安装UCX库时打开启用统计标记的时候才生效.
默认为No,即不启用.
因此为了使用统计特性,请重新采用contrib/configureprof文件编译UCX,或采用debug版本的UCX,可以在$HPCX_UCX_DIR/debug中找到:mpirunmcapmlucxxLD_PRELOAD=$HPCX_UCX_DIR/debug/lib/libucp.
so.
.
.
注意:采用上面提到的重新编译的UCX将会影响性能.
7MPI并行程序的编译737.
1.
3PGAS共享内存访问(OpenSHMEM)共享内存(SHMEM)子程序为高级并行扩展程序提供了低延迟、高带宽的通信.
这些子程序在SHMEMAPI中提供了用于在协作并行进程间交换数据的编程模型.
SHMEMAPI可在同一个并行程序中独自或与MPI子程序一起使用.
SHMEM并行编程库是一种非常简单易用的编程模型,可以使用高效的单边通讯API为共享或分布式内存系统提供直观的全局观点接口.
SHMEM程序是单程序多数据(SPMD)类型的.
所有的SHMEM进程,被引用为进程单元(PEs),同时启动且运行相同程序.
通常,PEs在它们大程序中自己的子域进行计算,并且周期性与其它下次通讯依赖的PEs进行通信实现数据交换.
SHMEM子程序最小化数据传输请求、最大化带宽以及最小化数据延迟(从一个PE初始化数据传输到结束时的时间周期差).
SHMEM子程序通过以下支持远程数据传输:put操作:传递数据给一个不同PE;get操作:从一个不同PE和远程指针获取数据,允许直接访问属于其它PE的数据.
其它支持的操作是集合广播和归约、栅栏同步和原子内存操作(atomicmemoryoperation).
原子内存操作指的是原子(不允许多个进程同时)读更新操作,比如对远程或本地数据的获取增加.
SHMEM库实现激活消息.
源处理器将数据传输到目的处理器时仅涉及一个CPU,例如,一个处理器从另外处理器内存读取数据而无需中断远程CPU,除非编程者实现了一种机制去告知这些,否则远程处理器察觉不到其内存被读写.
HPCXOpenMPI/OpenSHMEMHPCXOpenMPI/OpenSHMEM编程库是单边通信库,支持唯一的并行编程特性集合,包括并行程序应用进程间使用的点对点和集合子程序、同步、原子操作、和共享内存范式.
HPCXOpenSHMEM基于OpenSHMEM.
org协会定义的API,该库可在OFED(OpenFabricsRDMAforLinuxstack)上运行,并可使用UCX和MellanoxFCA,为运行在InfiniBand上的SHMEM程序提供了史无前例的可扩展性级别.
7MPI并行程序的编译74运行HPCXOpenSHMEM采用UCX运行HPCXOpenSHMEM对于HPCX,采用spml对程序提供服务.
v2.
1及之后的版本的HPCX,ucx已是默认的spml,无需特殊指定,或者也可在oshrun命令行添加mcaspmlucx显式指定.
所有的UCX环境参数,oshrun使用时与mpirun一样,完整的列表可运行下面命令获取:$HPCX_UCX_DIR/bin/ucx_infof采用HPCXOpenSHMEM与MPI一起开发应用SHMEM编程模型提供了一种提高延迟敏感性部分的性能的方法.
通常,要求采用调用shmem_put/shmem_get和shmem_barrier来代替调用MPI中的send/recv.
SHMEM模型对于短消息来说可以相比传统的MPI调用能显著降低延时.
对于MPI2MPI_Put/MPI_Get函数,也可以考虑替换为shmem_get/shmem_put调用.
HPCXOpenSHMEM调整参数HPCXOpenSHMEM采用MCA参数来调整设置用户应用运行时环境.
每个参数对应一种特定函数,以下为可以改变用于应用函数的参数:memheap:控制内存分配策略及阈值scoll:控制HPCXOpenSHMEM集合API阈值及算法spml:控制HPCXOpenSHMEM点对点传输逻辑及阈值atomic:控制HPCXOpenSHMEM原子操作逻辑及阈值shmem:控制普通HPCXOpenSHMEMAPI行为显示HPCXOpenSHMEM参数:显示所有可用参数:–oshmem_infoa7MPI并行程序的编译75显示HPCXOpenSHMEM特定参数:–oshmem_infoparamshmemall–oshmem_infoparammemheapall–oshmem_infoparamscollall–oshmem_infoparamspmlall–oshmem_infoparamatomicall注意:在所有节点上运行OpenSHMEM应用或性能测试时,需要执行以下命令以释放内存:echo3>/proc/sys/vm/drop_caches针对对称堆(SymmetricHeap)应用的OpenSHMEMMCA参数SHMEMmemheap大小可以通过对oshrun命令添加SHMEM_SYMMETRIC_HEAP_SIZE参数来设置,默认为256M.
例如,采用64Mmemheap来运行SHMEM:oshrunxSHMEM_SYMMETRIC_HEAP_SIZE=64Mnp512mcampi_paffinity_alone1\mapbynodedisplaymaphostfilemyhostfileexample.
exememheap可以采用下述方法分配:sysv:systemV共享内存API,目前不支持采用大页面(hugepages)分配.
verbs:采用IBverbs分配子.
mmap:采用mmap()分配内存.
ucx:通过UCX库分配和注册内存默认,HPCXOpenSHMEM会自己寻找最好的分配子,优先级为verbs、sysv、mmap和ucx,也可以采用mcasshmem指定分配方法.
用于强制连接生成的参数通常,SHMEM会在PE间消极地生成连接,一般是在第一个通信发生时.
7MPI并行程序的编译76开始时就强制连接生成,设定MCA参数:mcashmem_preconnect_all1内存注册器(如,infinibandrkeys)信息启动时会在进程间交换.
启用按需内存密钥(key)交换,可设置MCA参数:mcashmalloc_use_modex07.
2OpenMPI库OpenMPI7库是另一种非常优秀MPI实现,用户如需使用可以自己通过运行moduleload选择加载与openmpi相关的项自己设置即可.
OpenMPI的安装目录在/opt/openmpi下.
OpenMPI的编译命令主要为:C程序:mpiccC++程序:mpic++、mpicxx、mpiCCFortran77程序:mpif77、mpif90、mpifortFortran90程序:mpif90Fortran程序:mpifort8mpifort为1.
8系列引入的编译Fortran程序的命令.
mpif77和mpif90为1.
6系列和1.
8系列的编译Fortran程序的命令.
对于MPI并行程序,对应不同类型源文件的编译命令如下:将C语言的MPI并行程序yourprogmpi.
c编译为可执行文件yourprogmpi:mpiccoyourprogmpiyourprogmpi.
c将C++语言的MPI并行程序yourprogmpi.
cpp编译为可执行文件yourprogmpi,也可换为mpic++或mpiCC:mpicxxoyourprogmpiyourprogmpi.
cpp将Fortran90语言的MPI并行程序yourprogmpi.
f90编译为可执行文件yourprogmpi:mpifortoyourprogmpiyourprogmpi.
f907主页:http://www.
open-mpi.
org/8注意为mpifort,而不是IntelMPI的mpiifort7MPI并行程序的编译77将Fortran77语言的MPI并行程序yourprogmpi.
f编译为可执行文件yourprogmpi:mpif77oyourprogmpiyourprogmpi.
f将Fortran90语言的MPI并行程序yourprogmpi.
f90编译为可执行文件yourprogmpi:mpif90oyourprogmpiyourprogmpi.
f90编译命令的基本语法为:编译命令[showme|showme:compile|showme:link].
.
.
编译参数可以为:–showme:显示所调用的编译器所调用编译参数等信息.
–showme:compile:显示调用的编译器的参数–showme:link:显示调用的链接器的参数–showme:command:显示调用的编译命令–showme:incdirs:显示调用的编译器所使用的头文件目录,以空格分隔.
–showme:libdirs:显示调用的编译器所使用的库文件目录,以空格分隔.
–showme:libs:显示调用的编译器所使用的库名,以空格分隔.
–showme:version:显示OpenMPI的版本号.
默认使用配置OpenMPI时所用的编译器及其参数,可以利用环境变量来改变.
环境变量格式为OMPI_value,其value可以为:CPPFLAGS:调用C或C++预处理器时的参数LDFLAGS:调用链接器时的参数LIBS:调用链接器时所添加的库CC:C编译器CFLAGS:C编译器参数CXX:C++编译器CXXFLAGS:C++编译器参数F77:Fortran77编译器FFLAGS:Fortran77编译器参数FC:Fortran90编译器FCFLAGS:Fortran90编译器参数7MPI并行程序的编译787.
3IntelMPI库特别提醒:IntelMPI针对最新的MellanoxHDR有问题,不建议使用;如您的应用运行起来没问题,也可以使用.
IntelMPI库9是一种多模消息传递接口(MPI)库,所安装的5.
0版本IntelMPI库实现了MPIV3.
0标准.
IntelMPI库可以使开发者采用新技术改变或升级其处理器和互联网络而无需改编软件或操作环境成为可能.
主要包含以下内容:IntelMPI库运行时环境(RTO):具有运行程序所需要的工具,包含多功能守护进程(MPD)、Hydra及支持的工具、共享库(.
so)和文档.
IntelMPI库开发套件(SDK):包含所有运行时环境组件和编译工具,含编译器命令,如mpiicc、头文件和模块、静态库(.
a)、调试库、追踪库和测试代码.
7.
3.
1编译命令请注意,IntelMPI与OpenMPI等MPI实现不同,mpicc、mpif90和mpifc命令默认使用GNU编译器,如需指定使用Intel编译器等,请使用对应的mpiicc、mpiicpc和mpiifort命令.
下表为IntelMPI编译命令及其对应关系.
其中:ia32:IA32架构.
intel64:Intel64(x86_64,amd64)架构.
移植现有的MPI程序到IntelMPI库时,请重新编译所有源代码.
如需显示某命令的简要帮助,可以不带任何参数直接运行该命令.
7.
3.
2编译命令参数mt_mpi:采用以下级别链接线程安全的MPI库:MPI_THREAD_FUNNELED,MPI_THREAD_SERIALIZED或MPI_THREAD_MULTIPLE.
IntelMPI库默认使用MPI_THREAD_FUNNELED级别线程安全库.
注意:–如使用IntelC编译器编译时添加了openmp、qopenmp或parallel参数,那么使用线程安全库.
–如果用IntelFortran编译器编译时添加了如下参数,那么使用线程安全库:9主页:http://software.
intel.
com/en-us/intel-mpi-library/7MPI并行程序的编译79表7:IntelMPI编译命令及其对应关系编译命令调用的默认编译器命令支持的语言支持的应用二进制接口通用编译器mpiccgcc,ccC32/64bitmpicxxg++C/C++32/64bitmpifcgfortranFortran77*/Fortran95*32/64bitGNU*CompilersVersions3andHighermpigccgccC32/64bitmpigxxg++C/C++32/64bitmpif77g77Fortran7732/64bitmpif90gfortranFortran9532/64bitIntelFortran,C++CompilersVersions11.
1andHighermpiicciccC32/64bitmpiicpcicpcC++32/64bitmpiifortifortFortran77/Fortran9532/64bit*openmp*qopenmp*parallel*threads*reentrancy*reentrancythreadedstatic_mpi:静态链接IntelMPI库,并不影响其它库的链接方式.
static:静态链接IntelMPI库,并将其传递给编译器,作为编译器参数.
config=name:使用的配置文件.
profile=profile_name:使用的MPI分析库文件.
t或trace:链接IntelTraceCollector库.
check_mpi:链接IntelTraceCollector正确性检查库.
ilp64:打开局部ILP64支持.
对于Fortran程序编译时如果使用i8选项,那么也需要此ILP64选项.
7MPI并行程序的编译80dynamic_log:与t组合使用链接IntelTraceCollector库.
不影响其它库链接方式.
g:采用调试模式编译程序,并针对IntelMPI调试版本生成可执行程序.
可查看官方手册Environmentvariables部分I_MPI_DEBUG变量查看g参数添加的调试信息.
采用调试模式时不对程序进行优化,可查看I_MPI_LINK获取IntelMPI调试版本信息.
link_mpi=arg:指定链接MPI的具体版本,具体请查看I_MPI_LINK获取IntelMPI版本信息.
此参数将覆盖掉其它参数,如mt_mpi、t=log、trace=log和g.
O:启用编译器优化.
fast:对整个程序进行最大化速度优化.
此参数强制使用静态方法链接IntelMPI库.
mpiicc、mpiicpc和mpiifort编译命令支持此参数.
echo:显示所有编译命令脚本做的信息.
show:仅显示编译器如何链接,但不实际执行.
{cc,cxx,fc,f77,f90}=compiler:选择使用的编译器.
如:mpicccc=iccctest.
c.
gccversion=nnn,设置编译命令mpicxx和mpiicpc编译时采用部分GNUC++环境的版本,如nnn的值为340,表示对应GNUC++3.
4.
x.
值GNU*C++版本3203.
2.
x3303.
3.
x3403.
4.
x4004.
0.
x4104.
1.
x4204.
2.
x4304.
3.
x4404.
4.
x4504.
5.
x4604.
6.
x4704.
7.
xcompchk:启用编译器设置检查,以保证调用的编译器配置正确.
v:显示版本信息.
7MPI并行程序的编译817.
3.
3环境变量I_MPI_{CC,CXX,FC,F77,F90}_PROFILE和MPI{CC,CXX,FC,F77,F90}_PROFILE:–默认分析库.
–语法:I_MPI_{CC,CXX,FC,F77,F90}_PROFILE=.
–过时语法:MPI{CC,CXX,FC,F77,F90}_PROFILE=.
I_MPI_TRACE_PROFILE:–设定trace参数使用的默认分析文件.
–语法:I_MPI_TRACE_PROFILE=–I_MPI_{CC,CXX,F77,F90}_PROFILE环境变量将覆盖掉I_MPI_TRACE_PROFILE.
I_MPI_CHECK_PROFILE:–设定check_mpi参数使用的默认分析.
–语法:I_MPI_CHECK_PROFILE=.
I_MPI_CHECK_COMPILER:–设定启用或禁用编译器兼容性检查.
–语法:I_MPI_CHECK_COMPILER=.
*为enable|yes|on|1时打开兼容性检查.
*为disable|no|off|0时,关闭编译器兼容性检查,为默认值.
I_MPI_{CC,CXX,FC,F77,F90}和MPICH_{CC,CXX,FC,F77,F90}:–语法:I_MPI_{CC,CXX,FC,F77,F90}=.
–过时语法:MPICH_{CC,CXX,FC,F77,F90}=.
–为编译器的编译命令名或路径.
I_MPI_ROOT:–设置IntelMPI库的安装目录路径.
–语法:I_MPI_ROOT=.
–为IntelMPI库的安装后的目录.
VT_ROOT:–设置IntelTraceCollector的安装目录路径.
7MPI并行程序的编译82–语法:VT_ROOT=.
–为IntelTraceCollector的安装后的目录.
I_MPI_COMPILER_CONFIG_DIR:–设置编译器配置目录路径.
–语法:I_MPI_COMPILER_CONFIG_DIR=.
–为编译器安装后的配置目录,默认值为//etc.
I_MPI_LINK:–设置链接MPI库版本.
–语法:I_MPI_LINK=.
–可为:*opt:优化的单线程版本IntelMPI库;*opt_mt:优化的多线程版本IntelMPI库;*dbg:调试的单线程版本IntelMPI库;*dbg_mt:调试的多线程版本IntelMPI库;*log:日志的单线程版本IntelMPI库;*log_mt:日志的多线程版本IntelMPI库.
7.
3.
4编译举例对于MPI并行程序,对应不同类型源文件的编译命令如下:调用默认C编译器将C语言的MPI并行程序yourprogmpi.
c编译为可执行文件yourprogmpi:mpiccoyourprogmpiyourprogmpi.
c调用IntelC编译器将C语言的MPI并行程序yourprogmpi.
c编译为可执行文件yourprogmpi:mpiiccoyourprogmpiyourprogmpi.
cpp调用IntelC++编译器将C++语言的MPI并行程序yourprogmpi.
cpp编译为可执行文件yourprogmpi:mpiicxxoyourprogmpiyourprogmpi.
cpp调用GNUForttan编译器将Fortran77语言的MPI并行程序yourprogmpi.
f编译为可执行文件yourprogmpi:mpif90oyourprogmpiyourprogmpi.
f7MPI并行程序的编译83调用IntelFortran编译器将Fortran90语言的MPI并行程序yourprogmpi.
f90编译为可执行文件yourprogmpi:mpiifortoyourprogmpiyourprogmpi.
f907.
3.
5调试使用以下命令对IntelMPI库调用GDB调试器:mpirungdbn4.
/testc可以像使用GDB调试串行程序一样调试.
也可以使用以下命令附着在一个运行中的作业上:mpirunn4gdba其中为运行中的MPI作业进程号.
环境变量I_MPI_DEBUG提供一种获得MPI应用运行时信息的方式.
可以设置此变量的值从0到1000,值越大,信息量越大.
mpirungenvI_MPI_DEBUG5n8.
/my_application更多信息参见程序调试章节.
7.
3.
6追踪使用t或trace选项链接调用IntelTraceCollector库生成可执行程序.
此与当在mpiicc或其它编译脚本中使用profile=vt时具有相同的效果.
mpiicctracetest.
cotestc在环境变量VT_ROOT中包含用IntelTraceCollector库路径以便使用此选项.
设置I_MPI_TRACE_PROFILE为环境变量指定另一个概要库.
如设置I_MPI_TRACE_PROFILE为vtfs,以链接failsafe版本的IntelTraceCollector库.
7.
3.
7正确性检查使用check_mpi选项调用IntelTraceCollector正确性检查库生成可执行程序.
此与当在mpiicc或其它编译脚本中使用profile=vtmc时具有相同的效果.
mpiiccprofile=vtmctest.
cotestc或mpiicccheck_mpitest.
cotestc在环境变量VT_ROOT中包含用IntelTraceCollector库路径以便使用此选项.
设置I_MPI_CHECK_PROFILE为环境变量指定另一个概要库.
8MPI并行程序的运行847.
3.
8统计收集如果想收集在应用使用的MPI函数统计,可以设置I_MPI_STATS环境变量的值为1到10.
设置好后再运行MPI程序,则在stats.
txt文件中存储统计信息.
7.
4与编译器相关的编译选项MPI编译环境的编译命令实际上是调用Intel、PGI或GCC编译器进行编译,具体优化选项等,请参看IntelMPI、OpenMPI以及Intel、PGI和GCC编译器手册.
8MPI并行程序的运行MPI程序最常见的并行方式类似为:mpirunn40yourmpiprog.
在本超算系统上,MPI并行程序需结合Slurm作业调度系统的作业提交命令sbatch、srun或salloc等来调用作业脚本运行,请参看Slurm作业管理系统.
10基本启动方式85PartVIII程序调试从IntelC/C++Fortran编译器2015版开始,采用的是Intel改造的GDB调试器,命令为gdbia.
PGI调试器很多调试命令类似GDB调试器,请自己查看相关资料.
9GDB调试器简介GDB调试器可以让使用者查看其它程序运行时内部发生了什么或查看其它程序崩溃时程序在做什么.
主要包括以下四项功能以便帮助找出bug:启动程序,并指定任何可能影响行为的东西.
使程序在特定条件下停止.
当程序停止时,检查发生了什么.
修改程序中的一些东西,以便能用正确的东西影响bug,并获得进一步信息.
GDB调试可用于调试采用C/C++、Fortran、D、Modula2、OpenCLC、Pascal、ObjectiveC等编写的程序.
注:GDB内部命令支持缩写,在不引起歧义的情况下,允许只输入命令的前几个字符,如l与list等同.
10基本启动方式GDB调试器在Linux系统上可以采用命令行(commandline)和图形界面(GUI,借助Eclipse*IDE或xxgdb)两种方式进行调试.
图形界面的GDB调试器相对简单,本手册主要介绍基于命令行的GDB调试器.
基于命令行的启动方式主要有如下几种:最常用的方式是只跟程序名为参数,启动调试程序:gdbprogram启动应用程序及以前其出错时生成的core文件:gdbprogramcore10基本启动方式86利用运行程序的进程号吸附到运行中程序进行调试:gdbprogram1234如果需要调试的程序有参数,那么需要添加–args参数:gdbargsgccO2cfoo.
c采用静默方式启动,不打印启动后的版权信息等:gdbsilent仅显示帮助信息等:gdbhelp10.
1选择启动时文件当GDB启动的时候,它读取除选项之外的任何参数用于指定可执行程序文件和core文件(或进程号),这与分别采用se和c(或p)参数类似(gdb读取参数时,如第一个参数没有关联选项标记,那么等价于跟着se选项之后的参数,如第二个参数没有关联选项标记,那么等价于跟着c/p选项之后的参数).
如果第二个参数以十进制数字开始,那么gdb尝试将其作为进程号并进行吸附,如果失败,则尝试作为core文件打开.
如果以数字开始的core文件,那么可以在此之前添加.
/以防止被认为是进程号,例如.
/12345.
很多选项同时具有长格式和短格式两种格式,如果采用了截断的长格式选项,且长度足够避免歧义,那么也可以被重新辨认为长格式.
(如果你喜欢,可以采用–而不是来标记选项参数).
symbolsfile、sfile:从文件file中读取符号表.
execfile、efile:适当时采用文件file作为可执行程序,并且与coredump文件关联时用于检查纯数据.
sefile:从文件file中读取符号表,并且将其作为可执行文件.
corefile、cfile:将文件file作为coredump文件进行检查.
pidnumber、pnumber:将附带的命令吸附到进程号number.
commandfile、xfile:指定启动后执行的命令文件file,文件file中保存一系列命令,启动后会顺序执行.
evalcommandcommand、excommand:执行单个gdb命令,此选项可以多次使用以多次调用命令.
需要时,此选项也许与command交替,如:gdbex'targetsim'ex'load'xsetbreakpointsex'run'a.
out11退出GDB87initcommandfile、ixfile:从文件file中加载并执行命令,此过程在加载inferior10之前(但在加载gdbinit文件之后).
initevalcommandcommand、iexcommand:在加载inferior之前(但在加载gdbinit文件之后)执行命令command.
directorydirectory、ddirectory:添加目录directory到源文件和脚本文件的搜索目录10.
2记录日志可以采用以下方式记录日志等,启动GDB后执行:启用日志:setloggingon关闭日志:setloggingoff记录日志到文件file(默认为gdb.
txt):setloggingfilefile设定日志是否覆盖原有文件(默认为追加):setloggingoverwrite[on|off]设定日志是否重定向(默认为显示在终端及文件中):setloggingredirect[on|off]显示当前日志设置:showlogging11退出GDB退出调试器,在GDB内部命令执行完后的命令行,输入以下两者之一:quit10GDB采用对象表示每个程序执行状态,这个对象被称为inferior.
典型的,一个inferior对应一个进程,但是更通常的是对应一个没有进程的目标.
inferior有可能在进程执行之前生成,并且可以在进程停止后驻留.
inferior具有独有的与进程号不同的标志符.
尽管一些嵌入的目标也许具有多个运行在单个地址空间内不同部分的多个inferior,但通常每个inferior具有自己隔离的地址空间.
反过来,每个inferior又有多个线程运行它.
在GDB中可以用infoinferiors查看.
12准备所需要调试的程序8812准备所需要调试的程序12.
1准备调试代码源代码调试程序时,一般无需修改程序源代码,但是在程序中建议做如下改变:如果程序运行后,利用调试器难于终止,请设置一个初始停止点;在源代码增加一些断言,以便帮助定位错误.
12.
2准备编译器和链接器环境调试信息被编译器存储在.
o文件.
信息的级别和格式由编译器选项控制.
对于IntelC/C++Fortran编译器,采用g或debug选项,例如:iccghello.
cicpcghello.
cppifortghello.
f90对于GCC编译器,采用g选项.
对于一些较老版本的GCC,此选项也许会产生DWARF1标准的调试信息,如果这样,请使用gdwarf2选项,例如:gccgdwarf2hello.
cg++gdwarf2hello.
cppgfortrangdwarf2hello.
f90调试信息将通过ld命令导入到a.
out(可执行程序)或.
so(共享库)文件中.
如果是在调试优化编译的代码,采用g选项将自动增加O0选项.
请参看调试优化编译的代码部分中关于g和相关扩展调试选项及它们的与优化之间的关系.
12.
3调试优化编译的代码GDB调试器可以通过使用g参数帮助调试优化编译的程序.
但是关于此程序的信息也许并不准确,尤其是变量的地址和值经常没有被正确报告,这是因为通用调试信息模式无法全部表示O1、O2、O3及其它优化选项的复杂性.
12准备所需要调试的程序89为了避免此限制,采用Intel编译器编译程序时在所需的O1、O2或O3优化选项同时指明g和debug扩展选项.
这会产生具有更多高级但更少通用支持的调试信息,主要激活以下:给出变量的正确地址和值,不管其是在寄存器或不同时间在不同地址时.
注意:–在程序中,一些变量可能被优化掉或转换成不同类型的数据,或其地址没有在所有点都被记录.
在这些情形下,打印变量时将显示无值.
–否则,这些值和地址将正确,但这些寄存器没有地址,调试器中print&i命令将打印一条警告.
–尽管breakmain命令通常将在程序开始处理后停止,但程序大多数变量和参数在程序的开始处理和结束处理时是未定义的.
在堆栈追踪中显示内联函数,这通过使用inline关键词识别.
注意:–只有在堆栈顶端和通常(非内联)调用的函数显示指令指针,其原因在于其它函数与其调用的内联函数共享硬件定义的堆栈帧.
–返回指令将只返回对那些采用调用指令时是非内联调用函数的控制,其原因在于内联调用没有定义返回地址.
–up、down和call命令以通常方式工作.
允许在内联函数中设置断点.
12.
4准备所需要调试的并行程序编译时必须用g等调试参数编译源代码才可以使用GDB调试器特性,比如分析共享数据或在重入函数调用中停止.
为了使用并行调试特性,需要:如果存在makefile编译配置文件,请对它进行编辑.
在命令行添加编译器选项debugparallel(Intel编译器针对OpenMP多线程).
重编译程序.
12.
5编译所要调试的程序下面以常做为例子的hello程序为例介绍.
hello.
c例子:13开始调试程序90§#includeintmain(){printf("HelloWorld!
\n");return0;}编译:iccghelloworld.
cohelloworldhello.
f90例子:§programmainprint*,"HelloWorld!
"endprogrammain编译:ifortdebugO0helloworld.
f90ohelloworld13开始调试程序启动调试:gdbhelloworld.
更多启动方式参见10.
13.
1显示源代码在调试器启动后的命令行中输入list命令可以显示源代码,如输入listmain,将显示main函数的代码.
13.
2运行程序在命令行中输入run,将开始运行程序.
13.
3设置和删除断点设置断点:–输入以下命令:breakmain此时在程序main处设置了一个断点.
13开始调试程序91–输入run再次运行程序应用将停止在设置的断点处.
删除断点:–列出所有设置的断点ID号:infobreakpoints调试器将显示所有存在的断点.
–指明所要删除的断点ID号.
如果从开始调试后没有设置其它断点,那么只有1个断点,其ID号为1.
–删除此断点:deletebreakpoint1那么将删除设置断点1.
–重新运行程序.
那么程序将运行并显示"HelloWorld!
",并退出程序.
13.
4控制进程环境用户可以:1、对进程的环境变量进行设置或者取消设置以便在将来使用;2、设置与当前调试器环境和启动调试器的shell不同的环境.
设置的变量将影响后续调试的新进程.
环境命令不影响当前运行进程.
设置的环境变量不改变或显示调试器的环境变量,它们只影响新产生的进程.
显示当前集的所有环境变量:showenvironment增加或改变环境变量:setenvironment取消一个环境变量:unsetenvironment注意:GDB调试器没有命令可以简单回到调试器启动时的环境变量的初始状态,用户必须正确设置和取消环境变量.
13.
5执行一行代码如果源代码当前行是函数调用,那么可以步入(stepinto)或者跨越(stepover)此函数.
1.
step命令:应用程序执行一行代码,如果此行是函数调用,那么应用程序步入到函数中,即不执行完此函数调用.
2.
next命令:应用程序执行一行代码,如果此行是函数调用,那么应用程序跨越此函数,即执行完此函数调用.
14传递命令给调试器9213.
6执行代码直到运行代码直到某行或某个表达式,可用until命令.
13.
7执行一行汇编指令如果应用的当前指令为函数调用,那么可以步入或者跨越此函数.
1.
stepi命令:应用程序执行一行汇编指令,如果此行指令是函数调用,那么应用程序步入到函数中.
2.
nexti命令:应用程序执行一行汇编指令,如果此行指令当前行是跳出或调用,那么应用程序跨越过它.
13.
8显示变量或表达式值利用print命令可以显示变量值或表达式的值.
如:显示变量val2的当前值:printval2显示表达式val2*2的值:printval2*214传递命令给调试器14.
1命令、文件名和变量补全GDB调试器支持命令、文件名和变量的补全.
在GDB调试器命令行中开始键入一个命令、文件名或变量名,然后按Tab键.
如果有不只一个备选,调试器会发出铃声.
再一次按Tab键,将列出备选.
利用单引号和双引号影响可能备选集.
利用单引号填充C++名字,包含特殊字符"等.
利用双引号告诉调试器在文件名中查看备选.
14.
2自定义命令GDB调试器支持用户自定义命令.
用户定义的命令支持在定义体内包含if、while、loop_break和loop_continue命令.
用户定义的命令最多可有10个参数,以空白分割.
参数名依次为$arg0、$arg1、$arg2、.
.
.
、$arg9.
参数总数存储在$argc中.
15调试并行程序93其步骤为:输入definecommandname每行输入一个命令输入end15调试并行程序15.
1调试OpenMP等多线程程序一个单独的程序可以有不止一个线程执行,但一般来说,一个程序的线程除了它们共享一个地址空间外,还类似于多个进程.
另一方面,每个县城具有自己的寄存器和执行堆栈,也许还占有私有内存.
线程是进程内部单个、串行控制流.
每个线程包含单个执行点.
线程在单个地址空间中(共享)执行;因此,进程的线程可以读写相同的内存地址.
多个进程执行时,当用户需要关注某个进程时,它却恼人地或不切实际地枚举所有进程.
当为了设置代码断点而定义停止线程和线程过滤器时,用户需要定义线程集.
用户可以以紧凑方式指定进程或线程集,集可包含一个或多个范围.
用户可以对每个进程集执行普通操作,调试器变量既可以存储集也可以存储范围以便操作、引用和查看.
infothreas:查看线程集thread:在线程间进行切换,如thread2threadapply:对线程应用特定命令,如threadapply2break164threadapplyall:对所有线程应用特定命令threadfind:发现满足某些特定条件的线程threadname:给当前线程设定名字注意:线程与当前执行到多线程程序中的位置有关系,在单线程执行的地方只显示一个线程,在多线程执行的地方会显示多线程.
对各线程就可采用普通GDB命令对单个进程分别进行调试.
15调试并行程序9415.
2调试MPI并行应用采用IntelMPI时,可以采用类似下面命令调用GDB调试器:mpirungdbn4.
/tmissemdbg之后可以像单进程程序一样调试程序.
也可以吸附到一个运行中的程序:mpirunn4gdba其中为MPI进程的进程号.
如:mpirungdbn4.
/tmissemdbg显示:mpigdb:np=4mpigdb:attachingto13526.
/tmissem-dbgtc4600v4mpigdb:attachingto13527.
/tmissem-dbgtc4600v4mpigdb:attachingto13528.
/tmissem-dbgtc4600v4mpigdb:attachingto13529.
/tmissem-dbgtc4600v4上面np=4显示使用了4个进程启动MPI程序,13526之类的为系统MPI程序进程号(不是MPIrank号),.
/tmissemdbg为应用程序,tc4600v4为对应节点.
查看源码,执行list:[2,3]200implicitnone[0,1]200implicitnone[2,3]201include'mpif.
h'[0,1]201include'mpif.
h'[2,3]202integernmstep,ik,NStep,jk,i,PNum[0,1]202integernmstep,ik,NStep,jk,i,PNum[2,3]203!
realpathxyz(3,100000),t_p(3)!
path[0,1]203!
realpathxyz(3,100000),t_p(3)!
path[2,3]204realTime_S[0,1]204realTime_S[2,3]205real(8)T3[0,1]205real(8)T3[2,3]206character*2resf[0,1]206character*2resf[2,3]207[0,1]207[2,3]208callMPI_Init(ierr)[0,1]208callMPI_Init(ierr)上面[03]、[0,1]之类的为MPI进程编号,表示改行后面显示的内容为这些进程的.
15调试并行程序95z命令可设置对某MPI进程进行操作,如z0,1,3命令设置当前进程集包含进程0、1、3:mpigdb:setactiveprocessesto013zall切换到全部进程.
之后对各进程就可采用普通GDB命令对单个进程分别进行调试.
17INTELMKL主要内容96PartIXIntelMKL数值函数库本系统上安装的数值函数库主要有Intel核心数学库(MathKernelLibrary,MKL),用户可以直接调用,以提高性能、加快开发.
16IntelMKL当前安装的IntelMKL版本为IntelParallelStudioXE2018、2019和2020版编译器自带的,安装在/opt/intel.
在BASH下可以通过运行moduleload选择Intel编译器时设置,或者在~/.
bashrc之类的环境变量设置文件中添加类似下面代码设置IntelMKL所需的环境变量INCLUDE、LD_LIBRARY_PATH和MANPATH等:§.
/opt/intel/2020/mkl/bin/mklvars.
shintel6417IntelMKL主要内容IntelMKL主要包含如下内容:基本线性代数子系统库(BLAS,level1,2,3)和线性代数库(LAPACK):提供向量、向量矩阵、矩阵矩阵操作.
ScaLAPACK分布式线性代数库:含基础线性代数通信子程序(BasicLinearAlgebraCommunicationsSubprograms,BLACS)和并行基础线性代数子程序(ParallelBasicLinearAlgebraSubprograms,PBLAS)PARDISO直接离散算子:一种迭代离散算子,支持用于求解方程的离散系统的离散BLAS(level1,2,and3)子函数,并提供可用于集群系统的分布式版本的PARDISO.
快速傅立叶变换方程(FastFouriertransform,FFT):支持1、2或3维,支持混合基数(不局限与2的次方),并有分布式版本.
向量数学库(VectorMathLibrary,VML):提供针对向量优化的数学操作.
向量统计库(VectorStatisticalLibrary,VSL):提供高性能的向量化随机数生成算子,可用于一些几率分布、剪辑和相关例程和汇总统计功能.
19链接INTELMKL97数据拟合库(DataFittingLibrary):提供基于样条函数逼近、函数的导数和积分,及搜索.
扩展本征解算子(ExtendedEigensolver):基于FEAST的本征值解算子的共享内存版本的本征解算子.
18IntelMKL目录内容IntelMKL的主要目录内容见表8.
19链接IntelMKL19.
1快速入门19.
1.
1利用mkl编译器参数IntelComposerXE编译器支持采用mkl12参数链接IntelMKL:mkl或mkl=parallel:采用标准线程IntelMKL库链接;mkl=sequential:采用串行IntelMKL库链接;mkl=cluster:采用IntelMPI和串行MKL库链接;对Intel64架构的系统,默认使用LP64接口链接程序.
19.
1.
2使用单一动态库可以通过使用IntelMKLSingleDynamicLibrary(SDL)来简化链接行.
为了使用SDL库,请在链接行上添加libmkl_rt.
so.
例如iccapplication.
clmkl_rtSDL使得可以在运行时选择IntelMKL的接口和线程.
默认使用SDL链接时提供:对Intel64架构的系统,使用LP64接口链接程序;Intel线程.
如需要使用其它接口或改变线程性质,含使用串行版本IntelMKL等,需要使用函数或环境变量来指定选择,参见19.
3.
2动态选择接口和线程层部分.
12是mkl,不是lmkl,其它编译器未必支持此mkl选项.
19链接INTELMKL98表8:IntelMKL目录内容目录内容MKL主目录,如/opt/intel/2020/mkl/benchmarks/linpack包含OpenMP版的LINPACK的基准程序/benchmarks/mp_linpack包含MPI版的LINPACK的基准程序/bin包含设置MKL环境变量的脚本/bin/ia32包含针对IA32架构设置MKL环境变量的脚本/bin/intel64包含针对Intel64架构设置MKL环境变量的脚本/examples一些例子,可以参考学习/include含有INCLUDE文件/include/ia32含有针对ia32Intel编译器的Fortran95.
mod文件/include/intel64/ilp64含有针对Intel64Intel编译器ILP64接口11的Fortran95.
mod文件/include/intel64/lp64含有针对Intel64Intel编译器LP64接口的Fortran95.
mod文件/include/mic/ilp64含针对MIC架构ILP64接口的Fortran95.
mod文件,本系统未配置MIC/include/mic/lp64含针对MIC架构LP64接口的Fortran95.
mod文件,本系统未配置MIC/include/fftw含有FFTW2和3的INCLUDE文件/interfaces/blas95包含BLAS的Fortran90封装及用于编译成库的makefile/interfaces/LAPACK95包含LAPACK的Fortran90封装及用于编译成库的makefile/interfaces/fftw2xc包含2.
x版FFTW(C接口)封装及用于编译成库的makefile/interfaces/fftw2xf包含2.
x版FFTW(Fortran接口)封装及用于编译成库的makefile/interfaces/fftw2x_cdft包含2.
x版集群FFTW(MPI接口)封装及用于编译成库的makefile/interfaces/fftw3xc包含3.
x版FFTW(C接口)封装及用于编译成库的makefile/interfaces/fftw3xf包含3.
x版FFTW(Fortran接口)封装及用于编译成库的makefile/interfaces/fftw3x_cdft包含3.
x版集群FFTW(MPI接口)封装及用于编译成库的makefile/interfaces/fftw2x_cdft包含2.
x版MPIFFTW(集群FFT)封装及用于编译成库的makefile/lib/ia32包含IA32架构的静态库和共享目标文件/lib/intel64包含EM64T架构的静态库和共享目标文件/lib/mic用于MIC协处理器,本系统未配置MIC/tests一些测试文件/tools工具及插件/tools/builder包含用于生成定制动态可链接库的工具/.
.
/Documentation/en_US/mklMKL文档目录19链接INTELMKL9919.
1.
3选择所需库进行链接选择所需库进行链接,一般需要:从接口层(Interfacelayer)和线程层(Threadinglayer)各选择一个库;从计算层(Computationallayer)和运行时库(runtimelibraries,RTL)添加仅需的库.
链接应用程序时的对应库参见下表.
接口层线程层计算层运行库IA32架构,静态链接libmkl_intel.
alibmkl_intel_thread.
alibmkl_core.
alibiomp5.
soIA32架构,动态链接libmkl_intel.
solibmkl_intel_thread.
solibmkl_core.
solibiomp5.
soIntel64架构,静态链接libmkl_intel_lp64.
alibmkl_intel_thread.
alibmkl_core.
alibiomp5.
soIntel64架构,动态链接libmkl_intel_lp64.
solibmkl_intel_thread.
solibmkl_core.
solibiomp5.
soSDL会自动链接接口、线程和计算库,简化了链接处理.
下表列出的是采用SDL动态链接时的IntelMKL库.
参见19.
3.
2动态选择接口和线程层部分,了解如何在运行时利用函数调用或环境变量设置接口和线程层.
SDL运行时库IA32和Intel64架构libmkl_rt.
solibiomp5.
so19.
1.
4使用链接行顾问Intel提供了网页方式的链接行顾问帮助用户设置所需要的MKL链接参数.
访问http://software.
intel.
com/en-us/articles/intel-mkl-link-line-advisor,按照提示输入所需要信息即可获取链接IntelMKL时所需要的参数.
19.
1.
5使用命令行链接工具使用IntelMKL提供的命令行链接工具可以简化使用IntelMKL编译程序.
本工具不仅可以给出所需的选项、库和环境变量,还可执行编译和生成可执行程序.
mkl_link_tool命令安装在/tools,主要有三种模式:查询模式:返回所需的编译器参数、库或环境变量等:–获取IntelMKL库:mkl_link_toollibs[IntelMKLLinkTooloptions]19链接INTELMKL100–获取编译参数:mkl_link_toolopts[IntelMKLLinkTooloptions]–获取编译环境变量:mkl_link_toolenv[IntelMKLLinkTooloptions]编译模式:可编译程序.
–用法:mkl_link_tool[options][options2]file1[file2.
.
.
]交互模式:采用交互式获取所需要的参数等.
–用法:mkl_link_toolinteractive参见http://software.
intel.
com/en-us/articles/mkl-command-line-link-tool.
19.
2链接举例19.
2.
1在Intel64架构上链接在这些例子中:MKLPATH=$MKLROOT/lib/intel64MKLINCLUDE=$MKLROOT/include如果已经设置好环境变量,那么在所有例子中可以略去I$MKLINCLUDE,在所有动态链接的例子中可以略去L$MKLPATH.
使用LP64接口的并行IntelMKL库静态链接myprog.
f:§ifortmyprog.
f-L$MKLPATH-I$MKLINCLUDE-Wl,--start-group$MKLPATH/libmkl_intel_lp64.
a$MKLPATH/libmkl_intel_thread.
a$MKLPATH/libmkl_core.
a-Wl,--end-group-liomp5-lpthread-lm使用LP64接口的并行IntelMKL库动态链接myprog.
f:§ifortmyprog.
f-L$MKLPATH-I$MKLINCLUDE-lmkl_intel_lp64-lmkl_intel_thread-lmkl_core-liomp5-lpthread-lm使用LP64接口的串行IntelMKL库静态链接myprog.
f:§ifortmyprog.
f-L$MKLPATH-I$MKLINCLUDE-Wl,--start-group$MKLPATH/libmkl_intel_lp64.
a$MKLPATH/libmkl_sequential.
a$MKLPATH/libmkl_core.
a-Wl,--end-group-lpthread-lm19链接INTELMKL101使用LP64接口的串行IntelMKL库动态链接myprog.
f:§ifortmyprog.
f-L$MKLPATH-I$MKLINCLUDE-lmkl_intel_lp64-lmkl_sequential-lmkl_core-lpthread-lm使用ILP64接口的并行IntelMKL库动态链接myprog.
f:§ifortmyprog.
f-L$MKLPATH-I$MKLINCLUDE-Wl,--start-group$MKLPATH/libmkl_intel_ilp64.
a$MKLPATH/libmkl_intel_thread.
a$MKLPATH/libmkl_core.
a-Wl,--end-group-liomp5-lpthread-lm使用ILP64接口的并行IntelMKL库动态链接myprog.
f:§ifortmyprog.
f-L$MKLPATH-I$MKLINCLUDE-lmkl_intel_ilp64-lmkl_intel_thread-lmkl_core-liomp5-lpthread-lm使用串行或并行(调用函数或设置环境变量选择线程或串行模式,并设置接口)IntelMKL库动态链接myprog.
f:§ifortmyprog.
f-lmkl_rt使用Fortran95LAPACK接口和LP64接口的并行IntelMKL库静态链接myprog.
f:§ifortmyprog.
f-L$MKLPATH-I$MKLINCLUDE-I$MKLINCLUDE/intel64/lp64-lmkl_lapack95_lp64-Wl,--start-group$MKLPATH/libmkl_intel_lp64.
a$MKLPATH/libmkl_intel_thread.
a$MKLPATH/libmkl_core.
a-Wl,--end-group-liomp5-lpthread-lm使用Fortran95BLAS接口和LP64接口的并行IntelMKL库静态链接myprog.
f:§ifortmyprog.
f-L$MKLPATH-I$MKLINCLUDE-I$MKLINCLUDE/intel64/lp64-lmkl_blas95_lp64-Wl,--start-group$MKLPATH/libmkl_intel_lp64.
a$MKLPATH/libmkl_intel_thread.
a$MKLPATH/libmkl_core.
a-Wl,--end-group-liomp5-lpthread-lm19.
2.
2在IA32架构上链接在这些例子中:MKLPATH=$MKLROOT/lib/ia32MKLINCLUDE=$MKLROOT/include19链接INTELMKL102如果已经设置好环境变量,那么在所有例子中可以略去I$MKLINCLUDE,在所有动态链接的例子中可以略去L$MKLPATH.
使用并行IntelMKL库静态链接myprog.
f:§ifortmyprog.
f-L$MKLPATH-I$MKLINCLUDE-Wl,--start-group$MKLPATH/libmkl_intel.
a$MKLPATH/libmkl_intel_thread.
a$MKLPATH/libmkl_core.
a-Wl,--end-group-liomp5-lpthread-lm使用并行IntelMKL库动态链接myprog.
f:§ifortmyprog.
f-L$MKLPATH-I$MKLINCLUDE-lmkl_intel-lmkl_intel_thread-lmkl_core-liomp5-lpthread-lm使用串行IntelMKL库静态链接myprog.
f:§ifortmyprog.
f-L$MKLPATH-I$MKLINCLUDE-Wl,--start-group$MKLPATH/libmkl_intel.
a$MKLPATH/libmkl_sequential.
a$MKLPATH/libmkl_core.
a-Wl,--end-group-lpthread-lm使用串行IntelMKL库动态链接myprog.
f:§ifortmyprog.
f-L$MKLPATH-I$MKLINCLUDE-lmkl_intel-lmkl_sequential-lmkl_core-lpthread-lm使用串行或并行(调用mkl_set_threading_layer函数或设置环境变量MKL_THREADING_LAYER选择线程或串行模式)IntelMKL库动态链接myprog.
f:§ifortmyprog.
f-lmkl_rt使用Fortran95LAPACK接口和并行IntelMKL库静态链接myprog.
f:§ifortmyprog.
f-L$MKLPATH-I$MKLINCLUDE-I$MKLINCLUDE/ia32-lmkl_lapack95-Wl,--start-group$MKLPATH/libmkl_intel.
a$MKLPATH/libmkl_intel_thread.
a$MKLPATH/libmkl_core.
a-Wl,--end-group-liomp5-lpthread-lm使用Fortran95BLAS接口和并行IntelMKL库静态链接myprog.
f:§ifortmyprog.
f-L$MKLPATH-I$MKLINCLUDE-I$MKLINCLUDE/ia32-lmkl_blas95-Wl,--start-group$MKLPATH/libmkl_intel.
a$MKLPATH/libmkl_intel_thread.
a$MKLPATH/libmkl_core.
a-Wl,--end-group-liomp5-lpthread-lm19链接INTELMKL10319.
3链接细节19.
3.
1在命令行上列出所需库链接注意:下面是动态链接的命令,如果想静态链接,需要将含有l的库名用含有库文件的路径来代替,比如用$MKLPATH/libmkl_core.
a代替lmkl_core,其中$MKLPATH为用户定义的指向MKL库目录的环境变量.
§-L-I[-I/{ia32|intel64|{ilp64|lp64}}][-lmkl_blas{95|95_ilp64|95_lp64}][-lmkl_lapack{95|95_ilp64|95_lp64}][]-lmkl_{intel|intel_ilp64|intel_lp64|intel_sp2dp|gf|gf_ilp64|gf_lp64}-lmkl_{intel_thread|gnu_thread|pgi_thread|sequential}-lmkl_core-liomp5[-lpthread][-lm][-ldl]注:[]内的表示可选,|表示其中之一、{}表示含有.
在静态链接时,在分组符号(如,Wl,startgroup$MKLPATH/libmkl_cdft_core.
a$MKLPATH/libmkl_blacs_intelmpi_ilp64.
a$MKLPATH/libmkl_intel_ilp64.
a$MKLPATH/libmkl_intel_thread.
a$MKLPATH/libmkl_core.
aWl,endgroup)封装集群组件、接口、线程和计算库.
列出库的顺序是有要求的,除非是封装在上面分组符号中的.
19.
3.
2动态选择接口和线程层链接SDL接口使得用户可以动态选择IntelMKL的接口和线程层.
设置接口层可用的接口与系统架构有关,对于Intel64架构,可使用LP64和ILP64接口.
在运行时设置接口,可调用mkl_set_interface_layer函数或设置MKL_INTERFACE_LAYER环境变量.
下表为可用的接口层的值.
接口层MKL_INTERFACE_LAYER的值mkl_set_interface_layer的参数值LP64LP64MKL_INTERFACE_LP64ILP64ILP64MKL_INTERFACE_ILP6419链接INTELMKL104如果调用了mkl_set_interface_layer函数,那么环境变量MKL_INTERFACE_LAYER的值将被忽略.
默认使用LP64接口.
设置线程层在运行时设置线程层,可以调用mkl_set_threading_layer函数或者设置环境变量MKL_THREADING_LAYER.
下表为可用的线程层的值.
线程层MKL_INTERFACE_LAYER的值mkl_set_interface_layer的参数值Intel线程INTELMKL_THREADING_INTEL串行线程SEQUENTIALMKL_THREADING_SEQUENTIALGNU线程GNUMKL_THREADING_GNUPGI线程PGIMKL_THREADING_PGI如果调用了mkl_set_threading_layer函数,那么环境变量MKL_THREADING_LAYER的值被忽略.
默认使用Intel线程.
19.
3.
3使用接口库链接使用ILP64接口vs.
LP64接口IntelMKLILP64库采用64bit整数(索引超过含有2311个元素的大数组时使用),而LP64库采用32bit整数索引数组.
LP64和ILP64接口在接口层实现,分别采用下面接口层链接使用LP64或ILP64:–静态链接:libmkl_intel_lp64.
a或libmkl_intel_ilp64.
a–动态链接:libmkl_intel_lp64.
so或libmkl_intel_ilp64.
soILP64接口提供以下功能:–支持大数据数组(具有超过2311个元素);–添加i8编译器参数编译Fortran程序.
LP64接口提供与以前IntelMKL版本的兼容,因为LP64对于仅提供一种接口的版本低于9.
1的IntelMKL来说是一个新名字.
如果用户的应用采用IntelMKL计算大数据数组或此库也许在将来会用到时请选择使用ILP64接口.
IntelMKL提供的ILP64和LP64头文件路径是相同的.
–采用LP64/ILP64编译下面显示如何采用ILP64和LP64接口进行编译:19链接INTELMKL105*Fortran:ILP64:iforti8I/include.
.
.
LP64:ifortI/include.
.
.
*C/C++:ILP64:iccDMKL_ILP64I/include.
.
.
LP64:iccI/include.
.
.
注意,采用i8或DMKL_ILP64选项链接LP64接口库时也许将会产生预想不到的错误.
–编写代码如果不使用ILP64接口,无需修改代码.
为了移植或者新写代码使用ILP64接口,需要使用正确的IntelMKL函数和子程序的参数类型:整数类型FortranC/C++32bit整数INTEGER*4或INTEGER(KIND=4)int针对ILP64/LP64的通用整数(ILP64使用64bit,其余32bit)INTEGER,不指明KINDMKL_INT针对ILP64/LP64的通用整数(64bit整数)INTEGER*8或INTEGER(KIND=8)MKL_INT64针对ILP64/LP64的FFT接口INTEGER,不指明KINDMKL_LONG–局限性所有IntelMKL函数都支持ILP64编程,但是针对IntelMKL的FFTW接口:*FFTW2.
x封装不支持ILP64;*FFTW3.
2封装通过专用功能函数plan_guru64支持ILP64.
使用Fortran95接口库libmkl_blas95*.
a和libmkl_lapack95*.
a库分别含有BLAS和LAPACK所需的Fortran95接口,并且是与编译器无关.
在IntelMKL包中,已经为IntelFortran编译器预编译了,如果使用其它编译器,请在使用前先编译.
19.
3.
4使用线程库链接串行库模式采用IntelMKL串行(非线程化)模式时,IntelMKL运行非线程化代码.
它是线程安全的(除了LAPACK已过时的子程序lacon),即可以在用户程序19链接INTELMKL106的OpenMP代码部分使用.
串行模式不要求与OpenMP运行时库的兼容,环境变量OMP_NUM_THREADS或其IntelMKL等价变量对其也无影响.
只有在不需要使用IntelMKL线程时才应使用串行模式.
当使用一些非Intel编译器线程化程序或在需要非线程化库(比如使用MPI的一些情况时)的情形使用IntelMKL时,串行模式也许有用.
为了使用串行模式,请选择*sequential.
*库.
对于串行模式,由于*sequential.
*依赖于pthread,请在链接行添加POSIX线程库(pthread).
选择线程库层一些IntelMKL支持的编译器使用OpenMP线程技术.
IntelMKL支持这些编译器提供OpenMP技术实现,为了使用这些支持,需要采用正确的线程层和编译器支持运行库进行链接.
–线程层每个IntelMKL线程库包含针对同样的代码采用不同编译器(Intel、GNU和PGI编译器)分别编译的库.
–运行时库此层包含Intel编译器兼容的OpenMP运行时库libiomp.
在Intel编译器之外,libiomp提供在Linux操作系统上对更多线程编译器的支持.
即,采用GNU编译器线程化的程序可以安全地采用intelMKL和libiomp链接.
下表有助于解释在不同情形下使用IntelMKL时选择线程库和运行时库(仅静态链接情形):19链接INTELMKL107编译器应用是否线程化线程层推荐的运行时库备注Intel无所谓libmkl_intel_thread.
alibiomp5.
soPGIYeslibmkl_pgi_thread.
a或libmkl_sequential.
a由PGI*提供使用libmkl_sequential.
a从IntelMKL调用中去除线程化PGINolibmkl_intel_thread.
alibiomp5.
soPGINolibmkl_pgi_thread.
a由PGI*提供PGINolibmkl_sequential.
aNoneGNUYeslibmkl_gnu_thread.
alibiomp5.
so或GNUOpenMP运行时库libiomp5提供监控缩放性能GNUYeslibmkl_sequential.
aNoneGNUNolibmkl_intel_thread.
alibiomp5.
sootherYeslibmkl_sequential.
aNoneotherNolibmkl_intel_thread.
alibiomp5.
so19.
3.
5使用计算库链接如不使用IntelMKL集群软件在链接应用程序时只需要一个计算库即可,其依赖于链接方式:–静态链接:libmkl_core.
a–动态链接:libmkl_core.
so采用IntelMKL集群软件的计算库ScaLAPACK和集群Fourier变换函数(ClusterFFTs)要求更多的计算库,其也许依赖于架构.
下表为列出的针对Intel64架构的使用ScaLAPACK或集群FFTs的计算库:函数域静态链接动态链接ScaLAPACK,LP64接口libmkl_scalapack_lp64.
a和libmkl_core.
alibmkl_scalapack_lp64.
so和libmkl_core.
soScaLAPACK,ILP64接口libmkl_scalapack_ilp64.
a和libmkl_core.
alibmkl_scalapack_ilp64.
so和libmkl_core.
so集群FFTslibmkl_cdft_core.
a和libmkl_core.
alibmkl_cdft_core.
so和libmkl_core.
so19链接INTELMKL108下表为列出的针对IA32架构的使用ScaLAPACK或集群FFTs的计算库:函数域静态链接动态链接ScaLAPACKlibmkl_scalapack_core.
a和libmkl_core.
alibmkl_scalapack_core.
so和libmkl_core.
so集群FFTslibmkl_cdft_core.
a和libmkl_core.
alibmkl_cdft_core.
so和libmkl_core.
so注意:对于ScaLAPACK和集群FFTs,当在MPI程序中使用时,还需要添加BLACS库.
19.
3.
6使用编译器运行库链接甚至在静态链接其它库时,也可动态链接libiomp5、兼容的OpenMP运行时库.
静态链接libiomp5也许会存在问题,其原因由于操作环境或应用越复杂,将会包含更多多余的库的复本.
这将不仅会导致性能问题,甚至导致不正确的结果.
动态链接libiomp5时,需确保LD_LIBRARY_PATH环境变量设置正确.
19.
3.
7使用系统库链接使用IntelMKL的FFT、TrigonometricTransforn或Poisson、Laplace和Helmholtz求解程序时,需要通过在链接行添加lm参数链接数学支持系统库.
在Linux系统上,由于多线程libiomp5库依赖于原生的pthread库,因此,在任何时候,libiomp5要求在链接行随后添加lpthread参数(列出的库的顺序非常重要).
19.
3.
8冗长(Verbose)启用模式链接如果应用调用了MKL函数,您也许希望知道调用了哪些计算函数,传递给它们什么参数,并且花费多久执行这些函数.
当启用IntelMKL冗长(Verbose)模式时,您的应用可以打印出这些信息.
可以打印出这些信息的函数称为冗长启用函数.
并不是所有IntelMKL函数都是冗长启用的,请查看IntelMKL发布说明.
在冗长模式下,每个冗长启用函数的调用都将打印人性化可读行描述此调用.
如果此应用在此函数调用中终止,不会有针对此函数的信息打印出来.
第一个冗长启用函数调用将打印一版本信息行.
为了对应用启用IntelMKL冗长模式,需要执行以下两者之一:设置环境变量MKL_VERBOSE为1,在bash下可以执行exportMKL_VERBOSE=1调用支持函数mkl_verbose(1)20性能优化等109函数调用mkl_verbose(0)将停止冗长模式.
调用启用或禁止冗长模式的函数将覆盖掉环境变量设置.
关于mkl_verbose函数,请参看IntelMKLReferenceManual.
IntelMKL冗长模式不是线程局域的,而是全局状态.
这意味着如果一个应用从多线程中改变模式,其结果将是未定义的.
20性能优化等请参见IntelMKL官方手册.
21二进制程序的安装110PartX应用程序的编译与安装应用程序一般有两种方式发布:二进制方式:用户无需编译,只要解压缩后设置相关环境变量等即可.
如Gaussian13,国内用户只能购买到已经编译好的二进制可执行文件,有些国家和地区能购买到源代码.
源代码方式:–用户需要自己编译,并且可以按照需要修改编译参数以编译成最适合自己的可执行程序,之后再设置环境变量等使用,如VASP14.
–源代码编译时经常用到的编译命令为make,编译配置文件为Makefile,请查看make命令用法及Makefile文件说明.
应用程序一般都有官方的安装说明,建议在安装前,首先仔细查看一下,比如到其主页或者查看解压缩后的目录中的类似:install*、readme*等文件.
21二进制程序的安装以二进制方式发布的程序,安装相对简单,一般只要解压缩后设置好环境变量即可,以Gaussian09为例:将压缩包复制到某个地方,如/opt解压缩:tarxvfgaussian09.
tar.
gz15设置环境变量:修改~/.
bashrc,添加:§##Addforg09exportg09root="/opt"exportGAUSS_SCRDIR="/tmp".
$g09root/g09/bsd/g09.
profile##Endforg09刷新环境设置:.
~/.
bashrc或重新登录下.
13Gaussian主页:http://www.
gaussian.
com/14VASP主页:http://www.
vasp.
at/15当前主流Linux系统,tar命令已经能自动识别.
gz和.
bz压缩,无需再明确添加z或j参数来指定.
22源代码程序的安装11122源代码程序的安装以源代码发布的程序安装相对复杂,需了解所采用的编译环境,并对配置等做相应修改(主要修改编译命令、库、头文件等编译参数等).
以VASP为例:查看安装说明:其主页上的文档:http://www.
vasp.
at/index.
php/documentation解压缩文件:–tarxvfvasp.
5.
lib.
tar.
gz–tarxvfvasp.
5.
2.
tar.
gz查看说明:install、readme文件等,VASP解压后的目录中未含有,可以参见上述主页文档安装.
生成默认配置文件:.
/configure.
–VASP不需要.
/configure命令生成Makefile,而是提供了几个针对不同系统和编译器的makefile模板,可以复制makefile.
linux_ifc_P4成Makefile–其它程序也许需要.
/configure生成所需要的Makefile,在运行.
/configure之前,一般可以运行.
/configureh查看其选项.
如对OpenMPI1.
6.
4,可以运行以下命令生成Makefile:F77=ifortFC=ifortCC=iccCXX=icpc.
/configureprefix=/opt/openmpi1.
6.
4其中:*F77:编译Fortran77源文件的编译器命令*FC:编译Fortran90源文件的编译器命令*CC:编译C源文件的编译器命令*CXX:编译C++源文件的编译器命令*–prefix:安装到的目录前缀另外一些在Makefile中常见变量为:*CPP:预处理参数*CLAGS:C程序编译参数*CXXFLAGS:C程序编译参数*F90:编译Fortran90及以后源文件的编译器命令*FFLAGS:Fortran编译参数*OFLAG:优化参数*INCLUDE:头文件参数*LIB:库文件参数22源代码程序的安装112*LINK:链接参数修改Makefile文件配置,设定编译环境等:–对vasp.
5.
lib/Makefile做如下修改:*设定编译Fortran的编译器命令为IntelFortran编译器命令:FC=ifort–对vasp.
5/Makefile做如下修改:*设定BLAS库使用IntelMKL中的BLAS:BLAS=mkl16*打开FFT3D支持:去掉FFT3D=fft3dfurth.
offt3dlib.
o前的#17*设定MPIFortran编译器为IntelMPI编译器:FC=mpiifort编译:make–先在vasp.
5.
lib目录中执行make–如未出错,则再在vasp.
5.
2目录中执行make安装:makeinstall.
VASP不需要,有些程序需要执行此步.
设置环境变量:比如在~/.
bashrc中设置安装后的可执行程序目录在环境变量PATH中:§exportPATH=$PATH:/opt/vasp.
5.
216因为2013版本的Intel编译器支持mkl选项自动IntelMKL库,因此可以这么设置.
17在Makefile中#表示注释23基本概念113PartXISlurm作业管理系统Slurm(SimpleLinuxUtilityforResourceManagement,http://slurm.
schedmd.
com/)是开源的、具有容错性和高度可扩展大型和小型Linux集群资源管理和作业调度系统.
超级计算系统可利用Slurm进行资源和作业管理,以避免相互干扰,提高运行效率.
所有需运行的作业无论是用于程序调试还是业务计算均必须通过交互式并行srun、批处理式sbatch或分配式salloc等命令提交,提交后可以利用相关命令查询作业状态等.
请不要在登录节点直接运行作业(编译除外),以免影响其余用户的正常使用.
本系统安装的Slurm版本为19.
05.
5,安装在/usr等系统默认目录,用户无需自己设置即可使用.
23基本概念23.
1三种模式区别批处理作业(采用sbatch命令提交,最常用方式):对于批处理作业(提交后立即返回该命令行终端,用户可进行其它操作)使用sbatch命令提交作业脚本,作业被调度运行后,在所分配的首个节点上执行作业脚本.
在作业脚本中也可使用srun命令加载作业任务.
提交时采用的命令行终端终止,也不影响作业运行.
交互式作业提交(采用srun命令提交):资源分配与任务加载两步均通过srun命令进行:当在登录shell中执行srun命令时,srun首先向系统提交作业请求并等待资源分配,然后在所分配的节点上加载作业任务.
采用该模式,用户在该终端需等待任务结束才能继续其它操作,在作业结束前,如果提交时的命令行终端断开,则任务终止.
一般用于短时间小作业测试.
实时分配模式作业(采用salloc命令提交):分配作业模式类似于交互式作业模式和批处理作业模式的融合.
用户需指定所需要的资源条件,向资源管理器提出作业的资源分配请求.
提交后,作业处于排队,当用户请求资源被满足时,将在用户提交作业的节点上执行用户所指定的命令,指定的命令执行结束后,运行结束,用户申请的资源被释放.
在作业结束前,如果提交时的命令行终端断开,则任务终止.
典型用途是分配资源并启动一个shell,然后在这个shell中利用srun运行并行作业.
23基本概念114salloc后面如果没有跟定相应的脚本或可执行文件,则默认选择/bin/sh,用户获得了一个合适环境变量的shell环境.
salloc和sbatch最主要的区别是salloc命令资源请求被满足时,直接在提交作业的节点执行相应任务,而sbatch则当资源请求被满足时,在分配的第一个节点上执行相应任务.
salloc在分配资源后,再执行相应的任务,很适合需要指定运行节点和其它资源限制,并有特定命令的作业.
23.
2基本用户命令sacct:显示激活的或已完成作业或作业步的记账(对应需缴纳的机时费)信息.
salloc:为需实时处理的作业分配资源,典型场景为分配资源并启动一个shell,然后用此shell执行srun命令去执行并行任务.
sattach:吸附到运行中的作业步的标准输入、输出及出错,通过吸附,使得有能力监控运行中的作业步的IO等.
sbatch:提交作业脚本使其运行.
此脚本一般也可含有一个或多个srun命令启动并行任务.
sbcast:将本地存储中的文件传递分配给作业的节点上,比如/tmp等本地目录;对于/home等共享目录,因各节点已经是同样文件,无需使用.
scancel:取消排队或运行中的作业或作业步,还可用于发送任意信号到运行中的作业或作业步中的所有进程.
scontrol:显示或设定Slurm作业、队列、节点等状态.
sinfo:显示队列或节点状态,具有非常多过滤、排序和格式化等选项.
speek:查看作业屏幕输出.
注:该命令是本人写的,不是slurm官方命令,在其它系统上不一定有.
squeue:显示队列中的作业及作业步状态,含非常多过滤、排序和格式化等选项.
srun:实时交互式运行并行作业,一般用于段时间测试,或者与sallcoc及sbatch结合.
23基本概念11523.
3基本术语socket:CPU插槽,可以简单理解为CPU.
core:CPU核,单颗CPU可以具有多颗CPU核.
job:作业.
jobstep:作业步,单个作业(job)可以有个多作业步.
tasks:任务数,单个作业或作业步可有多个任务,一般一个任务需一个CPU核,可理解为所需的CPU核数.
rank:秩,如MPI进程号.
partition:队列、分区.
作业需在特定队列中运行,一般不同队列允许的资源不一样,比如单作业核数等.
stdin:标准输入文件,一般指可以通过屏幕输入或采用文件名定向到的文件,对应C程序中的文件描述符1.
stderr:标准出错文件,程序运行出错时输出信息到的文件,一般指也输出到屏幕,并可采用2>定向到的文件(注意这里的2),对应C程序中的文件描述符2.
23.
4常用参考作业提交:–salloc:为需实时处理的作业分配资源,提交后等获得作业分配的资源后运行,作业结束后返回命令行终端.
–sbatch:批处理提交,提交后无需等待立即返回命令行终端.
–srun:运行并行作业,等获得作业分配的资源并运行,作业结束后返回命令行终端.
常用参数:–begin=:设定作业开始运行时间,如begin="18:00:00".
–constraints:设定需要的节点特性.
–cpupertask:需要的CPU核数.
–error=:设定存储出错信息的文件名.
23基本概念116–exclude=:设定不采用(即排除)运行的节点.
–dependency=:设定只有当作业号的作业达到某状态时才运行.
–exclusive[=user|mcs]:设定排它性运行,不允许该节点有它人或某user用户或mcs的作业同时运行.
–export=:输出环境变量给作业.
–gres=:设定需要的通用资源.
–input=:设定输入文件名.
–jobname=:设定作业名.
–label:设定输出时前面有标记(仅限srun).
–mem=:设定每个节点需要的内存.
–mempercpu=:设定每个分配的CPU所需的内存.
–N:设定所需要的节点数.
–n:设定启动的任务数.
–nodelist=:设定需要的特定节点名,格式类似node[110,11,1328].
–output=:设定存储标准输出信息的文件名.
–partition=:设定采用的队列.
–qos=:设定采用的服务质量(QOS).
–signal=[B:][@time]:设定当时间到时发送给作业的信号.
–time=:设定作业运行时的墙上时钟限制.
–wrap=:将命令封装在一个简单的shshell中运行(仅限sbatch).
服务质量(QoS):sacctmgr–sacctmgrlistqos或sacctmgrshowqos:显示QOS记账信息:sacct–endtime=:设定显示的截止时间之前的作业.
–format=:格式化输出.
–name=:设定显示作业名的信息.
–partition=:设定采用队列的作业信息.
–state=:显示特定状态的作业信息.
作业管理24显示队列、节点信息:SINFO117–scancel:取消作业*jobid:设定作业号.
*name=:设定作业名.
*partition=:设定采用队列的作业.
*qos=:设定采用的服务质量(QOS)的作业.
*reservation=:设定采用了预留测略的作业.
*nodelist=:设定采用特定节点名的作业,格式类似node[110,11,1328].
–squeue:查看作业信息*format=:格式化输出.
*jobid:设定作业号.
*name=:设定作业名.
*partition=:设定采用队列的作业.
*qos=:设定采用的服务质量(QOS)的作业.
*start:显示作业开始时间.
*state=:显示特定状态的作业信息.
–scontrol:查看作业、节点和队列等信息*details:显示更详细信息.
*oneline:所有信息显示在同一行.
*showENTITYID:显示特定入口信息,ENTITY可为:job、node、partition等,ID可为作业号、节点名、队列名等.
*updateSPECIFICATION:修改特定信息,用户一般只能修改作业的.
24显示队列、节点信息:sinfosinfo可以查看系统存在什么队列、节点及其状态.
如sinfol:PARTITIONAVAILTIMELIMITJOB_SIZEROOTOVERSUBSGROUPSNODESSTATENODELISTCPU-Large*upinfinite1-infinitenoNOall720idlecnode[001-720]GPU-V100upinfinite1-infinitenoNOall10idlegnode[01-10]2TB-AEP-Memupinfinite1-infinitenoNOall8mixedanode[01-08]ARM-CPUupinfinite1-infinitenoNOall2down*rnode[01,09]ARM-CPUupinfinite1-infinitenoNOall2allocatedrnode[02-03]ARM-CPUupinfinite1-infinitenoNOall5idlernode[04-08]注:系统队列根据需要会调整,请根据上述命令确定可用队列,该文档后面部分采用batch作为队列名,并不是真正的队列名.
24显示队列、节点信息:SINFO11824.
1主要输出项AVAIL:up表示可用,down表示不可用.
CPUS:各节点上的CPU数.
S:C:T:各节点上的CPU插口sockets(S)数(CPU颗数,一颗CPU含有多颗CPU核,以下类似)、CPU核cores(C)数和线程threads(T)数.
SOCKETS:各节点CPU插口数,CPU颗数.
CORES:各节点CPU核数.
THREADS:各节点线程数.
GROUPS:可使用的用户组,all表示所有组都可以用.
JOB_SIZE:可供用户作业使用的最小和最大节点数,如果只有1个值,则表示最大和最小一样,infinite表示无限制.
TIMELIMIT:作业运行墙上时间(walltime,指的是用计时器,如手表或挂钟,度量的实际时间)限制,infinite表示没限制,如有限制的话,其格式为"dayshours:minutes:seconds".
MEMORY:实际内存大小,单位为MB.
NODELIST:节点名列表,格式类似node[110,11,1328].
NODES:节点数.
NODES(A/I):节点数,状态格式为"available/idle".
NODES(A/I/O/T):节点数,状态格式为"available/idle/other/total".
PARTITION:队列名,后面带有*的,表示此队列为默认队列.
ROOT:是否限制资源只能分配给root账户.
OVERSUBSCRIBE:是否允许作业分配的资源超过计算资源(如CPU数):–no:不允许超额.
–exclusive:排他的,只能给这些作业用(等价于srunexclusive).
–force:资源总被超额.
–yes:资源可以被超额.
24显示队列、节点信息:SINFO119STATE:节点状态,可能的状态包括:–allocated、alloc:已分配.
–completing、comp:完成中.
–down:宕机.
–drained、drain:已失去活力.
–draining、drng:失去活力中.
–fail:失效.
–failing、failg:失效中.
–future、futr:将来可用.
–idle:空闲,可以接收新作业.
–maint:保持.
–mixed:混合,节点在运行作业,但有些空闲CPU核,可接受新作业.
–perfctrs、npc:因网络性能计数器使用中导致无法使用.
–power_down、pow_dn:已关机.
–power_up、pow_up:正在开机中.
–reserved、resv:预留.
–unknown、unk:未知原因.
注意,如果状态带有后缀*,表示节点没响应.
TMP_DISK:/tmp所在分区空间大小,单位为MB.
24.
2主要参数a、all:显示全部队列信息,如显示隐藏队列或本组没有使用权的队列.
d、dead:仅显示无响应或已宕机节点.
e、exact:精确而不是分组显示显示各节点.
help:显示帮助.
i、iterate=:以秒间隔持续自动更新显示信息.
l、long:显示详细信息.
n、nodes=:显示节点信息.
24显示队列、节点信息:SINFO120N,Node:以每行一个节点方式显示信息,即显示各节点信息.
p、partition=:显示队列信息.
r、responding:仅显示响应的节点信息.
R、listreasons:显示不响应(down、drained、fail或failing状态)节点的原因.
s:显示摘要信息.
S、sort=:设定显示信息的排序方式.
排序字段参见后面输出格式部分,多个排序字段采用,分隔,字段前面的+和分表表示升序(默认)或降序.
队列字段P前面如有#,表示以Slurm配置文件slurm.
conf中的顺序显示.
例如:sinfoS+P,m表示以队列名升序及内存大小降序排序.
t、states=:仅显示状态的信息.
状态可以为(不区分大小写):ALLOC、ALLOCATED、COMP、COMPLETING、DOWN、DRAIN、DRAINED、DRAINING、ERR、ERROR、FAIL、FUTURE、FUTR、IDLE、MAINT、MIX、MIXED、NO_RESPOND、NPC、PERFCTRS、POWER_DOWN、POWER_UP、RESV、RESERVED、UNK和UNKNOWN.
T,reservation:仅显示预留资源信息.
usage:显示用法.
v、verbose:显示冗余信息,即详细信息.
V:显示版本信息.
o、format=:按照格式输出信息,默认为"%#P%.
5a%.
10l%.
6D%.
6t%N":–%all:所有字段信息.
–%a:队列的状态及是否可用.
–%A:以"allocated/idle"格式显示状态对应的节点数.
–%b:激活的特性,参见%f.
–%B:队列中每个节点可分配给作业的CPU数.
–%c:各节点CPU数.
–%C:以"allocated/idle/other/total"格式状态显示CPU数.
–%d:各节点临时磁盘空间大小,单位为MB.
–%D:节点数.
24显示队列、节点信息:SINFO121–%e:节点空闲内存.
–%E:节点无效的原因(down、draine或ddraining状态).
–%f:节点可用特性,参见%b.
–%F:以"allocated/idle/other/total"格式状态的节点数.
–%g:可以使用此节点的用户组.
–%G:与节点关联的通用资源(gres).
–%h:作业是否能超用计算资源(如CPUs),显示结果可以为yes、no、exclusive或force.
–%H:节点不可用信息的时间戳.
–%I:队列作业权重因子.
–%l:以"dayshours:minutes:seconds"格式显示作业可最长运行时间.
–%L:以"dayshours:minutes:seconds"格式显示作业默认时间.
–%m:节点内存,单位MB.
–%M:抢占模式,可以为no或yes.
–%n:节点主机名.
–%N:节点名.
–%o:节点IP地址.
–%O:节点负载.
–%p:队列调度优先级.
–%P:队列名,带有*为默认队列,参见%R.
–%R:队列名,不在默认队列后附加*,参见%P.
–%s:节点最大作业大小.
–%S:允许分配的节点数.
–%t:以紧凑格式显示节点状态.
–%T:以扩展格式显示节点状态.
–%v:slurmd守护进程版本.
–%w:节点调度权重.
–%X:单节点socket数.
–%Y:单节点CPU核数.
–%Z:单核进程数.
–%z:扩展方式显示单节点处理器信息:sockets、cores、threads(S:C:T)数.
24显示队列、节点信息:SINFO122O,Format=:按照格式输出信息,类似o、format=.
每个字段的格式为"type[:[.
]size]":–size:最小字段大小,如没指明,则最大为20个字符.
–.
:指明为右对齐,默认为左对齐.
–可用type:*all:所有字段信息.
*allocmem:节点上分配的内存总数,单位MB.
*allocnodes:允许分配的节点.
*available:队列的State/availability状态.
*cpus:各节点CPU数.
*cpusload:节点负载.
*freemem:节点可用内存,单位MB.
*cpusstate:以"allocated/idle/other/total"格式状态的CPU数.
*cores:单CPU颗CPU核数.
*disk:各节点临时磁盘空间大小,单位为MB.
*features:节点可用特性,参见features_act.
*features_act:激活的特性,参见features.
*groups:可以使用此节点的用户组.
*gres:与节点关联的通用资源(gres).
*maxcpuspernode:队列中各节点最大可用CPU数.
*memory:节点内存,单位MB.
*nodeai:以"allocated/idle"格式显示状态对应的节点数.
*nodes:节点数.
*nodeaiot:以"allocated/idle/other/total"格式状态的节点数.
*nodehost:节点主机名.
*nodelist:节点名,格式类似node[110,11,1328].
*oversubscribe:作业是否能超用计算资源(如CPUs),显示结果可以为yes、no、exclusive或force.
*partition:队列名,带有*为默认队列,参见%R.
*partitionname:队列名,默认队列不附加*,参见%P.
*preemptmode:抢占模式,可以为no或yes.
*priorityjobfactor:队列作业权重因子.
*prioritytier或priority:队列调度优先级.
25查看队列中的作业信息:SQUEUE123*reason:节点无效的原因(down、draine或ddraining状态).
*size:节点最大作业数.
*statecompact:紧凑格式节点状态.
*statelong:扩展格式节点状态.
*sockets:各节点CPU颗数.
*socketcorethread:扩展方式显示单节点处理器信息:sockets、cores、threads(S:C:T)数.
*time:以"dayshours:minutes:seconds"格式显示作业可最长运行时间.
*timestamp:节点不可用信息的时间戳.
*threads:CPU核线程数.
*weight:节点调度权重.
*version:slurmd守护进程版本.
25查看队列中的作业信息:squeue显示队列中的作业信息.
如squeue显示:JOBIDPARTITIONNAMEUSERSTTIMENODESNODELIST(REASON)75ARM-CPUarm_jobhmliR2:272rnode[02-03]76GPU-V100gpu.
slurmhmliPD0:005(Resources)25.
1主要输出项JOBID:作业号.
PARTITION:队列名(分区名).
NAME:作业名.
USER:用户名.
ST:状态.
–PD:排队中,PENDING.
–R:运行中,RUNNING.
–CA:已取消,CANCELLED.
–CF:配置中,CONFIGURING.
25查看队列中的作业信息:SQUEUE124–CG:完成中,COMPLETING–CD:已完成,COMPLETED.
–F:已失败,FAILED.
–TO:超时,TIMEOUT.
–NF:节点失效,NODEFAILURE.
–SE:特殊退出状态,SPECIALEXITSTATE.
TIME:已运行时间.
NODELIST(REASON):分配给的节点名列表(原因):–AssociationCpuLimit:作业指定的关联CPU已在用,作业最终会运行.
–AssociationMaxJobsLimit:作业关联的最大作业数已到,作业最终会运行.
–AssociationNodeLimit:作业指定的关联节点已在用,作业最终会运行.
–AssociationJobLimit:作业达到其最大允许的作业数限制.
–AssociationResourceLimit:作业达到其最大允许的资源限制.
–AssociationTimeLimit:作业达到时间限制.
–BadConstraints:作业含有无法满足的约束.
–BeginTime:作业最早开始时间尚未达到.
–Cleaning:作业被重新排入队列,并且仍旧在执行之前运行的清理工作.
–Dependency:作业等待一个依赖的作业结束后才能运行.
–FrontEndDown:没有前端节点可用于执行此作业.
–InactiveLimit:作业达到系统非激活限制.
–InvalidAccount:作业用户无效,建议取消该作业重新采用正确账户提交.
–InvalidQOS:作业QOS无效,建议取消该作业重新采用正确QoS提交.
–JobHeldAdmin:作业被系统管理员挂起.
–JobHeldUser:作业被用户自己挂起.
–JobLaunchFailure:作业无法被启动,有可能因为文件系统故障、无效程序名等.
–Licenses:作业等待相应的授权.
–NodeDown:作业所需的节点宕机.
–NonZeroExitCode:作业停止时退出代码非零.
–PartitionDown:作业所需的队列出于DOWN状态.
25查看队列中的作业信息:SQUEUE125–PartitionInactive:作业所需的队列处于Inactive状态.
–PartitionNodeLimit:作业所需的节点超过所用队列当前限制.
–PartitionTimeLimit:作业所需的队列达到时间限制.
–PartitionCpuLimit:该作业使用的队列对应的CPU已经被使用,作业最终会运行.
–PartitionMaxJobsLimit:该作业使用的队列的最大作业数已到,作业最终会运行.
–PartitionNodeLimit:该作业使用的队列对指定的节点都已在用,作业最终会运行.
–Priority:作业所需的队列存在高等级作业或预留.
–Prolog:作业的PrologSlurmctld前处理程序仍旧在运行.
–QOSJobLimit:作业的QOS达到其最大作业数限制.
–QOSResourceLimit:作业的QOS达到其最大资源限制.
–QOSGrpCpuLimit:作业的QoS的指定所有CPU已被占用,作业最终会运行.
–QOSGrpMaxJobsLimit:作业的QoS的最大作业数已到,作业最终会运行.
–QOSGrpNodeLimit:作业的QoS指定的节点都已经被占用,作业最终会运行.
–QOSTimeLimit:作业的QOS达到其时间限制.
–QOSUsageThreshold:所需的QOS阈值被违反.
–ReqNodeNotAvail:作业所需的节点无效,如节点宕机.
–Reservation:作业等待其预留的资源可用.
–Resources:作业将要等待所需要的资源满足后才运行.
–SystemFailure:Slurm系统失效,如文件系统、网络失效等.
–TimeLimit:作业超过去时间限制.
–WaitingForScheduling:等待被调度中.
25.
2主要参数A,account=:显示用户的作业信息,用户以,分隔.
a,all:显示所有队列中的作业及作业步信息,也显示被配置为对用户组隐藏队列的信息.
r,array:以每行一个作业元素方式显示.
25查看队列中的作业信息:SQUEUE126h,noheader:不显示头信息,即不显示第一行"PARTITIONAVAILTIMELIMITNODESSTATENODELIST".
help:显示帮助信息hide:不显示隐藏队列中的作业和作业步信息.
此为默认行为,不显示配置为对用户组隐藏队列的信息.
i,iterate=:以间隔秒方式循环显示信息.
j,jobs=:显示作业号的作业,作业号以,分隔.
jobs=可与steps选项结合显示特定作业的步信息.
作业号格式为"job_id[_array_id]",默认为64字节,可以用环境变量SLURM_BITSTR_LEN设定更大的字段大小.
l,long:显示更多的作业信息.
L,licenses=:指定使用授权文件,以,分隔.
n,name=:显示具有特定名字的作业,以,分隔.
noconvert:不对原始单位做转换,如2048M不转换为2G.
p,partition=:显示特定队列信息,以,分隔.
P,priority:对于提交到多个队列的作业,按照各队列显示其信息.
如果作业要按照优先级排序时,需考虑队列和作业优先级.
q,qos=:显示特定qos的作业和作业步,以,分隔.
R,reservation=reservation_name:显示特定预留信息作业.
s,steps:显示特定作业步.
作业步格式为"job_id[_array_id].
step_id".
S,sort=:按照显示特定字段排序显示,以,分隔.
如SP,U.
start:显示排队中的作业的预期执行时间.
t,states=:显示特定状态的作业信息.
以,分隔,有效的可为:PENDING(PD)、RUNNING(R)、SUSPENDED(S)、STOPPED(ST)、COMPLETING(CG)、COMPLETED(CD)、CONFIGURING(CF)、CANCELLED(CA)、FAILED(F)、TIMEOUT(TO)、PREEMPTED(PR)、BOOT_FAIL(BF)、NODE_FAIL(NF)和SPECIAL_EXIT(SE),注意是不区分大小写的,如"pd"和"PD"是等效的.
25查看队列中的作业信息:SQUEUE127u,user=:显示特定用户的作业信息,以,分隔.
usage:显示帮助信息.
v,verbose:显示squeue命令详细动作信息.
V,version:显示版本信息.
w,nodelist=:显示特定节点信息,以,分隔.
o,format=:以特定格式显示信息.
参见O,Format=,采用不同参数的默认格式为:–default:"%.
18i%.
9P%.
8j%.
8u%.
2t%.
10M%.
6D%R"–l,long:"%.
18i%.
9P%.
8j%.
8u%.
8T%.
10M%.
9l%.
6D%R"–s,steps:"%.
15i%.
8j%.
9P%.
8u%.
9M%N"每个字段的格式为"%[[.
]size]type":–size:字段最小尺寸,如果没有指定size,则按照所需长度显示.
–.
:右对齐显示,默认为左对齐.
–type:类型,一些类型仅对作业有效,而有些仅对作业步有效,有效的类型为:*%all:显示所有字段.
*%a:显示记帐信息(仅对作业有效).
*%A:作业步生成的任务数(仅适用于作业步).
*%A:作业号(仅适用于作业).
*%b:作业或作业步所需的普通资源(gres).
*%B:执行作业的节点.
*%c:作业每个节点所需的最小CPU数(仅适用于作业).
*%C:如果作业还在运行,显示作业所需的CPU数;如果作业正在完成,显示当前分配给此作业的CPU数(仅适用于作业).
*%d:作业所需的最小临时磁盘空间,单位MB(仅适用于作业).
*%D:作业所需的节点(仅适用于作业).
*%e:作业结束或预期结束时间(基于其时间限制)(仅适用于作业).
*%E:作业依赖剩余情况.
作业只有依赖的作业完成才运行,如显示NULL,则无依赖(仅适用于作业).
25查看队列中的作业信息:SQUEUE128*%f:作业所需的特性(仅适用于作业).
*%F:作业组作业号(仅适用于作业).
*%g:作业用户组(仅适用于作业).
*%G:作业用户组ID(仅适用于作业).
*%h:分配给此作业的计算资源能否被其它作业预约(仅适用于作业).
可被预约的资源包含节点、CPU颗、CPU核或超线程.
值可以为:YES:如果作业提交时含有oversubscribe选项或队列被配置含有OverSubscribe=Force.
NO:如果作业所需排他性运行.
USER:如果分配的计算节点设定为单个用户.
MCS:如果分配的计算节点设定为单个安全类(参看MCSPlugin和MCSParameters配置参数,MultiCategorySecurity).
OK:其它(典型的分配给专用的CPU)(仅适用于作业).
*%H:作业所需的单节点CPU数,显示srunsocketspernode提交选项,如socketspernode未设定,则显示*(仅适用于作业).
*%i:作业或作业步号,在作业组中,作业号格式为"_",默认作业组索引字段限制到64字节,可以用环境变量SLURM_BITSTR_LEN设定为更大的字段大小.
*%I:作业所需的每颗CPU的CPU核数,显示的是sruncorespersocket设定的值,如corespersocket未设定,则显示*(仅适用于作业).
*%j:作业或作业步名.
*%J:作业所需的每个CPU核的线程数,显示的是srunthreadspercore设定的值,如threadspercore未被设置则显示*(仅适用于作业).
*%k:作业说明(仅适用于作业).
*%K:作业组索引默认作业组索引字段限制到64字节,可以用环境变量SLURM_BITSTR_LEN设定为更大的字段大小(仅适用于作业).
*%l:作业或作业步时间限制,格式为"dayshours:minutes:seconds":NOT_SET表示没有建立;UNLIMITED表示没有限制.
*%L:作业剩余时间,格式为"dayshours:minutes:seconds",此值由作业的时间限制减去已用时间得到:NOT_SET表示没有建立;UNLIMITED表示没有限制(仅适用于作业).
*%m:作业所需的最小内存,单位为MB(仅适用于作业).
*%M:作业或作业步已经使用的时间,格式为"dayshours:minutes:seconds".
*%n:作业所需的节点名(仅适用于作业).
*%N:作业或作业步分配的节点名,对于正在完成的作业,仅显示尚未释放资源回归服务的节点.
25查看队列中的作业信息:SQUEUE129*%o:执行的命令.
*%O:作业是否需连续节点(仅适用于作业).
*%p:作业的优先级(0.
0到1.
0之间),参见%Q(仅适用于作业).
*%P:作业或作业步的队列.
*%q:作业关联服务的品质(仅适用于作业).
*%Q:作业优先级(通常为非常大的一个无符号整数),参见%p(仅适用于作业).
*%r:作业在当前状态的原因,参见JOBREASONCODES(仅适用于作业).
*%R:参见JOBREASONCODES(仅适用于作业):对于排队中的作业:作业没有执行的原因.
对于出错终止的作业:作业出错的解释.
对于其他作业状态:分配的节点.
*%S:作业或作业步实际或预期的开始时间.
*%t:作业状态,以紧凑格式显示:PD(排队pending)、R(运行running)、CA(取消cancelled)、CF(配置中configuring)、CG(完成中completing)、CD(已完成completed)、F(失败failed)、TO(超时timeout)、NF(节点失效nodefailure)和SE(特殊退出状态specialexitstate),参见JOBSTATECODES(仅适用于作业).
*%T:作业状态,以扩展格式显示:PENDING、RUNNING、SUSPENDED、CANCELLED、COMPLETING、COMPLETED、CONFIGURING、FAILED、TIMEOUT、PREEMPTED、NODE_FAIL和SPECIAL_EXIT,参见JOBSTATECODES(仅适用于作业).
*%u:作业或作业步的用户名.
*%U:作业或作业步的用户ID.
*%v:作业的预留资源(仅适用于作业).
*%V:作业的提交时间.
*%w:工程量特性关键WorkloadCharacterizationKey(wckey)(仅适用于作业).
*%W:作业预留的授权(仅适用于作业).
*%x:作业排他性节点名(仅适用于作业).
*%X:系统使用需每个节点预留的CPU核数(仅适用于作业).
*%y:Nice值(调整作业调动优先级)(仅适用于作业).
*%Y:对于排队中作业,显示其开始运行时期望的节点名.
*%z:作业所需的每个节点的CPU颗数、CPU核数和线程数(S:C:T),如(S:C:T)未设置,则显示*(仅适用于作业).
25查看队列中的作业信息:SQUEUE130*%Z:作业的工作目录.
O,Format=:以特定格式显示信息,参见o,format=每个字段的格式为"%[[.
]size]type":–size:字段最小尺寸,如果没有指定size,则最长显示20个字符.
–.
:右对齐显示,默认为左对齐.
–type:类型,一些类型仅对作业有效,而有些仅对作业步有效,有效的类型为:*account:作业记账信息(仅适用于作业).
*allocnodes:作业分配的节点(仅适用于作业).
*allocsid:用于提交作业的会话ID(仅适用于作业).
*arrayjobid:作业组中的作业ID.
*arraytaskid:作业组中的任务ID.
*associd:作业关联ID(仅适用于作业).
*batchflag:是否批处理设定了标记(仅适用于作业).
*batchhost:执行节点(仅适用于作业):对于分配的会话:显示的是会话执行的节点(如,srun或salloc命令执行的节点).
对于批处理作业:显示的执行批处理的节点.
*chptdir:作业checkpoint的写目录(仅适用于作业步).
*chptinter:作业checkpoint时间间隔(仅适用于作业步).
*command:作业执行的命令(仅适用于作业).
*comment:作业关联的说明(仅适用于作业).
*contiguous:作业是否要求连续节点(仅适用于作业).
*cores:作业所需的每颗CPU的CPU核数,显示的是sruncorespersocket设定的值,如corespersocket未设定,则显示*(仅适用于作业).
*corespec:为了系统使用所预留的CPU核数(仅适用于作业).
*cpufreq:分配的CPU主频(仅适用于作业步).
*cpuspertask:作业分配的每个任务的CPU颗数(仅适用于作业).
*deadline:作业的截止时间(仅适用于作业).
*dependency:作业依赖剩余.
作业只有依赖的作业完成才运行,如显示NULL,则无依赖(仅适用于作业).
*derivedec:作业的起源退出码,对任意作业步是最高退出码(仅适用于作业).
25查看队列中的作业信息:SQUEUE131*eligibletime:预计作业开始运行时间(仅适用于作业).
*endtime:作业实际或预期的终止时间(仅适用于作业).
*exit_code:作业退出码(仅适用于作业).
*feature:作业所需的特性(仅适用于作业).
*gres:作业或作业步需的通用资源(gres).
*groupid:作业用户组ID(仅适用于作业).
*groupname:作业用户组名(仅适用于作业).
*jobarrayid:作业组作业ID(仅适用于作业).
*jobid:作业号(仅适用于作业).
*licenses:作业预留的授权(仅适用于作业).
*maxcpus:分配给作业的最大CPU颗数(仅适用于作业).
*maxnodes:分配给作业的最大节点数(仅适用于作业).
*mcslabel:作业的MCS_label(仅适用于作业).
*minmemory:作业所需的最小内存大小,单位MB(仅适用于作业).
*mintime:作业的最小时间限制(仅适用于作业).
*mintmpdisk:作业所需的临时磁盘空间,单位MB(仅适用于作业).
*mincpus:作业所需的各节点最小CPU颗数,显示的是srunmincpus设定的值(仅适用于作业).
*name:作业或作业步名.
*network:作业运行的网络.
*niceNice值(调整作业调度优先值)(仅适用于作业).
*nodes:作业或作业步分配的节点名,对于正在完成的作业,仅显示尚未释放资源回归服务的节点.
*nodelist:作业或作业步分配的节点,对于正在完成的作业,仅显示尚未释放资源回归服务的节点,格式类似node[110,11,1328].
*ntpercore:作业每个CPU核分配的任务数(仅适用于作业).
*ntpernode:作业每个节点分配的任务数(仅适用于作业).
*ntpersocket:作业每颗CPU分配的任务数(仅适用于作业).
*numcpus:作业所需的或分配的CPU颗数.
*numnodes:作业所需的或分配的最小节点数(仅适用于作业).
*numtask:作业或作业号需的任务数,显示的ntasks设定的.
*oversubscribe:分配给此作业的计算资源能否被其它作业预约(仅适用于作业).
可被预约的资源包含节点、CPU颗、CPU核或超线程.
值可以为:25查看队列中的作业信息:SQUEUE132YES:如果作业提交时含有oversubscribe选项或队列被配置含有OverSubscribe=Force.
NO:如果作业所需排他性运行.
USER:如果分配的计算节点设定为单个用户.
MCS:如果分配的计算节点设定为单个安全类(参看MCSPlugin和MCSParameters配置参数).
OK:其它(典型分配给指定CPU).
*partition:作业或作业步的队列.
*priority:作业的优先级(0.
0到1.
0之间),参见%Q(仅适用于作业).
*prioritylong:作业优先级(通常为非常大的一个无符号整数),参见%p(仅适用于作业).
*profile:作业特征(仅适用于作业).
*preemptime:作业抢占时间(仅适用于作业).
*qos:作业的服务质量(仅适用于作业).
*reason:作业在当前的原因,参见JOBREASONCODES(仅适用于作业).
*reasonlist:参见JOBREASONCODES(仅适用于作业).
对于排队中的作业:作业没有执行的原因.
对于出错终止的作业:作业出错的解释.
对于其他作业状态:分配的节点.
*reqnodes:作业所需的节点名(仅适用于作业).
*requeue:作业失败时是否需重新排队运行(仅适用于作业).
*reservation:预留资源(仅适用于作业).
*resizetime:运行作业的变化时间总和(仅适用于作业).
*restartcnt:作业的重启checkpoint数(仅适用于作业).
*resvport:作业的预留端口(仅适用于作业步).
*schednodes:排队中的作业开始运行时预期将被用的节点列表(仅适用于作业).
*sct:各节点作业所需的CPU数、CPU核数和线程数(S:C:T),如(S:C:T)未设置,则显示*(仅适用于作业).
*selectjobinfo:节点选择插件针对作业指定的数据,可能的数据包含:资源分配的几何维度(X、Y、Z维度)、连接类型(TORUS、MESH或NAV==toruselsemesh),是否允许几何旋转(yes或no),节点使用(VIRTUAL或COPROCESSOR)等(仅适用于作业).
*sockets:作业每个节点需的CPU数,显示srun时的socketspernode选项,如socketspernode未设置,则显示*(仅适用于作业).
25查看队列中的作业信息:SQUEUE133*sperboard:每个主板分配给作业的CPU数(仅适用于作业).
*starttime:作业或作业布实际或预期开始时间.
*state:扩展格式作业状态:排队中PENDING、运行中RUNNING、已停止STOPPED、被挂起SUSPENDED、被取消CANCELLED、完成中COMPLETING、已完成COMPLETED、配置中CONFIGURING、已失败FAILED、超时TIMEOUT、预取PREEMPTED、节点失效NODE_FAIL、特定退出SPECIAL_EXIT,参见JOBSTATECODES部分(仅适用于作业).
*statecompact:紧凑格式作业状态:PD(排队中pending)、R(运行中running)、CA(已取消cancelled)、CF(配置中configuring)、CG(完成中completing)、CD(已完成completed)、F(已失败failed)、TO(超时timeout)、NF(节点失效nodefailure)和SE(特定退出状态specialexitstate),参见JOBSTATECODES部分(仅适用于作业).
*stderr:标准出错输出目录(仅适用于作业).
*stdin:标准输入目录(仅适用于作业).
*stdout:标准输出目录(仅适用于作业).
*stepid:作业或作业步号.
在作业组中,作业号格式为"_"(仅适用于作业步).
*stepname:作业步名(仅适用于作业步).
*stepstate:作业步状态(仅适用于作业步).
*submittime:作业提交时间(仅适用于作业).
*threads:作业所需的每颗CPU核的线程数,显示srun的threadspercore参数,如threadspercore未设置,则显示*(仅适用于作业).
*timeleft:作业剩余时间,格式为"dayshours:minutes:seconds",此值是通过其时间限制减去已运行时间得出的:如未建立则显示"NOT_SET";如无限制则显示"UNLIMITED"(仅适用于作业).
*timelimit:作业或作业步的时间限制.
*timeused:作业或作业步以使用时间,格式为"dayshours:minutes:seconds",days和hours只有需要时才显示.
对于作业步,显示从执行开始经过的时间,因此对于被曾挂起的作业并不准确.
节点间的时间差也会导致时间不准确.
如时间不对(如,负值),将显示"INVALID".
*tres:显示分配给作业的可被追踪的资源.
*userid:作业或作业步的用户ID.
*username:作业或作业步的用户名.
*wait4switch:需满足转轨器数目的总等待时间(仅适用于作业).
*wckey:工作负荷特征关键(wckey)(仅适用于作业).
*workdir:作业工作目录(仅适用于作业).
26查看详细队列信息:SCONTROLSHOWPARTITION13426查看详细队列信息:scontrolshowpartitionscontrolshowpartition显示全部队列信息,scontrolshowpartitionPartitionName或scontrolshowpartition=PartitionName显示队列名PartitionName的队列信息,输出类似:PartitionName=CPU-LargeAllowGroups=ALLAllowAccounts=ALLAllowQos=ALLAllocNodes=ALLDefault=YESQoS=N/ADefaultTime=NONEDisableRootJobs=YESExclusiveUser=NOGraceTime=0Hidden=NOMaxNodes=UNLIMITEDMaxTime=UNLIMITEDMinNodes=0LLN=NOMaxCPUsPerNode=UNLIMITEDNodes=cnode[001-720]PriorityJobFactor=1PriorityTier=1RootOnly=NOReqResv=NOOverSubscribe=NOOverTimeLimit=NONEPreemptMode=OFFState=UPTotalCPUs=28800TotalNodes=720SelectTypeParameters=NONEJobDefaults=(null)DefMemPerNode=UNLIMITEDMaxMemPerNode=UNLIMITEDPartitionName=GPU-V100AllowGroups=ALLAllowAccounts=ALLAllowQos=ALLAllocNodes=ALLDefault=NOQoS=N/ADefaultTime=NONEDisableRootJobs=YESExclusiveUser=NOGraceTime=0Hidden=NOMaxNodes=UNLIMITEDMaxTime=UNLIMITEDMinNodes=0LLN=NOMaxCPUsPerNode=UNLIMITEDNodes=gnode[01-10]PriorityJobFactor=1PriorityTier=1RootOnly=NOReqResv=NOOverSubscribe=NOOverTimeLimit=NONEPreemptMode=OFFState=UPTotalCPUs=400TotalNodes=10SelectTypeParameters=NONEJobDefaults=(null)DefMemPerNode=UNLIMITEDMaxMemPerNode=UNLIMITEDPartitionName=2TB-AEP-MemAllowGroups=ALLAllowAccounts=ALLAllowQos=ALLAllocNodes=ALLDefault=NOQoS=N/ADefaultTime=NONEDisableRootJobs=YESExclusiveUser=NOGraceTime=0Hidden=NOMaxNodes=UNLIMITEDMaxTime=UNLIMITEDMinNodes=0LLN=NOMaxCPUsPerNode=UNLIMITEDNodes=anode[01-08]PriorityJobFactor=1PriorityTier=1RootOnly=NOReqResv=NOOverSubscribe=NOOverTimeLimit=NONEPreemptMode=OFFState=UPTotalCPUs=320TotalNodes=8SelectTypeParameters=NONEJobDefaults=(null)DefMemPerNode=UNLIMITEDMaxMemPerNode=UNLIMITEDPartitionName=ARM-CPUAllowGroups=ALLAllowAccounts=ALLAllowQos=ALL26查看详细队列信息:SCONTROLSHOWPARTITION135AllocNodes=ALLDefault=NOQoS=N/ADefaultTime=NONEDisableRootJobs=YESExclusiveUser=NOGraceTime=0Hidden=NOMaxNodes=UNLIMITEDMaxTime=UNLIMITEDMinNodes=0LLN=NOMaxCPUsPerNode=UNLIMITEDNodes=rnode[01-09]PriorityJobFactor=1PriorityTier=1RootOnly=NOReqResv=NOOverSubscribe=NOOverTimeLimit=NONEPreemptMode=OFFState=UPTotalCPUs=864TotalNodes=9SelectTypeParameters=NONEJobDefaults=(null)DefMemPerNode=UNLIMITEDMaxMemPerNode=UNLIMITED26.
1主要输出项PartitionName:队列名.
AllowGroups:允许的用户组.
AllowAccounts:允许的用户.
AllowQos:允许的QoS.
AllocNodes:允许的节点.
Default:是否为默认队列.
QoS:服务质量.
DefaultTime:默认时间.
DisableRootJobs:是否禁止root用户提交作业.
ExclusiveUser:排除的用户.
GraceTime:抢占的款显时间,单位秒.
Hidden:是否为隐藏队列.
MaxNodes:最大节点数.
MaxTime:最大运行时间.
MinNodes:最小节点数.
LLN:是否按照最小负载节点调度.
MaxCPUsPerNode:每个节点的最大CPU颗数.
27查看详细节点信息:SCONTROLSHOWNODE136Nodes:节点名.
PriorityJobFactor:作业因子优先级.
PriorityTier:调度优先级.
RootOnly:是否只允许Root.
ReqResv:要求预留的资源.
OverSubscribe:是否允许超用.
PreemptMode:是否为抢占模式.
State:状态:–UP:可用,作业可以提交到此队列,并将运行.
–DOWN:作业可以提交到此队列,但作业也许不会获得分配开始运行.
已运行的作业还将继续运行.
–DRAIN:不接受新作业,已接受的作业可以被运行.
–INACTIVE:不接受新作业,已接受的作业未开始运行的也不运行.
TotalCPUs:总CPU核数.
TotalNodes:总节点数.
SelectTypeParameters:资源选择类型参数.
DefMemPerNode:每个节点默认分配的内存大小,单位MB.
MaxMemPerNode:每个节点最大内存大小,单位MB.
27查看详细节点信息:scontrolshownodescontrolshownode显示全部节点信息,scontrolshownodeNODENAME或scontrolshownode=NODENAME显示节点名NODENAME的节点信息,输出类似:NodeName=anode01Arch=x86_64CoresPerSocket=20CPUAlloc=0CPUTot=40CPULoad=0.
01AvailableFeatures=(null)ActiveFeatures=(null)Gres=(null)NodeAddr=anode01NodeHostName=anode01Version=19.
05.
4OS=Linux3.
10.
0-1062.
el7.
x86_64#1SMPWedAug718:08:02UTC201927查看详细节点信息:SCONTROLSHOWNODE137RealMemory=2031623AllocMem=0FreeMem=1989520Sockets=2Boards=1State=IDLEThreadsPerCore=1TmpDisk=0Weight=1Owner=N/AMCS_label=N/APartitions=2TB-AEP-MemBootTime=2019-11-09T15:47:56SlurmdStartTime=2019-12-01T19:01:59CfgTRES=cpu=40,mem=2031623M,billing=40AllocTRES=CapWatts=n/aCurrentWatts=0AveWatts=0ExtSensorsJoules=n/sExtSensorsWatts=0ExtSensorsTemp=n/sNodeName=gnode01Arch=x86_64CoresPerSocket=20CPUAlloc=0CPUTot=40CPULoad=0.
01AvailableFeatures=(null)ActiveFeatures=(null)Gres=gpu:v100:2NodeAddr=gnode01NodeHostName=gnode01Version=19.
05.
4OS=Linux3.
10.
0-1062.
el7.
x86_64#1SMPWedAug718:08:02UTC2019RealMemory=385560AllocMem=0FreeMem=368966Sockets=2Boards=1State=IDLEThreadsPerCore=1TmpDisk=0Weight=1Owner=N/AMCS_label=N/APartitions=GPU-V100BootTime=2019-11-13T16:51:31SlurmdStartTime=2019-12-01T19:54:55CfgTRES=cpu=40,mem=385560M,billing=40,gres/gpu=2AllocTRES=CapWatts=n/aCurrentWatts=0AveWatts=0ExtSensorsJoules=n/sExtSensorsWatts=0ExtSensorsTemp=n/s27.
1主要输出项NodeName:节点名.
Arch:系统架构.
CoresPerSocket:12.
CPUAlloc:分配给的CPU核数.
CPUErr:出错的CPU核数.
CPUTot:总CPU核数.
CPULoad:CPU负载.
AvailableFeatures:可用特性.
28查看详细作业信息:SCONTROLSHOWJOB138ActiveFeatures:激活的特性.
Gres:通用资源.
如上面Gres=gpu:v100:2指明了有两块V100GPU.
NodeAddr:节点IP地址.
NodeHostName:节点名.
Version:Slurm版本.
OS:操作系统.
RealMemory:实际物理内存,单位GB.
AllocMem:已分配内存,单位GB.
FreeMem:可用内存,单位GB.
Sockets:CPU颗数.
Boards:主板数.
State:状态.
ThreadsPerCore:每颗CPU核线程数.
TmpDisk:临时存盘硬盘大小.
Weight:权重.
BootTime:开机时间.
SlurmdStartTime:Slurmd守护进程启动时间.
28查看详细作业信息:scontrolshowjobscontrolshowjob显示全部作业信息,scontrolshowjobJOBID或scontrolshowjob=JOBID显示作业号为JOBID的作业信息,输出类似下面:JobId=77JobName=gres_test.
bashUserId=hmli(10001)GroupId=nic(10001)MCS_label=N/APriority=4294901755Nice=0Account=(null)QOS=normalJobState=RUNNINGReason=NoneDependency=(null)Requeue=1Restarts=0BatchFlag=1Reboot=0ExitCode=0:0RunTime=00:00:11TimeLimit=UNLIMITEDTimeMin=N/ASubmitTime=2019-12-01T20:10:15EligibleTime=2019-12-01T20:10:1528查看详细作业信息:SCONTROLSHOWJOB139AccrueTime=2019-12-01T20:10:15StartTime=2019-12-01T20:10:16EndTime=UnknownDeadline=N/ASuspendTime=NoneSecsPreSuspend=0LastSchedEval=2019-12-01T20:10:16Partition=GPU-V100AllocNode:Sid=login01:1016ReqNodeList=(null)ExcNodeList=(null)NodeList=cnode[188-189]BatchHost=cnode188NumNodes=2NumCPUs=80NumTasks=80CPUs/Task=1ReqB:S:C:T=0:0:*:*TRES=cpu=80,node=2,billing=80Socks/Node=*NtasksPerN:B:S:C=40:0:*:*CoreSpec=*MinCPUsNode=40MinMemoryNode=0MinTmpDiskNode=0Features=(null)DelayBoot=00:00:00OverSubscribe=OKContiguous=0Licenses=(null)Network=(null)Command=/home/nic/hmli/gres_test.
bashWorkDir=/home/nic/hmliStdErr=/home/nic/hmli/job-77.
errStdIn=/dev/nullStdOut=/home/nic/hmli/job-77.
logPower=注:billing部分显示的是记账信息,上述作业表示按照80核计算费用.
28.
1主要输出项JobId:作业号.
JobName:作业名.
UserId:用户名(用户ID).
GroupId:用户组(组ID).
MCS_label:.
Priority:优先级,越大越优先,如果为0则表示被管理员挂起,不允许运行.
Nice:Nice值,越小越优先,20到19.
Account:记账用户名.
QOS:作业的服务质量.
JobState:作业状态.
28查看详细作业信息:SCONTROLSHOWJOB140–PENDING:排队中.
–RUNNING:运行中.
–CANCELLED:已取消.
–CONFIGURING:配置中.
–COMPLETING:完成中.
–COMPLETED:已完成.
–FAILED:已失败.
–TIMEOUT:超时.
–NODEFAILURE:节点失效.
–SPECIALEXITSTATE:特殊退出状态.
Reason:原因.
Dependency:依赖关系.
Requeue:节点失效时,是否重排队,0为否,1为是.
Restarts:失败时,是否重运行,0为否,1为是.
BatchFlag:是否为批处理作业,0为否,1为是.
Reboot:节点空闲时是否重启节点,0为否,1为是.
ExitCode:作业退出代码.
RunTime:已运行时间.
TimeLimit:作业允许的剩余运行时间.
TimeMin:最小时间.
SubmitTime:提交时间.
EligibleTime:获得认可时间.
StartTime:开始运行时间.
EndTime:预计结束时间.
Deadline:截止时间.
PreemptTime:先占时间.
SuspendTime:挂起时间.
28查看详细作业信息:SCONTROLSHOWJOB141SecsPreSuspend:0.
Partition:对列名.
AllocNode:Sid:分配的节点:系统ID号.
ReqNodeList:需要的节点列表,格式类似node[110,11,1328].
ExcNodeList:排除的节点列表,格式类似node[110,11,1328].
NodeList:实际运行节点列表,格式类似node[110,11,1328].
BatchHost:批处理节点名.
NumNodes:节点数.
NumCPUs:CPU核数.
NumTasks:任务数.
CPUs/Task:CPU核数/任务数.
ReqB:S:C:T:所需的主板数:每主板CPU颗数:每颗CPU核数:每颗CPU核的线程数,:::.
TRES:显示分配给作业的可被追踪的资源.
Socks/Node:每节点CPU颗数.
NtasksPerN:B:S:C:每主板数:每主板CPU颗数:每颗CPU的核数:每颗CPU核的线程数启动的作业数,:::.
CoreSpec:各节点系统预留的CPU核数,如未包含,则显示*.
MinCPUsNode:每节点最小CPU核数.
MinMemoryNode:每节点最小内存大小,0表示未限制.
MinTmpDiskNode:每节点最小临时存盘硬盘大小,0表示未限制.
Features:特性.
Gres:通用资源.
Reservation:预留资源.
30查看作业屏幕输出:SPEEK142OverSubscribe:是否允许与其它作业共享资源,OK允许,NO不允许.
Contiguous:是否要求分配连续节点,OK是,NO否.
Licenses:软件授权.
Network:网络.
Command:作业命令.
WorkDir:工作目录.
StdErr:标准出错输出文件.
StdIn:标准输入文件.
StdOut:标准输出文件.
29查看服务质量(QoS)服务质量(QualityofServiceQoS),或者理解为资源限制或者优先级,只有达到QoS要求时作业才能运行,QoS将在以下三个方面影响作业运行:作业调度优先级作业抢占作业限制可以用sacctmgrshow|listqos查看.
30查看作业屏幕输出:speek查看作业屏幕输出的命令speek(类似LSF的bpeek),基本用法speek[e][f]作业号.
默认显示正常屏幕输出,如加f参数,则连续监测输出;如加e参数,则监测错误日志.
注:该speek命令是本人写的,不是slurm官方命令,在其它系统上不一定有.
§#!
/bin/bash#Author:HMLiif[$#-lt1];thenecho"Usage:speek[-e][-f]jobid"echo"-e:showerrorlog.
"echo-e"-f:outputappendeddataasthefilegrows.
\n\nYourjobsare:"31提交作业命令共同说明143if[$USER!
='root'];thensqueue-u$USER-tr-o"%.
8i%10P%12j%19S%.
12M%.
7C%.
5D%R"elsesqueue-tr-o"%.
8i%10u%10P%12j%19S%.
12M%.
7C%.
5D%R"fiexitfiNO=1STD=StdOutwhilegetopts'ef'OPT;docase$OPTine)STD=StdErr;;f)T='-f';;esacdoneJOBID=${!
#}F=`scontrolshowjob$JOBID2>/dev/null|awk-vSTD=$STD-F='{if($1~'STD')print$2}'`if[-f"$F"];thentail$T$Felseecho"Job$JOBIDhasno$STDfileoryouhavenoauthoritytoaccess.
"fi31提交作业命令共同说明提交作业的命令主要有salloc、sbatch与srun,其多数参数、输入输出变量等都是一样的.
31.
1主要参数A,account=:指定此作业的责任资源为账户,即账单(与计算费对应)记哪个名下,只有账户属于多个账单组才有权指定.
accelbind=:srun特有,控制如何绑定作业到GPU、网络等特定资源,支持同时多个选项,支持的选项如下:–g:绑定到离分配的CPU最近的GPU31提交作业命令共同说明144–m:绑定到离分配的CPU最近的MIC–n:绑定到离分配的CPU最近的网卡–v:详细模式,显示如何绑定GPU和网卡等等信息acctgfreq:指定作业记账和剖面信息采样间隔.
支持的格式为acctgfreq==其中=指定了任务抽样间隔或剖面抽样间隔.
多个=可以采用,分隔(默认为30秒):–task=:以秒为单位的任务抽样(需要jobacct_gather插件启用)和任务剖面(需要acct_gather_profile插件启用)间隔.
–energy=:以秒为单位的能源剖面抽样间隔,需要acct_gather_energy插件启用.
–network=:以秒为单位的InfiniBand网络剖面抽样间隔,需要acct_gather_infiniband插件启用.
–filesystem=:以秒为单位的文件系统剖面抽样间隔,需要acct_gather_filesystem插件启用.
Bextranodeinfo=:选择满足的节点,*表示对应选项不做限制.
对应限制可以采用下面对应选项:–socketspernode=–corespersocket=–threadspercore=bcast[=]:srun特有,复制可执行程序到分配的计算节点的[]目录.
如指定了,则复制可执行程序到此;如没指定则复制到当前工作目录下的"slurm_bcast_.
".
如srunbcast=/tmp/mineN3a.
out将从当前目录复制a.
out到每个分配的节点的/tmp/min并执行.
begin=:设定开始分配资源运行的时间.
时间格式可为HH:MM:SS,或添加AM、PM等,也可采用MMDDYY、MM/DD/YY或YYYYMMDD格式指定日期,含有日期及时间的格式为:YYYYMMDD[THH:MM[:SS]],也可以采用类似now+时间单位的方式,时间单位可以为seconds(默认)、minutes、hours、days和weeks、today、tomorrow等,例如:–begin=16:00:16:00开始.
–begin=now+1hour:1小时后开始.
–begin=now+60:60秒后开始(默认单位为秒).
–begin=20170220T12:34:00:20170220T12:34:00开始.
31提交作业命令共同说明145bell:分配资源时终端响铃,参见nobell.
cpubind=[quiet,verbose,]type:srun特有,设定CPU绑定模式.
comment=:作业说明.
contiguous:需分配到连续节点,一般来说连续节点之间网络会快一点,如在同一个IB交换机内,但有可能导致开始运行时间推迟(需等待足够多的连续节点).
corespersocket=:分配的节点需要每颗CPU至少CPU核.
cpuspergpu=:每颗GPU需个CPU核,与cpuspertask不兼容.
c,cpuspertask=:每个进程需颗CPU核,一般运行OpenMP等多线程程序时需,普通MPI程序不需.
deadline=:如果在此deadline(start>(deadlinetime[min])之前没有结束,那么移除此作业.
默认没有deadline,有效的时间格式为:–HH:MM[:SS][AM|PM]–MMDD[YY]或MM/DD[/YY]或MM.
DD[.
YY]–MM/DD[/YY]HH:MM[:SS]–YYYYMMDD[THH:MM[:SS]]]d,dependency=:满足依赖条件后开始分配.
可以为或.
依赖条件如果用,分隔,则各依赖条件都需要满足;如果采用分隔,那么只要任意条件满足即可.
可以为:–after:job_id[:jobid.
.
.
]:当指定作业号的作业结束后开始运行.
–afterany:job_id[:jobid.
.
.
]:当指定作业号的任意作业结束后开始运行.
–aftercorr:job_id[:jobid.
.
.
]:当相应任务号任务结束后,此作业组中的开始运行.
–afternotok:job_id[:jobid.
.
.
]:当指定作业号的作业结束时具有异常状态(非零退出码、节点失效、超时等)时.
–afterok:job_id[:jobid.
.
.
]:当指定的作业正常结束(退出码为0)时开始运行.
–expand:job_id:分配给此作业的资源将扩展给指定作业.
–singleton:等任意通账户的相同作业名的前置作业结束时.
D,chdir=:在切换到工作目录后执行命令.
31提交作业命令共同说明146e,error=:设定标准错误如何重定向.
非交互模式下,默认srun重定向标准错误到与标准输出同样的文件(如指定).
此参数可以指定重定向到不同文件.
如果指定的文件已经存在,那么将被覆盖.
参见IO重定向.
salloc无此选项.
epilog=:srun特有,作业结束后执行程序做相应处理.
E,preserveenv:将环境变量SLURM_NNODES和SLURM_NTASKS传递给可执行文件,而无需通过计算命令行参数.
exclusive[=user|mcs]:排他性运行,独占性运行,此节点不允许其他[user]用户或mcs选项的作业共享运行作业.
export=:sbatch与srun特有,将环境变量传递给应用程序–ALL:复制所有提交节点的环境变量,为默认选项.
–NONE:所有环境变量都不被传递,可执行程序必须采用绝对路径.
一般用于当提交时使用的集群与运行集群不同时.
–[ALL,]environmentvariables:复制全部环境变量及特定的环境变量及其值,可以有多个以,分隔的变量.
如:"export=EDITOR,ARG1=test".
exportfile=:sbatch特有,将特定文件中的变量设置传递到计算节点,这允许在定义环境变量时有特殊字符.
F,nodefile=:类似nodelist指定需要运行的节点,但在一个文件中含有节点列表.
G,gpus=[:]:设定使用的GPU类型及数目,如gpus=v100:2.
gpuspernode=[:]:设定单个节点使用的GPU类型及数目.
gpuspersocket=[:]:设定每个socket需要的GPU类型及数目.
gpuspertask=[:]:设定每个任务需要的GPU类型及数目.
gres=:设定通用消费资源,可以以,分隔.
每个格式为"name[[:type]:count]".
name是可消费资源;count是资源个数,默认为1;H,hold:设定作业将被提交为挂起状态.
挂起的作业可以利用scontrolrelease使其排队运行.
h,help:显示帮助信息.
hint=:绑定任务到应用提示:31提交作业命令共同说明147–compute_bound:选择设定计算边界应用:采用每个socket的所有CPU核,每颗CPU核一个进程.
–memory_bound:选择设定内存边界应用:仅采用每个socket的1颗CPU核,每颗CPU核一个进程.
nomultithread:在incoremultithreading是否采用额外的线程,对通信密集型应用有益.
仅当task/affinity插件启用时.
–help:显示帮助信息I,immediate[=]:salloc与srun特有,在秒内资源未满足的话立即退出.
格式可以为"I60",但不能之间有空格是"I60".
ignorepbs:sbatch特有,忽略批处理脚本中的"#PBS"选项.
i,input=:sbatch与srun特有,指定标准输入如何重定向.
默认,srun对所有任务重定向标准输入为从终端.
参见IO重定向.
J,jobname=:设定作业名,默认为命令名.
jobid=:srun特有,初始作业步到某个已分配的作业号下的作业下,类似设置了SLURM_JOB_ID环境变量.
仅对作业步申请有效.
K,killcommand[=signal]:salloc特有,设定需要终止时的signal,默认,如没指定,则对于交互式作业为SIGHUP,对于非交互式作业为SIGTERM.
格式类似可以为"K1",但不能包含空格为"K1".
K,–killonbadexit[=0|1]:srun特有,设定是否任何一个任务退出码为非0时,是否终止作业步.
k,nokill:如果分配的节点失效,那么不会自动终止.
L,licenses=:设定使用的.
l,label:srun特有,在标注正常输出或标准错误输出的行前面添加作业号.
mem=:设定每个节点的内存大小,后缀可以为[K|M|G|T],默认为MB.
mempercpu=:设定分配的每颗CPU对应最小内存,后缀可以为[K|M|G|T],默认为MB.
mempergpu=:设定分配的每颗GPU对应最小内存,后缀可以为[K|M|G|T],默认为MB.
mincpus=:设定每个节点最小的逻辑CPU核/处理器.
31提交作业命令共同说明148mpi=:srun特有,指定使用的MPI环境,可以主要为:–list:列出可用的MPI以便选择.
–pmi2:启用PMI2支持–pmix:启用PMIx支持–none:默认选项,多种其它MPI实现有效.
multiprog:srun特有,让不同任务运行不同的程序及参数,需指定一个配置文件,参见MULTIPLEPROGRAMCONFIGURATION.
N,nodes=:采用特定节点数运行作业,如没指定maxnodes则需特定节点数,注意,这里是节点数,不是CPU核数,实际分配的是节点数*每节点CPU核数.
nice[=adjustment]:设定NICE调整值.
负值提高优先级,正值降低优先级.
调整范围为:+/2147483645.
n,ntasks=:设定所需要的任务总数.
默认是每个节点1个任务,注意是节点,不是CPU核.
仅对作业起作用,不对作业步起作用.
cpuspertask选项可以改变此默认选项.
ntaskspercore=:每颗CPU核运行个任务,需与n,ntasks=配合,并自动绑定个任务到每个CPU核.
仅对作业起作用,不对作业步起作用.
ntaskspernode=:每个节点运行个任务,需与n,ntasks=配合.
仅对作业起作用,不对作业步起作用.
ntaskspersocket=:每颗CPU运行个任务,需与n,ntasks=配合,并绑定个任务到每颗CPU.
仅对作业起作用,不对作业步起作用.
nobell:salloc特有,资源分配时不终端响铃.
参见bell.
noshell:salloc特有,分配资源后立即退出,而不运行命令.
但Slurm作业仍旧被生成,在其激活期间,且保留这些激活的资源.
用户会获得一个没有附带进程和任务的作业号,用户可以采用提交srun命令到这些资源.
o,output=:sbatch与srun特有,指定标准输出重定向.
在非交互模式中,默认srun收集各任务的标准输出,并发送到吸附的终端上.
采用output可以将其重定向到同一个文件、每个任务一个文件或/dev/null等.
参见IO重定向.
openmode=:sbtach与srun特有,对标准输出和标准错误输出采用追加模式还是覆盖模式.
31提交作业命令共同说明149O,overcommit:采用此选项可以使得每颗CPU运行不止一个任务.
openmode=:标准输出和标准错误输出打开文件的方式:–append:追加.
–truncate:截断覆盖.
p,partition=:使用队列prolog=:srun特有,作业开始运行前执行程序,做相应处理.
Q,quiet:采用安静模式运行,一般信息将不显示,但错误信息仍将被显示.
qos=:需要特定的服务质量(QS).
quitoninterrupt:srun特有,当SIGINT(CtrlC)时立即退出.
r,relative=:srun特有,在当前分配的第n节点上运行作业步.
该选项可用于分配一些作业步到当前作业占用的节点外的节点,节点号从0开始.
r选项不能与w或x同时使用.
仅对作业步有效.
reservation=:从预留资源分配.
–requeue:sbtach特有,当非配的节点失效或被更高级作业抢占资源后,重新运行该作业.
相当于重新运行批处理脚本,小心已运行的结果被覆盖等.
norequeue:任何情况下都不重新运行.
S,corespec=:指定预留的不被作业使用的各节点CPU核数.
但也会被记入费用.
signal=[@]:设定到其终止时间前信号时间秒时的信号.
由于Slurm事件处理的时间精度,信号有可能比设定时间早60秒.
信号可以为10或USER1,信号时间sig_time必须在0到65535之间,如没指定,则默认为60秒.
socketspernode=:设定每个节点的CPU颗数.
T,threads=:srun特有,限制从srun进程发送到分配节点上的并发线程数.
t,time=:作业最大运行总时间,到时间后将被终止掉.
时间的格式可以为:分钟、分钟:秒、小时:分钟:秒、天小时、天小时:分钟、天小时:分钟:秒31提交作业命令共同说明150taskepilog=:srun特有,任务终止后立即执行,对应于作业步分配.
taskprolog=:srun特有,任务开始前立即执行,对应于作业步分配.
testonly:sbatch与srun特有,测试批处理脚本,并预计将被执行的时间,但并不实际执行脚本.
threadspec=:设定指定预留的不被作业使用的各节点线程数.
threadspercore=:每颗CPU核运行个线程.
timemin=:设定作业分配的最小时间,设定后作业的运行时间将使得time设定的时间不少于timemin设定的.
时间格式为:minutes、minutes:seconds、hours:minutes:seconds、dayshours、dayshours:minutes和dayshours:minutes:seconds.
usage:显示简略帮助信息tmp=:设定/tmp目录最小磁盘空间,后缀可以为[K|M|G|T],默认为MB.
u,usage:显示简要帮助信息.
u,–unbuffered:srun特有,该选项使得输出可以不被缓存立即显示出来.
默认应用的标准输出被glibc缓存,除非被刷新(flush)或输出被设定为步缓存.
useminnodes:设定如果给了一个节点数范围,分配时,选择较小的数.
V,version:显示版本信息.
v,verbose:显示详细信息,多个v会显示更详细的详细.
W,wait=:设定在第一个任务结束后多久结束全部任务.
w,nodelist=:在特定节点或filename文件中指定的节点上运行.
waitallnodes=:salloc与sbatch特有,控制当节点准备好时何时运行命令.
默认,当分配的资源准备好后salloc命令立即返回.
可以为:–0:当分配的资源可以分配时立即执行,比如有节点以重启好.
–1:只有当分配的所有节点都准备好时才执行X,disablestatus:srun特有,禁止在srun收到SIGINT(CtrlC)时显示任务状态.
x,exclude=:在特定节点或filename文件中指定的节点之外的节点上运行.
31提交作业命令共同说明15131.
2IO重定向默认标准输出文件和标准出错文件将从所有任务中被重定向到sbatch和srun(salloc不存在IO重定向)的标准输出文件和标准出错文件,标准输入文件从srun的标准输输入文件重定向到所有任务.
如果标准输入仅仅是几个任务需要,建议采用读文件方式而不是重定向方式,以免输入错误数据.
以上行为可以通过output、error和input(o、e、i)等选项改变,有效的格式为:all:标准输出和标准出错从所有任务定向到srun,标准输入文件从srun的标准输输入文件重定向到所有任务(默认).
none:标准输出和标准出错不从任何任务定向到srun,标准输入文件不从srun定向到任何任务.
taskid:标准输出和/或标准出错仅从任务号为taskid的任务定向到srun,标准输入文件仅从srun定向到任务号为taskid任务.
filename:srun将所有任务的标准输出和标准出错重定向到filename文件,标准输入文件将从filename文件重定向到全部任务.
格式化字符:srun允许生成采用格式化字符命名的上述IO文件,如可以结合作业号、作业步、节点或任务等.
–\\:不处理任何代替符.
–%%:字符"%".
–%A:作业组的主作业分配号.
–%a:作业组ID号.
–%J:运行作业的作业号.
步号(如128.
0).
–%j:运行作业的作业号–%s:运行作业的作业步号.
–%N:短格式节点名,每个节点将生成的不同的IO文件.
–%n:当前作业相关的节点标记(如"0"是运行作业的第一个节点),每个节点将生成的不同的IO文件.
–%t:与当前作业相关的任务标记(rank),每个rank将生成一个不同的IO文件.
–%u:用户名.
在%与格式化标记符之间的数字可以用于生成前导零,如:–job%J.
out:job128.
0.
out.
–job%4j.
out:job0128.
out.
–job%j%2t.
out:job12800.
out、job12801.
out、.
.
.
.
32交互式提交并行作业:SRUN15232交互式提交并行作业:srunsrun可以交互式提交运行并行作业,提交后,作业等待运行,等运行完毕后,才返回终端.
语法为:srun[OPTIONS.
.
.
]executable[args.
.
.
]32.
1主要输入环境变量一些提交选项可通过环境变量来设置,命令行的选项优先级高于设置的环境变量,将覆盖掉环境变量的设置.
环境变量与对应的参数如下:SLURM_ACCOUNT:类似A,account.
SLURM_ACCTG_FREQ:类似acctgfreq.
SLURM_BCAST:类似bcast.
SLURM_COMPRESS:类似compress.
SLURM_CORE_SPEC:类似corespec.
SLURM_CPU_BIND:类似cpubind.
SLURM_CPUS_PER_GPU:类似c,cpuspergpu.
SLURM_CPUS_PER_TASK:类似c,cpuspertask.
SLURM_DEBUG:类似v,verbose.
SLURM_DEPENDENCY:类似P,dependency=.
SLURM_DISABLE_STATUS:类似X,disablestatus.
SLURM_DIST_PLANESIZE:类似mplane.
SLURM_DISTRIBUTION:类似m,distribution.
SLURM_EPILOG:类似epilog.
SLURM_EXCLUSIVE:类似exclusive.
SLURM_EXIT_ERROR:Slurm出错时的退出码.
SLURM_EXIT_IMMEDIATE:当immediate使用时且资源当前无效时的Slurm退出码.
SLURM_GEOMETRY:类似g,geometry.
32交互式提交并行作业:SRUN153SLURM_GPUS:类似G,gpus.
SLURM_GPU_BIND:类似gpubind.
SLURM_GPU_FREQ:类似gpufreq.
SLURM_GPUS_PER_NODE:类似gpuspernode.
SLURM_GPUS_PER_TASK:类似gpuspertask.
SLURM_GRES:类似gres,参见SLURM_STEP_GRES.
SLURM_HINT:类似hint.
SLURM_IMMEDIATE:类似I,immediate.
SLURM_JOB_ID:类似jobid.
SLURM_JOB_NAME:类似J,jobname.
SLURM_JOB_NODELIST:类似w,–nodelist=,格式类似node[110,11,1328].
SLURM_JOB_NUM_NODES:分配的总节点数.
SLURM_KILL_BAD_EXIT:类似K,killonbadexit.
SLURM_LABELIO:类似l,label.
SLURM_LINUX_IMAGE:类似linuximage.
SLURM_MEM_BIND:类似membind.
SLURM_MEM_PER_CPU:类似mempercpu.
SLURM_MEM_PER_NODE:类似mem.
SLURM_MPI_TYPE:类似mpi.
SLURM_NETWORK:类似network.
SLURM_NNODES:类似N,nodes,即将废弃.
SLURM_NO_KILL:类似k,nokill.
SLURM_NTASKS:类似n,ntasks.
SLURM_NTASKS_PER_CORE:类似ntaskspercore.
32交互式提交并行作业:SRUN154SLURM_NTASKS_PER_SOCKET:类似ntaskspersocket.
SLURM_NTASKS_PER_NODE:类似ntaskspernode.
SLURM_OPEN_MODE:类似openmode.
SLURM_OVERCOMMIT:类似O,overcommit.
SLURM_PARTITION:类似p,partition.
SLURM_PROFILE:类似profile.
SLURM_PROLOG:类似prolog,仅限srun.
SLURM_QOS:类似qos.
SLURM_REMOTE_CWD:类似D,chdir=.
SLURM_RESERVATION:类似reservation.
SLURM_RESV_PORTS:类似resvports.
SLURM_SIGNAL:类似signal.
SLURM_STDERRMODE:类似e,error.
SLURM_STDINMODE:类似i,input.
SLURM_SRUN_REDUCE_TASK_EXIT_MSG:如被设置,并且非0,那么具有相同退出码的连续的任务退出消息只显示一次.
SLURM_STEP_GRES:类似gres(仅对作业步有效,不影响作业分配),参见SLURM_GRES.
SLURM_STEP_KILLED_MSG_NODE_ID=ID:如被设置,当作业或作业步被信号终止时只特定ID的节点下显示信息.
SLURM_STDOUTMODE:类似o,output.
SLURM_TASK_EPILOG:类似taskepilog.
SLURM_TASK_PROLOG:类似taskprolog.
SLURM_TEST_EXEC:如被定义,在计算节点执行之前先在本地节点上测试可执行程序.
SLURM_THREAD_SPEC:类似threadspec.
32交互式提交并行作业:SRUN155SLURM_THREADS:类似T,threads.
SLURM_TIMELIMIT:类似t,time.
SLURM_UNBUFFEREDIO:类似u,unbuffered.
SLURM_USE_MIN_NODES:类似useminnodes.
SLURM_WAIT:类似W,wait.
SLURM_WORKING_DIR:类似D,chdir.
SRUN_EXPORT_ENV:类似export,将覆盖掉SLURM_EXPORT_ENV.
32.
2主要输出环境变量srun会在执行的节点上设置如下环境变量:SLURM_CLUSTER_NAME:集群名.
SLURM_CPU_BIND_VERBOSE:cpubind详细情况(quiet、verbose).
SLURM_CPU_BIND_TYPE:cpubind类型(none、rank、mapcpu:、maskcpu:).
SLURM_CPU_BIND_LIST:cpubind映射或掩码列表.
SLURM_CPU_FREQ_REQ:需要的CPU频率资源,参见cpufreq和输入环境变量SLURM_CPU_FREQ_REQ.
SLURM_CPUS_ON_NODE:节点上的CPU颗数.
SLURM_CPUS_PER_GPU:每颗GPU对应的CPU颗数,参见cpuspergpu选项指定.
SLURM_CPUS_PER_TASK:每作业的CPU颗数,参见cpuspertask选项指定.
SLURM_DISTRIBUTION:分配的作业的分布类型,参见m,distribution.
SLURM_GPUS:需要的GPU颗数,仅提交时有G,gpus时.
SLURM_GPU_BIND:指定绑定任务到GPU,仅提交时具有gpubind参数时.
SLURM_GPU_FREQ:需求的GPU频率,仅提交时具有gpufreq参数时.
SLURM_GPUS_PER_NODE:需要的每个节点的GPU颗数,仅提交时具有gpuspernode参数时.
32交互式提交并行作业:SRUN156SLURM_GPUS_PER_SOCKET:需要的每个socket的GPU颗数,仅提交时具有gpuspersocket参数时.
SLURM_GPUS_PER_TASK:需要的每个任务的GPU颗数,仅提交时具有gpuspertask参数时.
SLURM_GTIDS:此节点上分布的全局任务号,从0开始,以,分隔.
SLURM_JOB_ACCOUNT:作业的记账名.
SLURM_JOB_CPUS_PER_NODE:每个节点的CPU颗数,格式类似40(x3),3,顺序对应SLURM_JOB_NODELIST节点名顺序.
SLURM_JOB_DEPENDENCY:依赖关系,参见dependency选项.
SLURM_JOB_ID:作业号.
SLURM_JOB_NAME:作业名,参见jobname选项或srun启动的命令名.
SLURM_JOB_PARTITION:作业使用的队列名.
SLURM_JOB_QOS:作业的服务质量QOS.
SLURM_JOB_RESERVATION:作业的高级资源预留.
SLURM_LAUNCH_NODE_IPADDR:任务初始启动节点的IP地址.
SLURM_LOCALID:节点本地任务号.
SLURM_MEM_BIND_LIST:membind映射或掩码列表().
SLURM_MEM_BIND_PREFER:membinprefer优先权.
SLURM_MEM_BIND_TYPE:membind类型(none、rank、mapmem:、maskmem:).
SLURM_MEM_BIND_VERBOSE:内存绑定详细情况,参见membindverbosity(quiet、verbose).
SLURM_MEM_PER_GPU:每颗GPU需求的内存,参见mempergpu.
SLURM_NODE_ALIASES:分配的节点名、通信IP地址和节点名,每组内采用:分隔,组间通过,分隔,如:SLURM_NODE_ALIASES=0:1.
2.
3.
4:foo,ec1:1.
2.
3.
5:bar.
易探云怎么样?易探云(yitanyun.com)是一家知名云计算品牌,2017年成立,从业4年之久,目前主要从事出售香港VPS、香港独立服务器、香港站群服务器等,在售VPS线路有三网CN2、CN2 GIA,该公司旗下产品均采用KVM虚拟化架构。目前,易探云推出免备案香港物理机服务器性价比很高,E3-1230 8 核*1/16G DDR3/SATA 1TB/香港BGP线路/20Mbps/不限流量,仅...
提速啦(www.tisula.com)是赣州王成璟网络科技有限公司旗下云服务器品牌,目前拥有在籍员工40人左右,社保在籍员工30人+,是正规的国内拥有IDC ICP ISP CDN 云牌照资质商家,2018-2021年连续4年获得CTG机房顶级金牌代理商荣誉 2021年赣州市于都县创业大赛三等奖,2020年于都电子商务示范企业,2021年于都县电子商务融合推广大使。资源优势介绍:Ceranetwo...
Hostodo近日发布了美国独立日优惠促销活动,主要推送了四款特价优惠便宜的VPS云服务器产品,基于KVM虚拟架构,NVMe阵列,1Gbps带宽,默认分配一个IPv4+/64 IPv6,采用solusvm管理,赠送收费版DirectAdmin授权,服务有效期内均有效,大致约为7折优惠,独立日活动时间不定,活动机型售罄为止,有需要的朋友可以尝试一下。Hostodo怎么样?Hostodo服务器好不好?...