---
title: 集群版
description: "当前KML_SCASOLVER支持多节点多进程多线程，可以替代PETSc的多节点多进程功能。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/mg/kunpengaccel_12_0058.html
sourcePath: /source/zh/kunpenghpcs/hpckit/mg/kunpengaccel_12_0058.html
indexId: 6dc0c7561a5d0cbe1c7219ca958970a36f3e50c0bfb6f54331dc9267e7b471a758
---
# 集群版

#### 可替换性

当前KML_SCASOLVER支持多节点多进程多线程，可以替代PETSc的多节点多进程功能。

如表 PETSc的替换映射关系所示为可替换的接口与PETSc相应接口的映射关系（仅给出已优化的接口）。


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

| PETSc接口 | KML\_SCASOLVER接口 |
| --- | --- |
| KSPCreate | KmlScaissCgInitStripesDI |
| KSPSetTolerances | KmlScaissCgSetDII |
| KSPSolve | KmlScaissCgSolveDI |
| KSPGetIterationNumber/ KSPGetResidualNorm | KmlScaissCgGetDII/ KmlScaissCgGetDID |
| KSPDestroy | KmlScaissCgCleanDI |


以上接口均为C接口，请参见《Kunpeng HPCKit 26.1.RC1 开发指南》(https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/devg/kunpengaccel_kml_0906.html)中“鲲鹏数学库开发指南 > 应用数学库 > KML_SOLVER库函数说明 > 函数定义（集群版）”章节。


#### C语言迁移步骤

第一种：直接迁移

PETSc提供C接口，KML_SCASOLVER同样也提供了C接口，但接口名及接收参数不一致，需要进行对应功能的切换，举例如下：

1. 初始化。
  迁移前： 1 2 3 4 KSP ksp; PetscErrorCode ierr; ierr = KSPCreate(PETSC_COMM_WORLD,&ksp); ierr = KSPSetOperators(ksp,A,A);

  迁移后： 1 2 3 4 5 6 7 8 9 10 int n = 8; int nstripes = 1; int stripeWidth[1]; int stripeRow[1]; int ia[9]; int ja[17]; double a[17]; KmlScasolverTask* handle; int err; err = KmlScaissCgInitStripesDI(&handle, n, nstripes , stripeWidth, stripeRow, a, ja, ia, MPI_COMM_WORLD);

2. 设定求解参数
  迁移前： 1 ierr = KSPSetTolerances(ksp,1e-4,PETSC_DEFAULT,PETSC_DEFAULT,2000);

  迁移后： 1 2 3 4 double eps = 1e-4; err = KmlScaissCgSetDID(&handle, KMLSS_THRESHOLD, &eps, 1); assert(err == 0); int max_iters = 2000; err = KmlScaissCgSetDII(&handle, KMLSS_MAX_ITERATION_COUNT, &max_iters, 1);

3. 求解。
  迁移前： 1 2 3 4 5 6 7 8 Vec u,x,b; ierr = VecCreate(PETSC_COMM_WORLD,&u); ierr = VecSetSizes(u,PETSC_DECIDE,rdim); ierr = VecSetFromOptions(u);CHKERRQ(ierr); ierr = VecDuplicate(u,&b);CHKERRQ(ierr); ierr = VecDuplicate(b,&x);CHKERRQ(ierr); ierr = KSPSolve(ksp,b,x);CHKERRQ(ierr);

  迁移后： 1 2 3 4 5 6 int nb=1; double* x[8]; double* b[8]; int ldx=4; int ldb=4; err = KmlScaissCgSolveDI(&handle, nb, x, ldx, b, ldb);

4. 获取迭代参数。
  迁移前： 1 2 3 4 PetscInt its; PetscScalar norm; ierr = KSPGetIterationNumber(ksp,&its);CHKERRQ(ierr); ierr = KSPGetResidualNorm(ksp,&norm);CHKERRQ(ierr);

  迁移后： 1 2 3 4 int idata[] = {0}; err = KmlScaissCgGetDII(&handle, KMLSS_ITERATION_COUNT, idata, 1); double ddata[] = {0}; err = KmlScaissCgGetDID(&handle, KMLSS_TOLERANCE, ddata, 1);

5. 清除。
  迁移前： 1 ierr = KSPDestroy(&ksp);

  迁移后： 1 err = KmlScaissCgCleanDI(&handle);

6. 头文件。
  迁移前：

  #include "petscksp.h"

  迁移后：

  #include "kml_scaiss.h"

7. 编译链接。
  替换PETSc相关的链接选项，具体选项请参见《Kunpeng HPCKit 26.1.RC1 安装指南》(https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/instg/KunpengHPCKit_install_024.html)安装KML。


第二种：通过适配层迁移

1. 将#include "petscksp.h"改为#include "petscksp_kp.h"，MatCreateMPIAIJWithArrays与VecCreateMPIWithArray接口需要在第二个参数位置新增参数ilower（当前进程上矩阵首行对应的全局下标）。
2. 通过加载HPCkit相关环境变量，设置PETSc的头文件路径和KML适配层动态库路径，环境变量的具体加载方式参见《Kunpeng HPCKit 26.1.RC1 安装指南》(https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/instg/KunpengHPCKit_install_015.html)中“设置环境变量”章节，设置成功后重新编译应用。

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


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


**表2 当前已适配接口**

| PETSc接口 |
| --- |
| PetscInitialize |
| PetscFinalize |
| MatCreateMPIAIJWithArrays |
| VecCreateMPIWithArray |
| KSPCreate |
| KSPSetOperators |
| KSPSetType |
| KSPSetTolerances |
| KSPSetUp |
| KSPSolve |
| KSPGetIterationNumber |
| KSPGetResidualNorm |
| KSPGetPC |
| PCSetType |
| KSPDestroy |
| VecDestroy |
| MatDestroy |
| VecGetArray |
