迁移步骤

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[] = {max_iters};
    err = KmlScaissCgGetDII(&handle, KMLSS_ITERATION_COUNT, data, 1); 
    double ddata[] = {eps};
    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 25.0.0 安装指南》安装KML。

第二种:通过适配层迁移

  1. 将#include "petscksp.h"改为#include "petscksp_kp.h",MatCreateMPIAIJWithArrays与VecCreateMPIWithArray接口需要在第二个参数位置新增参数ilower(当前进程上矩阵首行对应的全局下标)。
  2. 在编译选项中将原先petsc的头文件路径和动态库路径修改为KML适配层的对应路径,并且重新编译应用,/PATH_TO_KML_INCLUDE为KML头文件路径,/PATH_TO_KML_ADAPTER为KML求解器适配器安装路径/PATH_TO_KSCASOLVER为kscasolver安装路径,/PATH_TO_KBLAS为kblas安装路径/PATH_TO_KM 为km安装路径

    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

  3. 添加环境变量。

    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

表1 当前已适配接口

PETSc接口

PetscInitialize

PetscFinalize

MatCreateMPIAIJWithArrays

VecCreateMPIWithArray

KSPCreate

KSPSetOperators

KSPSetType

KSPSetTolerances

KSPSetUp

KSPSolve

KSPGetIterationNumber

KSPGetResidualNorm

KSPGetPC

PCSetType

KSPDestroy

VecDestroy

MatDestroy

VecGetArray