Intrinsic 函数
在昇腾NPU的 Intrinsic_vmax(或类似的 Intrinsic 函数)中,intrinsic 的意思是内建的、固有的。来源于计算机科学中的 编译器与硬件指令 的概念。对它的理解可以分三步看:
-
普通函数调用(如
my_add(a,b)):- 编译器把普通函数编译成很多条通用机器指令。执行过程需要“调用-返回”的开销,且不一定能充分利用CPU(或NPU)的特殊能力。
-
内联汇编(如
asm("vmax ...")):- 直接在C/C++代码里写汇编指令,完全控制硬件。但缺点是:不通用、难移植、编写麻烦、容易出错。
-
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 等多种,加上向量计算、同步控制等接口,总数在数十到上百条量级。
- 点赞
- 收藏
- 关注作者
评论(0)