【CANN训练营2023年第二季】我玩的就是真实!!Ascend C核函数如何传入标量参数

举报
yd_286753431 发表于 2023/12/19 04:46:45 2023/12/19
5.2k+ 0 0
【摘要】 PS:巨量时间,不断踩坑,悲凉血泪史,总结成的小小见解。如果各位觉得写的还行,劳请各位老师们点赞收藏一波!!各位老师的鼓励是我坚持写作的动力!!我玩的就是真实!!!我玩的就是真实!!!我玩的就是真实!!!这是个挺好的问题,以下解决方案仅代表个人见解,如果有更好的方案,希望大家不吝提出,共同学习问:Ascend C核函数如何传入标量参数?这个问题来源于论坛某位大佬提出的问题,本人在编写addc...

PS:巨量时间,不断踩坑,悲凉血泪史,总结成的小小见解。

如果各位觉得写的还行,劳请各位老师们点赞收藏一波!!各位老师的鼓励是我坚持写作的动力!!

我玩的就是真实!!!我玩的就是真实!!!我玩的就是真实!!!

这是个挺好的问题,以下解决方案仅代表个人见解,如果有更好的方案,希望大家不吝提出,共同学习

问:Ascend C核函数如何传入标量参数?

这个问题来源于论坛某位大佬提出的问题,本人在编写addcdiv的过程中也遇到这个问题

所以就想记录下个人思路

cke_38522.png

首先介绍下addcdiv算子,这个算子可厉害,几乎把矢量,标量算法API都用上

cke_85125.png

个人思路是把标量做在tilling接口内,定义为ND类型,然后再通过GM_ADDR接口也就是

__gm__ uin8_t* 向量传入,再进行相应的类型转换就可以了,详细的例子见下面

举例在XXX.json 中'input_desc'有一项value是标量


            {
                "name": "value",
                "param_type": "optional",
                "format": [
                    "ND"
                ],
                "type": [
                    "fp16"
                ]
            }复制

在op_kernel中同样以GM_ADDR的形式传入

cke_197054.png

使用下列代码进行转换

首先用reinterpret_cast<__gm__ half*>(value)将__gm__ uin8*_t 转换成 __gm__ half

再直接用*去取实际half 数值

接下来用static_cast将half类型转换成为float类型


        inputVal1 = *(reinterpret_cast<__gm__ half*>(value));  
        inputVal2 = static_cast<float>(inputVal1);  复制

PS:巨量时间,不断踩坑,悲凉血泪史,总结成的小小见解。

如果各位觉得写的还行,劳请各位老师们点赞收藏一波!!各位老师的鼓励是我坚持写作的动力!!

我玩的就是真实!!!我玩的就是真实!!!我玩的就是真实!!!

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。