tvm笔记
tvm.target.rocm
create ROCM target
tvm.target.rocm
create ROCM target
doxygen -g #生成配置文档
doxygen ./Doxyfile #以配置Doxyfile生成doxygen文档
配置选项:
PROJECT_NAME
:工程名称
OUTPUT_DIRECTORY = ./document
:输出文档目录
INPUT
:代码目录
RECURSIVE = YES
: 是否递归子目录
EXTRACT_ALL = YES
EXTRACT_PRIVATE = YES
EXTRACT_STATIC = YES
FILE_PATTERNS
识别的文件格式
git branch -d $BRANCH_NAME # 删除分支
git reset head (--{file}) # 将已经stage的文件丢弃到working directory
git stash save "message" # stash当前已经stage的文件,以message保存
git clone -b [branch] [repo] #clone指定branch
git branch -a # 列出包括远程分支在内所有分支
git branch --set-upstream-to=my_origin/master master #将master track到my_origin/master
git clean -fd -n #查看clean会删除的文件
git clean -fdx #删除untracked file
git checkout -- [file] #将文还原为上次提交的版本(若在暂存区中则还原暂存区中版本,否则还原版本库版本)
git remote -v 查看所有远程分支指向
git remote
clone 后 单独初始化 submodule :
git submodule init
git submodule update
MPI : Message Passing Interface
多线程编程中进程间消息传递
进程(process) 线程(thread)
threads 之间共享 process 的 address space 和resource
thread safe:线程安全,多个线程访问时不会出现race condition
两种common通信协议
Eager协议:发送进程主动发送,不考虑接收进程是否有能力接收,适合发送小消息
Rendezvous协议:在接收端协调缓存接收信息。适合发送较大消息
rank:每个进程的编号,通过指定rank进行进程间通信
displacement,lb,rb单位均为byte
#include "mpi.h"
MPI_Init(&argc, &argv); //初始化MPI
MPI_Comm_rank(MPI_COMM_WORLD, &rank); // 获取rank
MPI_Get_processor_name(name, &namelen); // 节点hostname
MPI_Comm_size(MPI_COMM_WORLD, &size); // process数量
MPI_Finalize();
MPI_Reduce
:将多个进程的结果合并到主进程
MPI_Reduce(
void* send_data,
void* recv_data,
int count,
MPI_Datatype datatype,
MPI_Op op,
int root,
MPI_Comm communicator)
send_data
:需要reduce的data,type为datatype
recv_data
:rank root
接收的信息,大小sizeof(datatype) * count
op
: reduce操作符 e.g. : MPI_MAX
, MPI_MIN
....
MPI_Allreduce
将多个进程结果reduce后传给每个进程
MPI_Allreduce(
void* send_data,
void* recv_data,
int count,
MPI_Datatype datatype,
MPI_Op op,
MPI_Comm communicator)
同reduce,不需要root
MPI_Iprobe
:非阻塞对信息检验
int MPI_Iprobe(
int source,
int tag,
MPI_Comm comm,
int *flag,
MPI_Status * status)
在接收前检测接收的信息,不需要真正接收
使用MPI_Recv
接收信息
MPI_Probe
:阻塞的对信息检验
int MPI_Probe(
int source,
int tag,
MPI_Comm comm,
MPI_Status *status)
同MPI_Iprobe
,阻塞检验
MPI_Recv
:阻塞接收信息
int MPI_Recv(
void *buf,
int count,
MPI_Datatype datatype,
int source,
int tag,
MPI_Comm comm,
MPI_Status *status)
阻塞接收信息,在写完buf
后返回,可以先于对应send
返回
MPI_Send(&outMsg, msgLen. MPI_CHAR, receiver, tag, MPI_COMM_WORLD);
MPI_Recv(&inMsg, msgLen, MPI_CHAR, sender, tag, MPI_COMM_WORLD, &stat);
MPI_Bcast
一对多广播
MPI_Bcast(
void* buffer,
int count,
MPI_Datatype datatype,
int root,
MPI_Comm comm)
count : 信息长度
MPI_Scatter
一对多发送不同消息
MPI_Gather
多对一收集不同消息
MPI_Scatterv
一对多发送不同长度消息
MPI_Gatherv
一对多接收不同长度消息
MPI_Scan
相当于结果为前缀和的all_reduce
MPI_Init(&argc, &argv);
MPI_Finalize();
mpirun -n 16 sst emberLoad.py #指定mpi以16个rank执行
形如 $$ T(n) = a\cdot T(\frac{n}{b}) + f(n)$$
若$$f(n) = O(n^{log_b a-\epsilon})$$,则 $$T(n) = \Theta(n^{log_b a}) $$
若$$f(n) = O(n^{log_b a}\cdot log^k n)$$,则$$ T(n) = \Theta(n^{log_b a} log^{k+1} n) $$