AMD Epyc Compiler Options

AMD EPYC™ 7xx2-series Processors Compiler Options Quick Reference Guide

AOCC compiler (with Flang -Fortran Front-End)

Latest release: 2.1, Nov 2019

https://developer.amd.com/amd-aocc/Advanced

GNU compiler collection (gcc, g++, gfortran)

Intel compilers (icc, icpc, ifort)

amd prace guide

需要进一步的研究学习

  1. Amd uprof
  2. PGI compiler
  3. Numactl
  4. OMP_PROC_BIND=TRUE; OMP_PLACES=sockets

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

https://developer.amd.com/wordpress/media/2020/04/Compiler%20Options%20Quick%20Ref%20Guide%20for%20AMD%20EPYC%207xx2%20Series%20Processors.pdf

https://prace-ri.eu/wp-content/uploads/Best-Practice-Guide_AMD.pdf#page35

Prace guide

Intel Compile Options

Win与Linux的区别

选项区别

对于大部分选项,Intel编译器在Win上的格式为:/Qopt,那么对应于Lin上的选项是:-opt。禁用某一个选项的方式是/Qopt-和-opt-。

Intel的编译器、链接器等

在Win上,编译器为icl.exe,链接器为xilink.exe,VS的编译器为cl.exe,链接器为link.exe。

在Linux下,C编译器为icc,C++编译器为icpc(但是也可以使用icc编译C++文件),链接器为xild,打包为xiar,其余工具类似命名。

GNU的C编译器为gcc,C++编译器为g++,链接器为ld,打包为ar

并行化

-qopenmp

-qopenmp-simd

如果选项 O2 或更高版本有效,则启用 OpenMP* SIMD 编译。

-parallel

告诉自动并行程序为可以安全地并行执行的循环生成多线程代码。

要使用此选项,您还必须指定选项 O2 或 O3。
如果还指定了选项 O3,则此选项设置选项 [q 或 Q]opt-matmul。

-qopt-matmul

启用或禁用编译器生成的矩阵乘法(matmul)库调用。

向量化(SIMD指令集)

-xHost

必须至少与-O2一起使用,在Linux系统上,如果既不指定-x也不指定-m,则默认值为-msse2。

-fast

On macOS* systems: -ipo, -mdynamic-no-pic,-O3, -no-prec-div,-fp-model fast=2, and -xHost

On Windows* systems: /O3, /Qipo, /Qprec-div-, /fp:fast=2, and /QxHost

On Linux* systems: -ipo, -O3, -no-prec-div,-static, -fp-model fast=2, and -xHost

指定选项 fast 后,您可以通过在命令行上指定不同的特定于处理器的 [Q]x 选项来覆盖 [Q]xHost 选项设置。但是,命令行上指定的最后一个选项优先。

-march

必须至少与-O2一起使用,如果同时指定 -ax 和 -march 选项,编译器将不会生成特定于 Intel 的指令。

指定 -march=pentium4 设置 -mtune=pentium4。

-x

告诉编译器它可以针对哪些处理器功能,包括它可以生成哪些指令集和优化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
AMBERLAKE
BROADWELL
CANNONLAKE
CASCADELAKE
COFFEELAKE
GOLDMONT
GOLDMONT-PLUS
HASWELL
ICELAKE-CLIENT (or ICELAKE)
ICELAKE-SERVER
IVYBRIDGE
KABYLAKE
KNL
KNM
SANDYBRIDGE
SILVERMONT
SKYLAKE
SKYLAKE-AVX512
TREMONT
WHISKEYLAKE

-m

告诉编译器它可能针对哪些功能,包括它可能生成的指令集。

-ax

生成基于多个指令集的代码。

HLO

High-level Optimizations,高级(别)优化。O1不属于

-O2

更广泛的优化。英特尔推荐通用。

在O2和更高级别启用矢量化。

在使用IA-32体系结构的系统上:执行一些基本的循环优化,例如分发、谓词Opt、交换、多版本控制和标量替换。

