昇腾AI原生创新算子挑战赛(S1赛季)复盘- FastGeluGrad算子

  • 正文前感谢昇腾各位工作人员,没有你们的辛勤就没有我们的进步
  • 本文立意交流大赛FastGeluGrad算子编译过程
  • 这道题是在FastGelu基础上的升级题目,嗯,不难,公式很吓人

cke_2160.png

  • 算子要求fp16,fp32 ,计算类型符合所有的API公式限制,也就是说不需要类型转换
  • 比FastGelu多了一个输入dy,两个输入,一个输出,并不需要大幅度的数据搬迁
  • 唯一需要解决的就是compute的算法设计

  __aicore__ inline void Compute(int32_t progress) {
    LocalTensor<DTYPE_X> inLocal = inQueueIN.DeQue<DTYPE_X>();
    
    LocalTensor<DTYPE_DY> dyLocal = inLocal[0];
    LocalTensor<DTYPE_X> xLocal = inLocal[this->tileLength];
    LocalTensor<DTYPE_Z> outLocal = outQueueOUT.AllocTensor<DTYPE_Z>();
    LocalTensor<DTYPE_Z> tempTensor1 = calcBuf.Get<DTYPE_Z>();
    LocalTensor<DTYPE_Z> tempTensor2 = calcBuf1.Get<DTYPE_Z>();

    Abs(tempTensor1, xLocal, this->tileLength);
    Muls(tempTensor1, tempTensor1, (DTYPE_Z)(-1.702), this->tileLength);
    Exp(tempTensor1, tempTensor1, this->tileLength);//exp(-1.702abs(x))
    Adds(outLocal, tempTensor1, (DTYPE_Z)(1), this->tileLength);
    Mul(outLocal, outLocal, outLocal, this->tileLength);//分母

    Abs(tempTensor2, xLocal, this->tileLength);
    Sub(tempTensor2, xLocal, tempTensor2, this->tileLength);//x-abs(x)
    Muls(tempTensor2, tempTensor2, (DTYPE_Z)(1.702), this->tileLength);//1.702(x-abs(x))
    Exp(tempTensor2, tempTensor2, this->tileLength);//exp(1.702(x-abs(x)))
    Add(tempTensor2, tempTensor2, tempTensor1,this->tileLength);//exp(-1.702abs(x)) + exp(1.702(x-abs(x))) 
    Mul(tempTensor1, tempTensor1, xLocal, this->tileLength);//xexp(-1.702abs(x))
    Muls(tempTensor1, tempTensor1, (DTYPE_Z)(1.702), this->tileLength);//1.702xexp(-1.702abs(x))
    Add(tempTensor2, tempTensor2, tempTensor1,this->tileLength);//exp(-1.702abs(x)) + exp(1.702(x-abs(x)))  + 1.702xexp(-1.702abs(x)) 
    Mul(tempTensor2, dyLocal, tempTensor2, this->tileLength);
    Div(outLocal, tempTensor2, outLocal, this->tileLength);
    


    outQueueOUT.EnQue<DTYPE_Z>(outLocal);

    inQueueIN.FreeTensor(inLocal);
  }复制

  • 下面是5个案例的测试结果
  • 第一个测试案例

cke_23916.png

  • 第二个测试案例

cke_28815.png

  • 第三个测试案例

cke_38187.png

  • 第四个测试案例

cke_46160.png

  • 第五个测试案例

cke_53388.png

  • 在测试案例中会遇到RuntimeWarning: invalid value encountered in true_divide
  • 这个Python警告通常在进行浮点数除法时出现。当被除数或除数的值为无效的特殊浮点数(如NaN或inf)时,就会发出该警告
  • 或者是某些情况下,数据的值可能超出了浮点数的表示范围,导致除法运算产生无效值。
  • 这里直接忽略了这个warnings
  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值