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

IPCC Preliminary SLIC Analysis part2 : Run process

VScode Debug Run

Debug Process

  1. 创建lables来存储分类结果, m_spcount 200, m_compactness 10
  2. 计时运行 slic.PerformSLICO_ForGivenK(img, width, height, labels, numlabels, m_spcount, m_compactness);
    1. 参数的最后两项是required number of superpixels和weight given to spatial distance(空间距离的权重)也就是K=200
    2. 串行初始化赋值klabels[s] = -1
    3. DoRGBtoLABConversion(ubuff, m_lvec, m_avec, m_bvec);对于整个图像:重载的浮点版本
      1. 提取第一个像素rgb(229,226,218)
      2. 串行RGB2LAB( r, g, b, lvec[j], avec[j], bvec[j] );
      3. int变成double数组
    4. 声明perturbseeds true,edgemag
    5. DetectLabEdges(m_lvec, m_avec, m_bvec, m_width, m_height, edgemag);
      1. 串行对每个像素进行$$dx=(l[i-1]-l[i+1])^2+(a[i-1]-a[i+1])^2+(b[i-1]-b[i+1])^2$$$$dy=(l[i-width]-l[i+width])^2+(a[i-width]-a[i+width])^2+(b[i-width]-b[i+width])^2$$$$edgemag[i]=dx+dy$$为了之后计算6.5-PerturbSeeds
      2. 值得注意的是i的取值说2600 = width+1是第二行第二列,一直到倒数第二行倒数第二列
    6. GetLABXYSeeds_ForGivenK(kseedsl, kseedsa, kseedsb, kseedsx, kseedsy, K, perturbseeds, edgemag);
      1. int step = sqrt(double(sz)/double(K)); \(S=\sqrt{N/k}=225\)
      2. xoff 与 yoff 为一半 112
      3. int X = x*step + (xoff<<(r&0x1));六角网格???
      4. 串行对每个绿圈存了颜色坐标五元组在kseedsl/a/b/x/y 有196个中心
      5. PerturbSeeds(kseedsl, kseedsa, kseedsb, kseedsx, kseedsy, edgemag);
        1. 串行对这196个中心和周围8个位置进行,最小edgemag值的寻找。
        2. 并更新196个中心的位置
    7. int STEP = sqrt(double(sz)/double(K)) + 2.0;
    8. PerformSuperpixelSegmentation_VariableSandM(kseedsl,kseedsa,kseedsb,kseedsx,kseedsy,klabels,STEP,10);
      1. if(STEP < 10) offset = STEP*1.5;
      2. DBL_MAX ? doubel_max 1.7976931348623157e+308
      3. 变量sigma , distxy, maxxy
      4. double invxywt = 1.0/(STEP*STEP);
      5. 迭代10次
        1. 对中心聚类
          1. 串行对这196个中心首先划出[2S*2S]的区域(上下左右offset或者STEP)
          2. 再串行对这\(4S^2\)的区域的每个像素,计算与其区域中心的距离
            $$dist = \frac{(l-kl[n])^2+(a-ka[n])^2+(b-kb[n])^2}{maxlab[n]}+\frac{(x-kx[n])^2+(y-ky[n])^2}{S^2}$$
          3. 注意maxlab[n]初始值是10*10,根据dist更新该像素的距离中心的最小距离数组distvec,和指向的最近中心klable由于是2S*2S,相邻中心的周围区域是有一部分重叠的(如图中黄色荧光笔区域),相当于聚类到各个中心,注意由于中心对自己dist=0,是不可能某一中心距离其他中心更近。
        2. 串行将maxlab与maxlab更新为该聚类集合里的最大值
          1. 注意maxlab与maxlab都是每个中心维护一个
        3. 质心移动:串行将每个聚类区域的每个点的五元组加到质心上,然后除以聚类区域元素总数来得到新的质心五元组
        4. 迭代10次结束(其实可以判断质心是否不再移动来提前结束)
    9. EnforceLabelConnectivity(klabels, m_width, m_height, nlabels, numlabels, K);
      1. 串行新数组赋值for( int i = 0; i < sz; i++ ) nlabels[i] = -1;全部标记为未处理
      2. 串行对所有元素进行如下处理
        1. 如果旧index未被处理
          1. 在其左下上右找到已经处理的元素的nlable,将其值保存在adjlable里
          2. 从该元素开始上下左右寻找未处理,而且其klabels值与旧klabels值相同的元素。
            1. 将其nlable值改为lable,应该也达到标记为已处理的效果
            2. 最终效果就是把该元素相邻连接区域klabels值与旧klabels值相同的全部标记
          3. 如果这块相邻区域过小count <= SUPSZ >> 2
            1. 则将其全部元素赋值为adjlable,即并入上块区域
        2. 旧index++。
        3. 最终效果就是所有的元素重新整合聚类,达到消除过小区域与不连续区域的效果
  3. 结果与check.ppm对比
    1. 我以为只要读取lable的分类,大概sz个int
    2. fread(rgb, (w)*(h)*3, 1, fp);
    3. 作者是傻逼,只用了1/3的空间