此选项还支持:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
内部函数的内联
文件内过程间优化,包括:
内联
恒定传播
正向替代
常规属性传播
可变地址分析
死静态函数消除
删除未引用变量
以下性能增益功能:
恒定传播
复制传播
死码消除
全局寄存器分配
全局指令调度与控制推测
循环展开
优化代码选择
部分冗余消除
强度折减/诱导变量简化
变量重命名
异常处理优化
尾部递归
窥视孔优化
结构分配降低与优化
死区消除

-O3

O3选项对循环转换(loop transformations)进行更好的处理来优化内存访问。

比-O2更激进,编译时间更长。建议用于涉及密集浮点计算的循环代码。

既执行O2优化,并支持更积极的循环转换,如Fusion、Block Unroll和Jam以及Collasing IF语句。

此选项可以设置其他选项。这由编译器决定,具体取决于您使用的操作系统和体系结构。设置的选项可能会因版本而异。

当O3与options-ax或-x(Linux)或options/Qax或/Qx(Windows)一起使用时,编译器执行的数据依赖性分析比O2更严格,这可能会导致更长的编译时间。

O3优化可能不会导致更高的性能,除非发生循环和内存访问转换。在某些情况下,与O2优化相比,优化可能会减慢代码的速度。

O3选项建议用于循环大量使用浮点计算和处理大型数据集的应用程序。

与非英特尔微处理器相比,共享库中的许多例程针对英特尔微处理器进行了高度优化。

-Ofast

-O3 plus some extras.

IPO

Interprocedural Optimizations,过程间优化。

典型优化措施包括:过程内嵌与重新排序、消除死(执行不到的)代码以及常数传播和内联等基本优化。

过程间优化,当程序链接时检查文件间函数调用的一个步骤。在编译和链接时必须使用此标志。使用这个标志的编译时间非常长,但是根据应用程序的不同,如果与-O*标志结合使用,可能会有明显的性能改进。

内联

内联或内联展开,简单理解,就是将函数调用用函数体代替,主要优点是省去了函数调用开销和返回指令的开销,主要缺点是可能增大代码大小。

PGO

PGO优化是分三步完成的,是一个动态的优化过程。

PGO,即Profile-Guided Optimizations,档案导引优化。

具体选项详解

-mtune=processor

此标志对特定的处理器类型进行额外的调整,但是它不会生成额外的SIMD指令,因此不存在体系结构兼容性问题。调优将涉及对处理器缓存大小、指令优先顺序等的优化。

为支持指定英特尔处理器或微体系结构代码名的处理器优化代码。

-no-prec-div

不启用 提高浮点除法的精度。

-static

不用动态库

-fp-model fast=2

自动向量化时按照固定精度,与OpenMP的选项好像有兼容性的问题

-funroll-all-loops

展开所有循环,即使进入循环时迭代次数不确定。此选项可能会影响性能。

-unroll-aggressive / -no-unroll-aggressive

此选项决定编译器是否对某些循环使用更激进的展开。期权的积极形式可以提高绩效。

此选项可对具有较小恒定递增计数的回路进行积极的完全展开。

falign-loops

将循环对齐到 2 的幂次字节边界。

-falign-loops[=n]是最小对齐边界的可选字节数。它必须是 1 到 4096 之间的 2 的幂,例如 1、2、4、8、16、32、64、128 等。如果为 n 指定 1,则不执行对齐;这与指定选项的否定形式相同。如果不指定 n,则默认对齐为 16 字节。

-O0 / -Od

关闭所有优化选项,-O等于-O2 (Linux* and macOS*)

-O1

在保证代码量不增加的情况下编译,

  1. 实现全局优化;这包括数据流分析、代码运动、强度降低和测试替换、分割生存期分析和指令调度。
  2. 禁用某些内部函数的内联。

遇到的问题

1
icpc -dM -E -x c++ SLIC.cpp

https://stackoverflow.com/questions/34310546/how-can-i-see-which-compilation-options-are-enabled-on-intel-icc-compiler

parallel 与mpicc 或者mpiicc有什么区别呢

开题缘由、总结、反思、吐槽~~

讲实话,IPO PGO我已经晕了,我先列个list,之后再研究

参考文献

https://blog.csdn.net/gengshenghong/article/details/7034748

按字母顺序排列的intel c++编译器选项列表

IPCC Preliminary SLIC Optimization 2

