---
title: 集群版
description: "用户通过给结构体中的变量赋值控制求解过程，可以通过给JOB参数赋不同的值控制MUMPS执行的具体操作，控制MUMPS求解功能的主要参数还包括数组ICNTL和CNTL。另一方面，用户可以通过结构体获取最中间或者最终的求解结果。当前KML_SCASOLVER支持多节点多进程多线程，可以替代MUMPS的多节点多进程功能。当前已实现double类型的MUMPS接口，JOB参数为-1、-2、1、2、3、6，支持一般矩阵、对称正定矩阵和一般对称矩阵。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/mg/kunpengaccel_12_0063.html
sourcePath: /source/zh/kunpenghpcs/hpckit/mg/kunpengaccel_12_0063.html
indexId: 9026ae8409628d0b4ba75705720849f15f97ec3d155a779241dbd4e5d9a138d058
---
# 集群版


#### 可替换性

用户通过给结构体中的变量赋值控制求解过程，可以通过给JOB参数赋不同的值控制MUMPS执行的具体操作，控制MUMPS求解功能的主要参数还包括数组ICNTL和CNTL。另一方面，用户可以通过结构体获取最中间或者最终的求解结果。当前KML_SCASOLVER支持多节点多进程多线程，可以替代MUMPS的多节点多进程功能。当前已实现double类型的MUMPS接口，JOB参数为-1、-2、1、2、3、6，支持一般矩阵、对称正定矩阵和一般对称矩阵。


**表1 MUMPS的替换映射关系**

| MUMPS接口 | KML\_SOLVER接口 |
| --- | --- |
| id.job=JOB\_INIT; dmumps\_c(&id); | KmlScadssInit |
| id.job=1; dmumps\_c(&id); | KmlScadssAnalyze |
| id.job=2; dmumps\_c(&id); | KmlScadssFactorize |
| id.job=3; dmumps\_c(&id); | KmlScadssSolve |
| id.job=JOB\_END; dmumps\_c(&id); | KmlScadssClean |


#### 迁移步骤

通过适配层迁移

MUMPS提供C接口，KML_SCASOLVER同样也提供了C接口，直接进行适配层的迁移。

1. 将#include "dmumps_c.h"改为#include "MUMPS_kp.h"。
2. 通过加载HPCkit相关环境变量，设置KML求解器适配器的头文件MUMPS_kp.h所在路径和kscasolver动态库路径，具体加载方式可参见《Kunpeng HPCKit 26.1.RC1 安装指南》(https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/instg/KunpengHPCKit_install_015.html)中“设置环境变量”章节，然后在重新编译应用。

```
mpicc program.c  -ldmumps_kp  -lkscasolver -lkservice -lklapack  -lkblas  -lkm -lm
```


迁移前后，mumps的初始化接口与使用KML适配层的初始化接口不一样，mumps的初始化在传入A矩阵之前，而KML适配层需要在传入A矩阵之后。

*实际应用场景中往往需要更加灵活的调用，可参考适配层的内部实现：dmumps_kunpeng.c(https://gitee.com/kunpengcompute/hpckit/blob/master/build/kml/kml_scasolver_adapter/src/dmumps_kunpeng.c)

迁移前：```
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
#include "dmumps_c.h"
int main ( int argc , char**argv ) {
    DMUMPS_STRUC_C id ;
    int n = 2;
    int64_t nnz = 2;
    int irn[] = { 1, 2 }; // MUMPS只支持COO存储格式
    int jcn[] = { 1, 2 };
    double *a = (double *)malloc(2*sizeof(double));
    double *rhs = (double *)malloc(2*sizeof(double));
    //double a[2];
    //double rhs[2];
    double sol[] = {0, 0};
    int myid, ierr;
    ierr = MPI_Init(&argc, &argv);
    ierr = MPI_Comm_rank(MPI_COMM_WORLD, &myid);
    /*Define A and rhs */ 
    rhs[0] = 1.0;
    rhs[1] = 4.0;
    a[0] = 1.0;
    a[1] = 2.0;
    /*Initialize MUMPS instance.Use MPI COMM WORLD.*/ 
    id.job = JOB_INIT;
    id.par = 1;
    id.sym = 0;
    id.comm_fortran = USE_COMM_WORLD;
    dmumps_c(&id);
    /*Define the problem on the host */ 
    if (myid == 0)
    {
        id.n = n;
        id.nnz = nnz;
        id.irn = irn;
        id.jcn = jcn;
        id.a = a;
        id.rhs = rhs;
    }

#define ICNTL(I) icntl[(I)-1] /*macro s.t.indices match documentation*/ /*No outputs */ 
    id.ICNTL(1) = -1;
    id.ICNTL(2) = -1;
    id.ICNTL(3) = -1;
    id.ICNTL(4) = 0;
    /*Call the MUMPS package.*/ 
    id.job = 6; //Analyze + Factorize + Solve
    dmumps_c(&id);
    id.job = JOB_END;
    dmumps_c(&id);
    /*Terminate instance */ if (myid == 0)
    {
        printf( " Solution is : (%8.2f %8.2f)\n", rhs[0], rhs[1]);
    }
    ierr = MPI_Finalize();
    return 0;
}
```


迁移后：```
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
#include "MUMPS_kp.h"
int main ( int argc , char**argv ) {
    DMUMPS_STRUC_C id ;
    int n = 2;
    int64_t nnz = 2;
    int irn[] = { 1, 2 }; // MUMPS只支持COO存储格式
    int jcn[] = { 1, 2 };
    double *a = (double *)malloc(2*sizeof(double));
    double *rhs = (double *)malloc(2*sizeof(double));
    //double a[2];
    //double rhs[2];
    double sol[] = {0, 0};
    int myid, ierr;
    ierr = MPI_Init(&argc, &argv);
    ierr = MPI_Comm_rank(MPI_COMM_WORLD, &myid);
    /*Define A and rhs */ 
    rhs[0] = 1.0;
    rhs[1] = 4.0;
    a[0] = 1.0;
    a[1] = 2.0;
    /*Initialize MUMPS instance.Use MPI COMM WORLD.*/ 
    id.job = JOB_INIT;
    id.par = 1;
    id.sym = 0;
    id.comm_fortran = USE_COMM_WORLD;   
    if (myid == 0)
    {
        id.n = n;
        id.nnz = nnz;
        id.irn = irn;
        id.jcn = jcn;
        id.a = a;
        id.rhs = rhs;
    }
    dmumps_c(&id); /*Define the problem on the host */ 

#define ICNTL(I) icntl[(I)-1] /*macro s.t.indices match documentation*/ /*No outputs */ 
    id.ICNTL(1) = -1;
    id.ICNTL(2) = -1;
    id.ICNTL(3) = -1;
    id.ICNTL(4) = 0;
    /*Call the MUMPS package.*/ 
    id.job = 6; //Analyze + Factorize + Solve
    dmumps_c(&id);
    id.job = JOB_END;
    dmumps_c(&id);
    /*Terminate instance */ if (myid == 0)
    {
        printf( " Solution is : (%8.2f %8.2f)\n", rhs[0], rhs[1]);
    }
    ierr = MPI_Finalize();
    return 0;
}
```
