deepx IR设计说明
1.除了newtensor以外,其他IR均不创建新的张量,而是引用已有的张量
2.IR的输入输出均使用张量名,而不是张量指针(后期IR可能支持直接用值)
3.命名,t开头为张量名,a开头为参数名,v开头为vector名
4.backward需要指令触发,箭头方向为<-,同时需要指定所有grad张量名
5.这份IR均为基本IR,也就是最基础的IR。如relu这类组合IR(可以用max_scalar实现的),则不会出现在这里
IR列表
单向IR(不支持backward)
IR |
说明 |
例子 |
例子作用 |
---|---|---|---|
argset |
设置参数 |
argset@int32 1->a1 |
设置a1为int32类型,值为1 |
argset |
设置参数 |
argset@int32 1->a1 |
设置a2为int32类型,值为2 |
argset |
设置vector参数 |
argset@int32 1 2 3->vec1 |
设置vec1为int32类型,值为1 2 3 |
argset |
设置vector参数 |
argset@int32 0 1 2->vec2 |
设置vec2为int32类型,值为0 1 2 |
argdel |
删除参数 |
argdel a |
删除a参数 |
newtensor |
创建张量 |
newtensor@int32 vec1->t1 |
创建一个int32类型的张量t1,并从vec1中复制数据 |
deltensor |
删除张量 |
deltensor t1 |
删除t1张量 |
constant |
tensor初始化-填充固定值 |
constant@int32 a1->t1 |
给t1填充固定值,值引用a1 |
arange |
tensor初始化-生成序列 |
arange@int32 a1 a2>t1 |
给t1生成序列,从a1开始,步长为a2 |
uniform |
tensor初始化-均匀分布 |
uniform@int32 a1 a2>t1 |
给t1生成均匀分布,low为a1,high为a2 |
双向IR(支持backward)
IR |
说明 |
例子 |
例子作用 |
---|---|---|---|
add |
矩阵加法 |
add@float32 t1 t2->t3 |
t3=t1+t2 |
add_scalar |
矩阵加法 |
add_scalar@float32 t1 a1->t3 |
t3=t1+a1,a1为常数 |
sub |
矩阵减法 |
sub@float32 t1 t2->t3 |
t3=t1-t2 |
mul |
矩阵乘法 |
mul@float32 t1 t2->t3 |
t3=t1*t2 |
mul_scalar |
矩阵乘法 |
mul_scalar@float32 t1 a1->t3 |
t3=t1*a1,a1为常数 |
div |
除法 |
div@float32 t1 t2->t3 |
t3=t1/t2 |
div_scalar |
除法 |
div_scalar@float32 t1 a1->t3 |
t3=t1/a1,a1为常数 |
mod (还没实现) |
取模 |
mod@float32 t1 t2->t3 |
t3=t1%t2 |
mod_scalar (还没实现) |
取模 |
mod_scalar@float32 t1 a1->t3 |
t3=t1%a1,a1为常数 |
exp |
指数 |
exp@float32 t1->t3 |
t3=exp(t1) |
sqrt |
平方根 |
sqrt@float32 t1->t3 |
t3=sqrt(t1) |
log |
对数 |
log@float32 t1->t3 |
t3=log(t1) |
sum |
规约计算-按dims求和 |
sum@float32 t1 vec2->t3 |
t3=sum(t1,dims=vec2),按vec2的维度求和 |
max |
规约计算-按dims求最大值 |
max@float32 t1 t2->t3 |
t3=max(t1,t2) |
max_scalar |
规约计算-按dims求最大值 |
max_scalar@float32 t1 a1->t3 |
t3=max(t1,a1),a1为常数 |
min |
规约计算-按dims求最小值 |
min@float32 t1 t2->t3 |
t3=min(t1,t2) |
min_scalar |
规约计算-按dims求最小值 |
min_scalar@float32 t1 a1->t3 |
t3=min(t1,a1),a1为常数 |
backward时,改变箭头方向为<-
IR |
说明 |
例子 |
例子作用 |
---|---|---|---|
add |
矩阵加法 |
add@float32 t1(t1_grad) t2(t2_grad)<-t3(t3_grad) |
t3=t1+t2,t3_grad=t1_grad+t2_grad |
add_scalar |
矩阵加法 |
add_scalar@float32 t1(t1_grad) a1<-t3(t3_grad) |
t3=t1+a1,t3_grad=t1_grad |
sub |
矩阵减法 |
sub@float32 t1(t1_grad) t2(t2_grad)<-t3(t3_grad) |
t3=t1-t2,t3_grad=t1_grad-t2_grad |
mul |
矩阵乘法 |
mul@float32 t1(t1_grad) t2(t2_grad)<-t3(t3_grad) |
t3=t1t2,t3_grad=t1_gradt2+t1*t2_grad |
mul_scalar |
矩阵乘法 |
mul_scalar@float32 t1(t1_grad) a1<-t3(t3_grad) |
t3=t1a1,t3_grad=t1_grada1 |
div |
除法 |
div@float32 t1(t1_grad) t2(t2_grad)<-t3(t3_grad) |
t3=t1/t2,t3_grad=t1_grad/t2-t1*t2_grad/t2^2 |
div_scalar |
除法 |
div_scalar@float32 t1(t1_grad) a1<-t3(t3_grad) |
t3=t1/a1,t3_grad=t1_grad/a1 |
mod (还没实现) |
取模 |
mod@float32 t1(t1_grad) t2(t2_grad)<-t3(t3_grad) |
t3=t1%t2,t3_grad=t1_grad%t2 |
mod_scalar (还没实现) |
取模 |
mod_scalar@float32 t1(t1_grad) a1<-t3(t3_grad) |
t3=t1%a1,t3_grad=t1_grad%a1,a1为常数 |
exp |
指数 |
exp@float32 t1(t1_grad)<-t3(t3_grad) |
t3=exp(t1),t3_grad=t1_grad*exp(t1) |
sqrt |
平方根 |
sqrt@float32 t1(t1_grad)<-t3(t3_grad) |
t3=sqrt(t1),t3_grad=t1_grad/(2*sqrt(t1)) |
log |
对数 |
log@float32 t1(t1_grad)<-t3(t3_grad) |
t3=log(t1),t3_grad=t1_grad/t1 |
sum |
规约计算-按dims求和 |
sum@float32 t1 vec2<-t3 |
t3=sum(t1,dims=vec2),按vec2的维度求和 |
max |
规约计算-按dims求最大值 |
max@float32 t1 t2<-t3 |
t3=max(t1,t2) |
max_scalar |
规约计算-按dims求最大值 |
max_scalar@float32 t1 a1<-t3 |
t3=max(t1,a1),a1为常数 |
min |
规约计算-按dims求最小值 |
min@float32 t1 t2<-t3 |
t3=min(t1,t2) |
min_scalar |
规约计算-按dims求最小值 |
min_scalar@float32 t1 a1<-t3 |
t3=min(t1,a1),a1为常数 |