集群版
可替换性
当前KML_SCASOLVER支持多节点多进程多线程,可以替代PETSc的多节点多进程功能。
如表 PETSc的替换映射关系所示为可替换的接口与PETSc相应接口的映射关系(仅给出已优化的接口)。
PETSc接口 |
KML_SCASOLVER接口 |
|---|---|
KSPCreate |
KmlScaissCgInitStripesDI |
KSPSetTolerances |
KmlScaissCgSetDII |
KSPSolve |
KmlScaissCgSolveDI |
KSPGetIterationNumber/ KSPGetResidualNorm |
KmlScaissCgGetDII/ KmlScaissCgGetDID |
KSPDestroy |
KmlScaissCgCleanDI |
以上接口均为C接口,请参见《Kunpeng HPCKit 25.2.0 开发指南》中“鲲鹏数学库开发指南 > 应用数学库 > KML_SOLVER库函数说明 > 函数定义(集群版)”章节。
C语言迁移步骤
第一种:直接迁移
PETSc提供C接口,KML_SCASOLVER同样也提供了C接口,但接口名及接收参数不一致,需要进行对应功能的切换,举例如下:
- 初始化。迁移前:
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);
- 设定求解参数
迁移后:
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);
- 求解。迁移前:
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);
- 获取迭代参数。迁移前:
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[] = {max_iters}; err = KmlScaissCgGetDII(&handle, KMLSS_ITERATION_COUNT, data, 1); double ddata[] = {eps}; err = KmlScaissCgGetDID(&handle, KMLSS_TOLERANCE, ddata, 1);
- 清除。
迁移后:
1err = KmlScaissCgCleanDI(&handle);
- 头文件。
#include "petscksp.h"
迁移后:
#include "kml_scaiss.h"
- 编译链接。
第二种:通过适配层迁移
- 将#include "petscksp.h"改为#include "petscksp_kp.h",MatCreateMPIAIJWithArrays与VecCreateMPIWithArray接口需要在第二个参数位置新增参数ilower(当前进程上矩阵首行对应的全局下标)。
- 通过加载HPCkit相关环境变量,设置petsc的头文件路径和KML适配层动态库路径,环境变量的具体加载方式参见《Kunpeng HPCKit 25.2.0 安装指南》中“设置环境变量”章节,设置成功后重新编译应用。
mpicc program.c -lpetsc -lkscasolver -lkservice -lklapack_full -lkblas -lkm -lm
PETSc接口 |
|---|
PetscInitialize |
PetscFinalize |
MatCreateMPIAIJWithArrays |
VecCreateMPIWithArray |
KSPCreate |
KSPSetOperators |
KSPSetType |
KSPSetTolerances |
KSPSetUp |
KSPSolve |
KSPGetIterationNumber |
KSPGetResidualNorm |
KSPGetPC |
PCSetType |
KSPDestroy |
VecDestroy |
MatDestroy |
VecGetArray |