chivier advise on IPCC amd_256

技术路线 描述 时间 加速比 备注
Baseline 串行程序 21872 ms 1
核心循环openmp 未指定 8079ms
核心循环openmp 单节点64核 7690ms 2.84
换intel的ipcp 基于上一步 3071 ms 7.12
-xHOST 其余不行,基于上一步 4012ms
-O3 基于上一步 3593ms

node5

Intel(R) Xeon(R) Platinum 8153 CPU @ 2.00GHz

技术路线 描述 时间 加速比 备注
Baseline 串行程序 29240 ms 1
核心循环openmp 未指定(htop看出64核) 12244 ms
去除无用计算+两个numk的for循环 080501 11953 ms 10054 ms
计算融合(去除inv) 080502 15702 ms 14923 ms 15438 ms 11987 ms
maxlab openmp 基于第三行080503 13872 ms 11716 ms
循环展开?? 14436 ms 14232 ms 15680 ms

-xCOMMON-AVX512 not supports

1
Please verify that both the operating system and the processor support Intel(R) X87, CMOV, MMX, FXSAVE, SSE, SSE2, SSE3, SSSE3, SSE4_1, SSE4_2, MOVBE, POPCNT, AVX, F16C, FMA, BMI, LZCNT, AVX2, AVX512F, ADX and AVX512CD instructions.

-xCORE-AVX2

1
Please verify that both the operating system and the processor support Intel(R) X87, CMOV, MMX, FXSAVE, SSE, SSE2, SSE3, SSSE3, SSE4_1, SSE4_2, MOVBE, POPCNT, AVX, F16C, FMA, BMI, LZCNT and AVX2 instructions

没有 FXSAVE,BMI,LZCNT 有BMI1,BMI2

使用-xAVX,或者-xHOST 来选择可用的最先进指令集

1
Please verify that both the operating system and the processor support Intel(R) X87, CMOV, MMX, FXSAVE, SSE, SSE2, SSE3, SSSE3, SSE4_1, SSE4_2, POPCNT and AVX instructions.

-fast bugs

