Intrinsic 函数

举报
黄生 发表于 2026/11/07 17:19:45 2026/11/07
【摘要】 在昇腾NPU的 Intrinsic_vmax(或类似的 Intrinsic 函数)中,intrinsic 的意思是内建的、固有的。来源于计算机科学中的 编译器与硬件指令 的概念。对它的理解可以分三步看:普通函数调用(如 my_add(a,b)):编译器把普通函数编译成很多条通用机器指令。执行过程需要“调用-返回”的开销,且不一定能充分利用CPU(或NPU)的特殊能力。内联汇编(如 asm("...

在昇腾NPU的 Intrinsic_vmax(或类似的 Intrinsic 函数)中,intrinsic 的意思是内建的、固有的。来源于计算机科学中的 编译器与硬件指令 的概念。对它的理解可以分三步看:

  1. 普通函数调用(如 my_add(a,b)):

    • 编译器把普通函数编译成很多条通用机器指令。执行过程需要“调用-返回”的开销,且不一定能充分利用CPU(或NPU)的特殊能力。
  2. 内联汇编(如 asm("vmax ...")):

    • 直接在C/C++代码里写汇编指令,完全控制硬件。但缺点是:不通用、难移植、编写麻烦、容易出错。
  3. Intrinsic 函数(如 __vmax(a,b)):

    • 它是中间形态:看起来像函数调用,但编译器会把它直接替换成一条或几条特定的、高效的硬件指令(比如NPU的向量取最大值指令)。
    • 它“内建”在编译器中:不是外部库函数,而是编译器自身认识的关键字/内建函数。

那么在昇腾NPU语境下,NPU是为AI计算设计的,Intrinsic_vmax 很可能直接对应NPU的一条硬件向量指令,能在一个时钟周期内完成一组数据的求最大值,而用普通C循环或函数调用需要很多条指令。再比如Intrinsic_vsigmoid:

# 优先使用硬件intrinsic指令
if tbe_platform.intrinsic_check_support("Intrinsic_vsigmoid", dtype):
    res = tbe.vsigmoid(x)  # 调用硬件加速的sigmoid指令
    return res

总之,Intrinsic 意思是“内在的、本质的”——这种函数直接映射到处理器的内在指令集,是硬件能力最直接的软件表达。

扩展到Arm Intrinsics,在C语言层面直接操作向量指令,也是同样的道理。直接写汇编难度大、移植性差。Intrinsics是ARM提供的内置函数,允许你在C/C++代码中直接调用SIMD指令(如NEON或SVE指令),既保留了接近汇编的性能,又比手写汇编更易于开发和维护。使用如vaddq_f32(向量加法)这样的Intrinsics函数来替换循环中的标量操作,是实现代码向量化、大幅提升计算密度的主要手段。

再扩展到CCE Intrinsic 。其接口数量庞大,仅数据搬运类就有 copy_gm_to_ubuf、copy_gm_to_cbuf、copy_cbuf_to_gm、copy_matrix_cc_to_gm、copy_gm_to_cbuf_multi_nd2nz 等多种,加上向量计算、同步控制等接口,总数在数十到上百条量级。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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