Sgetri

产品支持情况

产品 是否支持
Atlas 200I/500 A2 推理产品 ×
Atlas 推理系列产品 ×
Atlas 训练系列产品 ×
Atlas A3 训练系列产品/Atlas A3 推理系列产品
Atlas A2 训练系列产品/Atlas A2 推理系列产品
Ascend 950PR/Ascend 950DT ×

功能说明

  • 接口功能
    aclsolverSgetri:计算实数矩阵的逆矩阵。

  • 计算公式

    A−1A=IA^{-1}A = I

    其中AAn×nn \times n阶非奇异实数方阵,IInn阶单位矩阵。

  • 示例
    输入"A"为:

    [4.0, 3.0, 2.0, 1.0
     3.0, 4.0, 3.0, 2.0
     2.0, 3.0, 4.0, 3.0
     1.0, 2.0, 3.0, 4.0]
    

    输入"n"为: 4
    调用"aclsolverSgetri"算子后,
    输出"A"为:

    [0.4, -0.3, 0.2, -0.1
     -0.3, 0.6, -0.4, 0.2
     0.2, -0.4, 0.6, -0.3
     -0.1, 0.2, -0.3, 0.4]
    

函数原型

  • 函数定义

    aclError aclsolverSgetri(
        aclsolverHandle_t handle,
        const int64_t n,
        float *A,
        const int64_t lda,
        int32_t *info);
    
  • 参数说明:

    参数名 输入输出 描述
    handle 输入 solver handle,通过aclsolverCreate创建
    n 输入 矩阵A的行数和列数
    A 输入/输出 输入为矩阵A(通常为Sgetrf分解后的L和U矩阵),输出为逆矩阵
    数据类型仅支持FLOAT32,数据格式支持ND,shape为[n, n]
    lda 输入 A同一列中相邻两行元素间的内存地址偏移量(leading dimension)(当前约束为n)
    info 输出 求逆结果信息
    数据类型支持int32_t
  • 算子约束:

    • lda、info参数在当前版本实际未启用。
  • 调用实现 使用内核调用符<<<>>>调用核函数。

调用示例

  • 完整代码示例:aclsolverSgetri矩阵求逆示例

  • 核心调用步骤:

    #include <vector>
    #include "acl/acl.h"
    #include "cann_ops_solver.h"
    
    int32_t main(int32_t argc, char *argv[])
    {
        // 固定写法,acl初始化
        int32_t deviceId = 0;
        aclrtStream stream = nullptr;
        aclInit(nullptr);
        aclrtSetDevice(deviceId);
        aclrtCreateStream(&stream);
    
        // 创建solver handle并设置stream
        aclsolverHandle_t handle = nullptr;
        aclsolverCreate(&handle);
        aclsolverSetStream(handle, stream);
    
        // 构造输入数据
        int64_t n = 4;
        size_t aMatrixFileSize = n * n * sizeof(float);
        float* A;
        aclrtMallocHost((void**)(&A), aMatrixFileSize);
        // 填充A矩阵数据...
    
        int32_t *info;
    
        // 调用 aclsolverSgetri
        auto ret = aclsolverSgetri(handle, n, A, n, info);
        CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclsolverSgetri failed. ERROR: %d\n", ret); return ret);
    
        // 释放资源
        aclrtFreeHost(A);
        aclsolverDestroy(handle);
        aclrtDestroyStream(stream);
        aclrtResetDevice(deviceId);
        aclFinalize();
    
        return 0;
    }