Module Command
基本使用
需要进一步的研究学习
暂无
遇到的问题
暂无
开题缘由、总结、反思、吐槽~~
参考文献
无
暂无
暂无
无
format=jobid,jobname,partition,nodelist,alloccpus,state,end,start,submit
sacct --format=$format -j 7454119
[sca3190@ln121%bscc-a5 ~]$ sacct -D -T -X -u sca3190 -S 2021-11-10T00:00:00 -E 2021-11-30T00:00:00 --format "JobID,User,JobName,Partition,QOS,Elapsed,Start,NodeList,State,ExitCode,workdir%70"
JobID User JobName Partition QOS Elapsed Start NodeList State ExitCode WorkDir
------------ --------- ---------- ---------- ---------- ---------- ------------------- --------------- ---------- -------- ----------------------------------------------------------------------
1050223 sca3190 LQCD amd_256 normal 19-23:25:24 2021-11-10T00:34:36 fa[0208,0211] NODE_FAIL 0:0 /public1/home/sca3190/VEC_REORDER_LQCD/src
[sca3190@ln121%bscc-a5 ~]$ sacct -D -T -X -u sca3190 -S 2021-11-10T00:00:00 -E 2021-11-30T00:00:00 --format "JobID,User,JobName,Partition,QOS,Elapsed,Start,NodeList,State,ExitCode,workdir%70,Timelimit,Submitline%20,Submit,Layout"
JobID User JobName Partition QOS Elapsed Start NodeList State ExitCode WorkDir Timelimit SubmitLine Submit Layout
------------ --------- ---------- ---------- ---------- ---------- ------------------- --------------- ---------- -------- ---------------------------------------------------------------------- ---------- -------------------- ------------------- ---------
1050223 sca3190 LQCD amd_256 normal 19-23:25:24 2021-11-10T00:34:36 fa[0208,0211] NODE_FAIL 0:0 /public1/home/sca3190/VEC_REORDER_LQCD/src UNLIMITED 2021-11-10T00:11:29
1个task 64核
建议sbatch 加入-t, --time=minutes time limit
#SBATCH -t 5:00
第二年参加IPCC发现去年的一个程序跑了很久。
导出excel 获得jobID 1050223
$ sacct -D -T -X -u sca3190 -S 2021-11-10T00:00:00 -E 2021-11-30T00:00:00 --format "JobID,JobName,State,workdir%70"
JobID JobName State WorkDir
------------ ---------- ---------- ----------------------------------------------------------------------
1050223 LQCD NODE_FAIL /public1/home/sca3190/VEC_REORDER_LQCD/src
NODE_FAIL - Job terminated due to failure of one or more allocated nodes.
查看提交脚本,没有什么问题。
#!/bin/bash
#SBATCH -o ./slurmlog/job_%j_rank%t_%N_%n.out
#SBATCH -p amd_256
#SBATCH -J LQCD
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=64
#SBATCH --exclude=
#SBATCH --cpus-per-task=1
#SBATCH --mail-type=FAIL
#SBATCH [email protected]
source /public1/soft/modules/module.sh
module purge
CC=mpiicc
CXX=mpiicpc
CXX_FLAGS=""
raw_flags="-fPIC -I../include -std=c++11 -march=core-avx2"
MPIOPT=
computetimes="ibug_buffer"
taskname=so_${CC}_${CXX}_${CXX_FLAGS}
export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK
module load intel/20.4.3
module load mpi/intel/20.4.3
make clean
make CC=$CC CXX=$CXX CXX_FLAGS="${CXX_FLAGS}${raw_flags}" TARGET=$taskname
mpirun ./$taskname 0.005 ../data/ipcc_gauge_48_96 48 48 48 96 12 24 24 12 > ./log/3_$taskname$computetimes.log
sca3190@ln121%bscc-a5 src]$ cat slurmlog/job_1050223_rank0_fa0208_0.out
rm -rf liblattice.so dslash.o lattice_fermion.o lattice_gauge.o invert.o check.o load_gauge.o main
mpiicpc -fPIC -I../include -std=c++11 -march=core-avx2 -o dslash.o -c dslash.cpp
mpiicpc -fPIC -I../include -std=c++11 -march=core-avx2 -o lattice_fermion.o -c lattice_fermion.cpp
mpiicpc -fPIC -I../include -std=c++11 -march=core-avx2 -o lattice_gauge.o -c lattice_gauge.cpp
mpiicpc -fPIC -I../include -std=c++11 -march=core-avx2 -o invert.o -c invert.cpp
mpiicpc -fPIC -I../include -std=c++11 -march=core-avx2 -o check.o -c check.cpp
mpiicpc -fPIC -I../include -std=c++11 -march=core-avx2 -o load_gauge.o -c load_gauge.cpp
mpiicpc --shared dslash.o lattice_fermion.o lattice_gauge.o invert.o check.o load_gauge.o -o liblattice.so
mpiicpc -fPIC -I../include -std=c++11 -march=core-avx2 -Wl,-rpath=./ -lmpi -o so_mpiicc_mpiicpc_ main.cpp -L./ -llattice
slurmstepd: error: *** JOB 1050223 ON fa0208 CANCELLED AT 2022-04-20T14:45:43 DUE TO NODE FAILURE, SEE SLURMCTLD LOG FOR DETAILS ***
[[email protected]] check_exit_codes (../../../../../src/pm/i_hydra/libhydra/demux/hydra_demux_poll.c:121): unable to run bstrap_proxy (pid 59376, exit code 256)
[[email protected]] poll_for_event (../../../../../src/pm/i_hydra/libhydra/demux/hydra_demux_poll.c:159): check exit codes error
[[email protected]] HYD_dmx_poll_wait_for_proxy_event (../../../../../src/pm/i_hydra/libhydra/demux/hydra_demux_poll.c:212): poll for event error
[[email protected]] HYD_bstrap_setup (../../../../../src/pm/i_hydra/libhydra/bstrap/src/intel/i_hydra_bstrap.c:772): error waiting for event
[[email protected]] main (../../../../../src/pm/i_hydra/mpiexec/mpiexec.c:1938): error setting up the boostrap proxies
以后最好不要在sbatch脚本里编译
暂无
暂无
无
按照PIM core和memory的距离分类
新的内存工艺使得内存的最小电路单元具有计算能力(忆阻器)
根据PIM距离Memory的距离分成三类 1. NDP GPU 2. ? 3. ?
https://arxiv.org/pdf/2110.01709.pdf
hardware architecture and software stack for pim based on commercial dram technology
pim-enabled instructions a low-overhead locality-aware processing-in-memory architecture
暂无
暂无
无
为了突破RAT以及RRF阶段的瓶颈,Intel从Pentium M处理器开始引入了micro-fusion技术。
在RAT以及RRF阶段,把同一条指令的几个μops混合成一个复杂的μop,使得其只占用一项(比如在ROB里,但是Unlaminated μops会占用2 slots);
而在EU阶段,该复杂μop会被多次发送到EU中进行处理,表现得像是有多个已被分解的μops一样。(每个uops还是要各自运行)
其中一条uops是load或者store
不能采用RIP寄存器进行内存寻址:
采用了RIP寄存器进行内存寻址的指令是不能被micro-fused的,并且这些指令只能由decoder0进行解码。为了占用更少的资源,Intel在酷睿处理器引入macro-fusion(Macro-Op Fusion, MOP Fusion or Macrofusion)
在IQ时读取指令流,把两条指令组合成一个复杂的μop,并且在之后decode等流水线各个阶段都是认为是一项uops。
macro-fused后的指令可以被任意decoder进行解码
其他架构ARM,RISC-V见wikiChip
Intel的要求如下: 1. 两条指令要相互紧邻 2. 如果第一条指令在缓存行的第63个字节处结束,而第二条指令在下一行的第0个字节处开始,则无法进行fusion。 3. 两条指令要满足下表,更新的架构可能会拓展 4.
暂无
暂无
https://www.cnblogs.com/TaigaCon/p/7702920.html
https://blog.csdn.net/hit_shaoqi/article/details/106630483
简单来说每个阶段执行的操作如下:1
1)获取指令,解码后存放到执行缓冲区Reservations Stations 2)乱序执行指令,结果保存在一个结果序列中 3)退休期Retired Circle,重新排列结果序列及安全检查(如地址访问的权限检查),提交结果到寄存器
只有当一条指令与之前已发射(issue)的指令之间的冲突消失之后,这条指令才会被发射、执行。
如果某条指令由于数据冲突而停顿,计分板会监视正在执行的指令流,在所有数据相关性造成的冲突化解之后通知停顿的指令开始执行。
通过寄存器重命名机制,来解决后两种数据依赖。
使用了共享数据总线(common data bus, CDB)将已计算出的值广播给所有需要这个值作为指令源操作数的保留站。
在指令的发射(issue)阶段,如果操作数和保留站都准备就绪,那么指令就可以直接发射并执行。
如果操作数未就绪,则进入保留站的指令会跟踪即将产生这个所需操作数的那个功能单元。
随着流水线pipeline的加深和主存(或者缓存)和处理器间的速度差的变大。在顺序执行处理器等待数据的过程中,乱序执行处理器能够执行大量的指令。使得乱序执行更加重要。
已知可以通过乱序执行来实现,硬件资源的高效利用(避免计算指令等待访存指令的完成)。为了实现乱序执行,需要通过寄存器重命名来打破寄存器的之间的读写依赖。
对于原始代码
原本代码前后3条是没有关系的,可以并行的。需要使用寄存器重命名来解决R1的读后写依赖。
如果多条指令使用了同一个存储位置,这些指令如果不按程序地址顺序执行可能会导致3种数据冲突(data hazard):
先写后读(Read-after-write,RAW):从寄存器或者内存中读取的数据,必然是之前的指令存入此处的。直接数据相关(true data dependency)
先写后写(Write-after-write,WAW):连续写入特定的寄存器或内存,那么该存储位置最终只包含第二次写的数据。这可以取消或者废除第一次写入操作。WAW相关也被说成是“输出相关”(output dependencies)。
先读后写(Write-after-read,WAR):读操作获得的数据是此前写入的,而不是此后写操作的结果。因此并行和乱序时无法改善的资源冲突(antidependency)。
后面两个WAW和WAR可以通过寄存器重命名解决(register renaming),不必等待前面的读写操作完成后再执行写操作,可以保持这个存储位置的两份副本:老值与新值。
前一条指令的读老值的操作可以继续进行,无需考虑那些后一条指令的写新值甚至该写新值指令之后的读新值的操作。产生了额外的乱序执行机会。当所有读老值操作被满足后,老值所使用的寄存器既可以释放。这是寄存器重命名的实质。
任何被读或写的存储都是可以被重名。
对于某种ISA,有固定的供编译器/汇编器访问使用的寄存器。例如,Alpha ISA使用32个64位宽整数寄存器,32个64位宽浮点寄存器。
但是一款特定的处理器,实现了这种处理器体系结构。例如Alpha 21264有80个整数寄存器、72个浮点寄存器,作为处理器内物理实现的寄存器。
如果寄存器个数很多,就不需要寄存器重命名机制。比如IA-64指令集体系结构提供了128个通用寄存器。但是这会导致一些问题:
暂无
暂无
https://zh.wikipedia.org/zh-cn/%E4%B9%B1%E5%BA%8F%E6%89%A7%E8%A1%8C
https://easyperf.net/blog/2018/04/22/What-optimizations-you-can-expect-from-CPU
每个端口的函数可能一个周期执行不完。但是是形成了流水线的。可以保证每个周期accept一个新uops
暂无
暂无
无
寄存器重命名是乱序执行Tomasulo算法的一部分
寄存器重命名可以实现: 1. 部分mov消除 2. NOPs 3. zero (one) idioms 对于这些指令,无序发射到scheduler。可以直接在reorder buffer写入结果。
Zero (one) idioms 是不管原寄存器src值是什么,结果/目的寄存器dst一直/一定是0 (1)的一类指令。比如:XOR一个寄存器和自己。
所以各部分平均执行次数为
指令个数 | UOPS_ISSUED | UOPS_EXECUTED | UOPS_RETIRED |
---|---|---|---|
3 | 2 | 1 | 2 |
有些架构可能不支持srcImm0-dstReg的指令的Zero idioms
1. 由于是在寄存器重命名阶段(Rename)时实现的 1. 所以不需要发射到port执行单元执行,占用硬件资源。也没有延迟 2. 但是需要划分前面部分的decode的带宽,和ROB(reorder buffer)的资源
所以各部分平均执行次数为
指令个数 | UOPS_ISSUED | UOPS_EXECUTED | UOPS_RETIRED |
---|---|---|---|
5 | 4 | 3 | 4 |
一般和0的立即数作用有关
第二条指令在IvyBridge也不会消除。这同样是编译器的工作但是llvm-mca通过ZeroRegister的实现,可以消除。
类似的还有
一般也不会消除。这同样是编译器的工作暂无
暂无
https://randomascii.wordpress.com/2012/12/29/the-surprising-subtleties-of-zeroing-a-register/
https://easyperf.net/blog/2018/04/22/What-optimizations-you-can-expect-from-CPU
https://zh.m.wikipedia.org/zh-hans/%E5%AF%84%E5%AD%98%E5%99%A8%E9%87%8D%E5%91%BD%E5%90%8D
public/*.html
根据公开的仓库,hugo的html文件会产生在gh-pages
分支下
name: build
on:
push:
branches: [master]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
#submodules: true # Fetch Hugo themes (true OR recursive)
fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
with:
hugo-version: 'latest'
#extended: true
- name: Build
run: hugo --minify
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
if: github.ref == 'refs/heads/master'
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./public
接收端转发到内网的机器上(通过修改vim /etc/nginx/sites-enabled/default
)
server{
location /_webhook/ {
proxy_pass http://snode5.swangeese.fun;
proxy_set_header Host $http_host;
}
}
systemctl reload nginx
Nginx中location的作用是根据Url来决定怎么处理用户请求(转发请求给其他服务器处理或者查找本地文件进行处理)。location支持正则表达式,配置十分灵活。我们可以在一个虚拟主机(nginx中的一个server节点)下配置多个location以满足如动静分离,防盗链等需求。
在snode5上nginx也需要转发
暂无
暂无
无
wget https://go.dev/dl/go1.18.3.linux-amd64.tar.gz
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.18.3.linux-amd64.tar.gz
(maybe need sudo)
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.18.3.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
go version
$ cd $HOME/go/src/hello
$ go run main.go #直接运行
Hello, World!!
$ go build # 产生可执行文件
$ ./hello
Hello, World!!
Packages
Go packages are folders that contain one more go files.
Modules
A modules (starting with vgo and go 1.11) is a versioned collection of packages.
go list -m -u all
来检查可以升级的package,
使用go get -u need-upgrade-package
升级后会将新的依赖版本更新到go.mod
也可以使用 go get -u
升级所有依赖
作者:若与 链接:https://www.jianshu.com/p/760c97ff644c 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
暂无
暂无
https://devhints.io/go
go modules 是 golang 1.11 新加的特性。现在1.12 已经发布了,是时候用起来了。Modules官方定义为:
模块是相关Go包的集合。modules是源代码交换和版本控制的单元。 go命令直接支持使用modules,包括记录和解析对其他模块的依赖性。modules替换旧的基于GOPATH的方法来指定在给定构建中使用哪些源文件。
go.mod
文件
go.mod文件一旦创建后,它的内容将会被go toolchain全面掌控。
go toolchain会在各类命令执行时,比如go get、go build、go mod等修改和维护go.mod文件。
go.mod 提供了module, require、replace和exclude 四个命令
module 语句指定包的名字(路径) require 语句指定的依赖项模块 replace 语句可以替换依赖项模块 exclude 语句可以忽略依赖项模块
对于main.go
里的import
package main
import (
"crypto/hmac"
"crypto/sha1"
"encoding/hex"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"os/exec"
"strings"
)
……
go run main.go
运行代码会发现 go mod
会自动查找依赖自动下载,并修改go.mod
(安装 package 的原則是先拉最新的 release tag,若无tag则拉最新的commit)
结合github很简单实现
暂无
暂无
https://www.jianshu.com/p/760c97ff644c