1
2
3
4
5
ld: cannot find -lstdc++
ld: cannot find -lstdc++
/public1/soft/intel/2020u4/compilers_and_libraries_2020.4.304/linux/compiler/lib/intel64_lin/libiomp5.a(ompt-general.o): In function `ompt_pre_init':
(.text+0x2281): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/var/spool/slurm/d/job437118/slurm_script: line 23: ./SLIC_slurm_intel_o3: No such file or directory

AMD EPYC 7~~2

icpc -Ofast -march=core-avx2 -ipo -mdynamic-no-pic -unroll-aggressive -no-prec-div -fp-mode fast=2 -funroll-all-loops -falign-loops -fma -ftz -fomit-frame-pointer -std=c++11 -qopenmp SLIC_openmp.cpp -o SLIC_slurm_intel_o3

后续优化

基于核心的openmp并行

去除无用计算

1
2
delete all maxxy
if(maxxy[klabels[i]] < distxy[i]) maxxy[klabels[i]] = distxy[i];

计算融合(减少访存次数)

  1. 将inv去除(效果存疑)
  2. maxlab openmp并行(由于不是计算密集的,是不是要循环展开)

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

IPCC Preliminary SLIC Optimization 1

第一部分优化

从数据重用(不重复计算,降低计算量)、计算融合(减少访存次数)、循环重组、改变数据结构入手

数据重用

主体变量数据依赖梳理


一开始所有的RGB颜色在ubuff里,klabel存分类结果

首先经过转换,将ubuff的RGB转换为lvec avec bvec三个double[sz]数组
存在私有变量m_lvec m_avec m_bvec,供class内访问

优化建议:lab三种颜色存在一起,访问缓存连续

DoRGBtoLABConversion(ubuff, m_lvec, m_avec, m_bvec);

计算冗余一:


计算出的全体edges,只有一部分在后面一个地方用了196个中心以及周围8个节点。

优化建议:要用edges时再计算(保证了去除不必要计算和计算融合)


优化建议:kseedsl/a/b/x/y 分别用5个vector存是不好的,每个中心的5元组要存在一起,因为访问和修改都是一起的。

优化建议:

  1. 核心计算,是不是要拆开?
  2. 除以maxlab[n],改成乘1/maxlab[n]
  3. maxxy没有用,可以除去定义与数组维护(line 429)
  4. disxy[i]也就可以不用数组

优化建议:

  1. if判断用掩码
  2. 想将与每个像素i有关的属性放在一起,但是distvec要全部初始化。那我维护char*的passcheck数组判断是否已经遍历?未遍历直接赋值,已经遍历,比较后判断是否赋值。
  3. 对于2和并行化这个部分的问题:1.按照中心划分,存储每个点的距不同中心的距离,最后归约取最小。2. 并行还是按照坐标划分,判断在哪几个区域内,然后计算距离最小的)

优化建议:

  1. 对于求和部分labxy与1/clustersize??存在一起
  2. 这部分按坐标并行时,归约的是196个元素的最小值或者求和

vector 连续性

vector中的元素在内存中是连续存储的.

vector的实现是由一个动态数组构成. 当空间不够的时候, 采用类似于C语言的realloc函数重新分配空间. 正是因为vector中的元素是连续存储的, 所以vector支持常数时间内完成元素的随机访问. vector中的iterator属于Random Access Iterator.

cache缓存原理疑问

每级cache难道只存读取数据周围的所有地址数据吗?还是一块一块读的。

假如调度是一块一块读取的而且cache足够大存下时,对于m_lvec m_avec m_bvec,假如各读取同一块,会导致和将其存储在一起是一样的效果。对于m_lvec[i]的下一个元素m_lvec[i+1],m_avec[i+1],m_bvec[i+1]也在cache中。

chivier 建议

1
2
3
4
5
#pragma omp parallel for collapse(2)
icpc -xCOMMON-AVX512 -O3 -std=c++11 -qopenmp SLIC.cpp -o SLIC
g++ -fopenmp
先openMP优化,然后MPI一分为二
数据结构没有必要改,不会访存连续

minicoda for tmux zsh htop gcc9

pip install gdbgui to localhost

gdb tui enable



需要进一步的研究学习

暂无

遇到的问题

暂无

参考文献

Analysis Software

tools

  1. intel vtune
  2. GNU gprof
  3. linux perf
  4. valgrind
    1. memcheck
    2. callgrind
    3. cachegrind
    4. Helgrind
  5. ITAC (for MPI)
  6. IPM (for MPI)
  7. Charging software
    1. paramon
    2. paratunes

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

2021 IPCC

参考文献

Openmpi MPIOPT

1
2
3
# 华为ARM
MPIOPT="-mca pml ucx --mca btl ^vader,tcp,openib,uct -x UCX_NET_DEVICES=mlx5_0:1"
mpirun -np 4 $MPIOPT ./prob1

mpirun参数

root用户需要加–allow-run-as-root
参数1
参数2

-x <env>

  1. 在执行程序之前将指定的环境变量导出到远程节点。
  2. 每个 -x 选项只能指定一个环境变量。 可以指定现有环境变量或使用相应值指定新变量名称。 例如:
    1
    % mpirun -x DISPLAY -x OFILE=/tmp/out ...
  3. 建议用户在环境中设置变量,然后使用 -x 导出(非定义)它们。

MCA 组件

设置 MCA(Modular Component Architecture ) 参数

-mca 开关允许将参数传递给各种 MCA(模块化组件架构)模块。 MCA 模块对 MPI 程序有直接影响,因为它们允许在运行时设置可调参数(例如使用哪个 BTL 通信设备驱动程序,向该 BTL 传递什么参数等)。

-mca 开关接受两个参数:<key> 和 <value>。 <key> 参数通常指定哪个 MCA 模块将接收该值。例如,<key> “btl” 用于选择用于传输 MPI 消息的 BTL。 <value> 参数是传递的值。

1
mpirun -mca btl tcp,self -np 1 foo

告诉 Open MPI 使用“tcp”和“self”BTL,并运行一个已分配的“foo”节点。

可以多次使用以指定不同的 <key> 和/或 <value> 参数。如果多次指定相同的 <key>,则 <value> 将用逗号 (“,”) 连接起来,将它们分隔开。

未知的<key>值不会报warning

MCA通过环境变量实现

OMPI_MCA_<key>=<value>

MCA通过指定包含相关选项的文件实现

-tune, –tune <tune_file>

MCA设置的优先级

-mca选项会覆盖环境变量,也会覆盖默认文件

$OPAL_PREFIX/etc/openmpi/openmpi-mca-params.conf

或者$OPAL_PREFIX/etc/openmpi-mca-params.conf

或者$HOME/.openmpi/mca-params.conf

MCA 默认default值

https://stackoverflow.com/questions/36635061/how-to-check-which-mca-parameters-are-used-in-openmpi

set mpi_show_mca_params to all

MCA可用的组件-通过ompi_info

ompi_info指令

ompi_info - 显示有关 Open MPI 安装的信息
三种常见场景:

  1. 检查本地配置并查看 Open MPI 是如何安装的。
  2. 向 Open MPI 社区提交错误报告/帮助请求
  3. 查看已安装的 Open MPI 插件列表并查询它们支持哪些 MCA 参数。
  4. ompi_info –all 显示所有MCA选项,包括在某些环境变量值下才可用的隐藏选项

ompi_info查看使用情况

比如不清楚 –mca btl vader,可以运行 ompi_info –param btl vader –level 9

BTL

MPI point-to-point byte transfer layer, used for MPI

BTL 组件框架负责处理所有点对点消息传送,该层只是简单地移动字节序列,不考虑上层点对点通信协议,包含了一组用于发送/接收或RDMA 的通信组件单元。BTL 不受 MPI 语义的影响,它仅仅是通过最基本的传递功能来在进程间进行数据交换(包括连续的和非连续的数据)。这样的组件框架为网络设备的开发商提供了便利,同时也可以支持更广泛的结点间通信设备。

^号与…符号

btl 参数的值是一个由逗号分隔的组件列表,带有可选的前缀 ^(插入符号)来表示排除之后的组件。

1
% mpirun --mca framework comp1, comp2 ^comp3 # ^comp3前注意没有,号

在此示例中,组件 comp1 和 comp2 包含在 –mca 框架指定的框架中。组件 comp3 被排除在外,因为它前面有 ^(插入符号)符号。

1
% mpirun --mca framework ^comp3,comp1

因为,号的原因是一个整体,所以是排除comp3,comp1两项

例如,以下命令从 BTL 框架中排除 tcp 和 openib 组件,并隐式包含所有其他组件

1
% mpirun --mca btl ^tcp,openib ... # ...是rest的意思

在命令中使用插入符号后跟省略号表示“对其余组件执行相反的操作”。 当 mpirun –mca 命令指定要排除的组件时,省略号后面的插入符号隐式包含该框架中的其余组件。 当 mpirun –mca 命令专门包含组件时,后面跟有省略号的表示“并排除未指定的组件”。

例如,以下命令仅包含 btl 的 self、sm 和 gm 组件,并隐式排除其余部分:

1
% mpirun --mca btl self,sm,gm ...

PML

MPI point-to-point management layer

PML 组件框架负责管理所有消息的传递,实现了 MPI 点点通信原语,包括标准、缓冲、准备和同步四种通信模式。PML 根据具体的调度策略对 MPI 消息进行调度,该策略是根据 BTL 的具体属性决定的。短消息传递协议和长消息传递协议也是在 PML 中实现的。所有控制信息(ACK/NACK/MATCH)也都由 PML 进行管理。这种结构的优点是将传输协议从底层互连中分离出来,显著的降低了代码的复杂度和冗余度,增强了可维护性。


需要进一步的研究学习

不使用btl??

遇到的问题

暂无

参考文献

https://docs.oracle.com/cd/E19923-01/820-6793-10/mca-params.html

https://www.open-mpi.org/faq/?category=openfabrics

http://blog.sysu.tech/MPI/OpenMPI/OpenMPI%E5%B8%B8%E7%94%A8%E6%8A%80%E5%B7%A7/

http://blog.sysu.tech/MPI/OpenMPI/OpenMPI%E5%B8%B8%E7%94%A8%E6%8A%80%E5%B7%A7/

https://blog.csdn.net/qq_15457239/article/details/49152209

IPCC Preliminary SLIC Analysis part4 : cluster environment

login node

id

1
2
3
4
[sca3173@ln121%bscc-a5 ~]$ id sca3173
do_ypcall: clnt_call: RPC: Remote system error
do_ypcall: clnt_call: RPC: Remote system error
uid=5804(sca3173) gid=5804(sca3173) groups=5804(sca3173),1518

cpu

1
Intel(R) Xeon(R) Silver 4208 CPU @ 2.10GHz

slurm

1
2
3
4
5
6
ON AVAIL  TIMELIMIT  NODES  STATE NODELIST 
amd_256 up infinite 3 drain* fa[0512,0911],fb1111
amd_256 up infinite 1 down* fa0714
amd_256 up infinite 1 comp fb1106
amd_256 up infinite 16 drain fa[0109,0411,0414,0601,0608-0609,0810,1203],fb[0104,0110,0513,0908,1007,1208,1212,1216]
amd_256 up infinite 377 alloc fa[0101-0108,0110-0116,0201-0202,0204-0216,0301-0316,0401-0410,0412-0413,0415-0416,0501-0511,0513-0516,0602-0607,0610-0616,0701-0713,0715-0716,0801-0809,0811,0813-0816,0901-0910,0912-0916,1001-1016,1101-1116,1201-1202,1204-1216,1301-1316],fb[0101-0103,0105-0109,0111-0116,0201-0204,0207-0216,0301-0316,0401-0416,0501-0512,0514-0516,0601-0616,0702-0716,0803-0815,0901-0904,0906-0907,0909-0911,0913-0916,1001-1003,1010,1012-1014,1016,1101,1103-1105,1107-1110,1113-1115,1201-1207,1211,1213-1214,1302-1304,1309-1315],fc[0101-0105,0115,0205-0207,0209,0215]

memery

1
2
3
4
[sca3173@ln121%bscc-a5 ~]$ cat /proc/meminfo
MemTotal: 196339948 kB = 187gB
MemFree: 89580888 kB = 85 gB
MemAvailable: 163166580 kB = 102 gB

architecture

1
2
3
4
5
[sca3173@ln121%bscc-a5 public1]$ lsb_release -d | awk -F"\t" '{print $2}'
CentOS Linux release 7.9.2009 (Core)

[sca3173@ln121%bscc-a5 public1]$ cat /proc/version
Linux version 3.10.0-1160.el7.x86_64 ([email protected]) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Mon Oct 19 16:18:59 UTC 2020

GPU 集显

1
2
3
4
5
6
[sca3173@ln121%bscc-a5 public1]$  lshw -numeric -C display
WARNING: you should run this program as super-user.
*-display
description: VGA compatible controller
product: Integrated Matrox G200eW3 Graphics Controller [102B:536]
vendor: Matrox Electronics Systems Ltd. [102B]

disk

1
2
3
[sca3173@ln121%bscc-a5 public1]$ df -h /public1
Filesystem Size Used Avail Use% Mounted on
10.10.58.1@o2ib:10.10.58.2@o2ib:/public1 2.7P 240T 2.3P 10% /public1

IP 内网IP

1
2
[sca3173@ln121%bscc-a5 public1]$ hostname -I | awk '{print $1}'
172.16.58.14

compute node

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
> cat lscpu.txt                
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 64
On-line CPU(s) list: 0-63
Thread(s) per core: 1
Core(s) per socket: 32
Socket(s): 2
NUMA node(s): 2
Vendor ID: AuthenticAMD
CPU family: 23
Model: 49
Model name: AMD EPYC 7452 32-Core Processor
Stepping: 0
CPU MHz: 2345.724
BogoMIPS: 4691.44
Virtualization: AMD-V
L1d cache: 32K
L1i cache: 32K
L2 cache: 512K
L3 cache: 16384K
NUMA node0 CPU(s): 0-31
NUMA node1 CPU(s): 32-63
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc art rep_good nopl nonstop_tsc extd_apicid aperfmperf eagerfpu pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_l2 cpb cat_l3 cdp_l3 hw_pstate sme retpoline_amd ssbd ibrs ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 cqm rdt_a rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local clzero irperf xsaveerptr arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif umip overflow_recov succor smca

没有gcc/7.3.0

比赛是2节点128核的环境

计算节点网络拓扑图

我们是A5 分区。

没有找到手册,只有一个官网图。但是虽然频率是2.35GHz,但是内存只有251GB啊,什么情况。

IPCC Preliminary SLIC Analysis part3 : Hot spot analysis

vtune hotspots




vtune threading



GUN profile gprof + gprof2dot graphviz

1
2
3
4
5
6
g++ -pg -g -std=c++11 SLIC.cpp -o SLIC
./SLIC # generate gmon.out
less gmon.out
"gmon.out" may be a binary file. See it anyway?
gprof ./SLIC
gprof ./SLIC| /home/shaojiemike/github/isc21-gpaw/LogOrResult/profile/gprof2dot.py -n0 -e0 | dot -Tpng -o output.png



没什么用

接下来

  1. 向量化
  2. 并行化

什么时候OpenMP并行,什么时候MPI并行

根据具体资源情况来,貌似是一个节点,那可以从OpenMP入手

自动并行化

Intel编译器的自动并行化功能可以自动的将串行程序的一部分转换为线程化代码。进行自动向量化主要包括的步骤有,找到有良好的工作共享(worksharing)的候选循环;对循环进行数据流(dataflow)分析,确认并行执行可以得到正确结果;使用OpenMP指令生成线程化代码。

/Qparallel:允许编译器进行自动并行化

/Qpar-reportn:n为0、1、2、3,输出自动并行化的报告

说明:/Qparallel必须在使用O2/3选项下有效

c++向量化怎么实现

什么是向量化

所谓的向量化,简单理解,就是使用高级的向量化SIMD指令(如SSE、SSE2等)优化程序,属于数据并行的范畴。

如何对代码向量化

向量化的目标是生成SIMD指令,那么很显然,要对代码进行向量化,

第一是依靠编译器来生成这些指令;

第二是使用汇编或Intrinsics函数。

自动向量分析器

Intel编译器中,利用其自动向量分析器(auto-vectorizer)对代码进行分析并生成SIMD指令。另外,也会提供一些pragmas等方式使得用户能更好的处理代码来帮助编译器进行向量化。

  1. 基本向量化
    /Qvec:开启自动向量化功能,需要在O2以上使用。在O2以上,这是默认的向量化选项,默认开启的。此选项生成的代码能用于Intel处理器和非Intel处理器。向量化还可能受其他选项影响。由于此选项是默认开启的,所以不需要在命令行增加此选项。

  2. 针对指令集(处理器)的向量化
    /QxHost:针对当前使用的主机处理器选择最优的指令集优化。

对于双重循环,外层循环被自动并行化了,而内层循环并没有被自动并行化,内层循环被会自动向量化。

影响向量化的因素

  1. 首先当然是指令集是否支持
  2. 内存对齐相关的问题,也是影响向量化的,很多的SSE指令都要求内存是16字节对齐,如果不对齐,向量化会得到错误结果。

如何判断向量化成功

看汇编代码
没成功需要手动内联向量化汇编代码???

Intel 编译器的向量化实现

AMD 编译器向量化实现

AMD 与 Intel 编译器的区别

需要进一步的研究学习

暂无

遇到的问题

暂无

参考文献

https://blog.csdn.net/gengshenghong/article/details/7027186

https://blog.csdn.net/gengshenghong/article/details/7034748

https://blog.csdn.net/gengshenghong/article/details/7022459

homepage interesting upgrade options

homepage Live2d + Mouse click effects + background-music

在\themes\hugo-theme-minos\layouts路径下修改模板html即可

https://www.python87.com/p/881.html

https://github.com/stevenjoezhang/live2d-widget

https://apps.elfsight.com/panel/applications/background-music/

live2d

live2d : https://jingzhisheng.cn/blog/detail/1406456203487350784

https://l2d.alg-wiki.com/

https://github.com/alg-wiki/AzurLaneL2DViewer/tree/gh-pages/assets

pretty blogs

anime theme

需要进一步的研究学习

live2d more

遇到的问题

暂无

参考文献