skills: size of arrays

1
a.size()

相关知识

RGB与Lab颜色空间互相转换

Lab颜色空间简介

同RGB颜色空间相比,Lab是一种不常用的色彩空间。1976年,经修改后被正式命名为CIELab。Lab颜色空间中的L分量用于表示像素的亮度,取值范围是[0,100],表示从纯黑到纯白;a表示从红色到绿色的范围,取值范围是[127,-128];b表示从黄色到蓝色的范围,取值范围是[127,-128]。

RGB转Lab颜色空间

RGB颜色空间不能直接转换为Lab颜色空间,需要借助XYZ颜色空间,把RGB颜色空间转换到XYZ颜色空间,之后再把XYZ颜色空间转换到Lab颜色空间。

RGB与XYZ颜色空间有如下关系:

LAB与XYZ颜色空间有如下关系:


X,Y,Z会分别除以0.950456、1.0、1.088754。

需要进一步的研究学习

暂无

遇到的问题

暂无

参考文献

IPCC Preliminary SLIC Analysis

VScode Debug Run

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "/home/shaojiemike/github/IPCC/SLIC/SLIC",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
1
g++ -g -std=c++11 SLIC.cpp -o SLIC #把调试信息加到可执行文件中,如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。

Debug Process

  1. main
  2. LoadPPM 把数据读入imag
    1. 读类型、像素图片长宽 2599 3898
    2. 读最大像素 255(应该是指rgb颜色,比如red只有256种,也就是8位二进制)
    3. 读长宽的像素的rgb到imag返回,imag是2599*3898大小的unsigned int二维数组,每位存24位数2进制数。
  3. 创建lables来存储分类结果, m_spcount 200, m_compactness 10
  4. 计时运行 slic.PerformSLICO_ForGivenK(img, width, height, labels, numlabels, m_spcount, m_compactness);//for a given number K of superpixels
  5. 结果与check.ppm对比

skills: watch arrays

1
2
*(int(*)[100])labels
*labels@10000

SourceTrail Analysis

Vtune Analysis

需要进一步的研究学习

遇到的问题

参考文献

IPCC Preliminary SLIC test

test on node5

1
2
3
g++ -std=c++11 SLIC.cpp -o SLIC
time ./SLIC
./SLIC 28.46s user 0.52s system 99% cpu 29.027 total

slic

test on amd_256

1
2
gcc 10.2.0
[1] 122955 segmentation fault (core dumped) ./SLIC

我傻逼了,我把cpp移动了,但是输入文件忘记动了

1
2
3
cat ./log/job_436960_rank0_fb0707_0.out
Computing time=21872 ms
There are 0 points' labels are different from original file.

要求

  1. 对slic.PerformSLICO_ForGivenK 函数运行时间进行通用优化
    1. 首先是并行化处理
    2. 读取时间不在计分范围
    3. 可以优化编译选项
    4. 可以改变数据结构与类型
  2. 需保证结果正确
  3. 之后有多组数据

需要进一步的研究学习

遇到的问题

北京超算的机器传文件只能用wincp,而且有时候不行,需要刷新缓存

参考文献

IPCC Preliminary SLIC algorithm

SLIC

超像素算法就是将图像中的像素依据某种相似性进行聚类,形成一个大“像素”,这个大“像素”可以作为其他图像处理算法的基础。
或者是超像素算法将像素组合成感知有意义的原子区域( atomic regions),其可以用于替换像素网格的刚性结构。它们捕获图像冗余,提供计算图像特征的方便原语( primitive ),并且大大降低了后续图像处理任务的复杂性。

SLIC 算法的基本思想是:

  1. 首先将图像从 RGB 颜色空间转换到 CIE-Lab 颜色空间,并把每个像素的(L,a, b)颜色值和(x, y)坐标值组成一个 5 维的特征向量 V[L, a, b, x, y],
  2. 然后,根据给定的网格步长 \(S=\sqrt{N/k}\),初始化聚类中心 $$C_k=[L_k, a_k, b_k, x_k, y_k]^T$$
  3. 之后在每个聚类中心 Ck 的邻域(2Sx2S),计算邻域内各像素与该 Ck 点
    的相似性度量,从而对邻域内的像素点进行聚类,
  4. 之后迭代更新聚类中心,直至满足收敛条件。
    233
    233

算法特点

  1. 通过将搜索空间限制为与超像素大小成比例的区域,显着地减少了优化中的距离计算的数量。
    233
  2. 加权距离度量组合颜色和空间接近度,同时提供对超像素的尺寸和紧凑性的控制。
  3. 默认情况下,算法的唯一参数是k,其含义是大小大致相等的超像素的个数。

距离测量

233
233
233

参考文献

https://blog.csdn.net/bailing910/article/details/79747689