开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

ARM Intrinsic使能矩阵计算加速

Intrinsic编译是指将内置函数(intrinsic function)转换为机器代码的过程。内置函数是一些在编程语言中预定义的函数,它们通常用于执行一些底层操作或者优化特定的任务。在编译过程中,编译器会将这些内置函数转换为对应的机器指令,以便在运行时能够更高效地执行。同样地,ARM也提供了一组编译器内置的Intrinsic 函数,以便C/C++程序使能矩阵算力。

常用的矩阵算力使能的Intrinsic 函数可以分为4类,分别是2D 累加器ZA清空函数、READ函数、ADDHA/ADDVA函数以及MOPA/MOPS函数。具体的ARM Intrinsic函数可以在ARM官方查阅:《ARM Intrinsics》,也可以参考ARM 提供的 C/C++ 语言扩展标准文档:《 Arm C Language Extensions (ACLE)》

以下为一个简单的使用Arm intrinsic实现的一次单精度浮点数据向量外积操作示例:

void mopa(svfloat32_t v1, const float *src) __arm_streaming     // This function enters and returns in streaming-SVE mode. 
{
    svzero_za();                                                // Initialize ZA by zeroing all tiles.
    svbool_t p1 = svwhilelt_b32(0, 16);                         // Initialize predicate p1 with every element is active.
    svbool_t p2 = svwhilelt_b32(0, 16);                         // Initialize predicate p2 with every element is active.
    svfloat32_t v2 = svld1_f32(p2, src);                        // Load vector v2.

    svmopa_za32_m(/*tile*/0, p1, p2, v1, v2);                   // Sum of outer products and accumulate in ZA tile 0.

    for (int t = 0; t < 16; t++) {                              // write the ZA0 to output.
        svst1_hor_za32(0, t, p1, &output[t * 16]);              // svst1_hor_za32("0 for ZA0", "hor", p, "target addr"); 
    } 
    return; 
}

更多不同数据类型的Arm intrinsic实现可以参考hpckit-sample开源仓中综合用例目录下的Arm intrinsic用例。