第一种:直接迁移
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); |
1 | err = KmlScaissCgCleanDI(&handle); |
#include "petscksp.h"
迁移后:
#include "kml_scaiss.h"
替换PETSc相关的链接选项,具体选项请参见《Kunpeng HPCKit 25.0.0 安装指南》安装KML。
第二种:通过适配层迁移
mpicc program.c -I /PATH_TO_KML_INCLUDE -L /PATH_TO_KML_ADAPTER -lpetsc -L /PATH_TO_KSCASOLVER -lkscasolver -lkservice -lklapack_full -L /PATH_TO_KBLAS -lkblas -L /PATH_TO_KM -lkm -lm
示例:
mpicc program.c -I ~/HPCKit/latest/kml/gcc/include -L ~/HPCKit/latest/kml/gcc/lib/noarch -lpetsc -L ~/HPCKit/latest/kml/gcc/lib/neon -lkscasolver -lkservice -lklapack_full -L ~/HPCKit/latest/kml/gcc/lib/neon/kblas/multi -lkblas -L ~/HPCKit/latest/kml/gcc/lib/noarch -lkm -lm
export LD_LIBRARY_PATH=/PATH_TO_KML_ADAPTER:/PATH_TO_KSCASOLVER:/PATH_TO_KBLAS:$LD_LIBRARY_PATH
示例:
export LD_LIBRARY_PATH=~/HPCKit/latest/kml/gcc/lib/noarch:~/HPCKit/latest/kml/gcc/lib/neon:~/HPCKit/latest/kml/gcc/lib/neon/kblas/multi:$LD_LIBRARY_PATH
PETSc接口 |
---|
PetscInitialize |
PetscFinalize |
MatCreateMPIAIJWithArrays |
VecCreateMPIWithArray |
KSPCreate |
KSPSetOperators |
KSPSetType |
KSPSetTolerances |
KSPSetUp |
KSPSolve |
KSPGetIterationNumber |
KSPGetResidualNorm |
KSPGetPC |
PCSetType |
KSPDestroy |
VecDestroy |
MatDestroy |
VecGetArray |