迁移步骤
MUMPS提供C接口,KML_SCASOLVER同样也提供了C接口,直接进行适配层的迁移。
- 将#include "dmumps_c.h"改为#include "MUMPS_kp.h"。
- 在适配层当前目录下生成适配层动态库。/PATH_TO_KML_ADAPTER_INCLUDE为KML求解器适配器的头文件MUMPS_kp.h所在路径,/PATH_TO_KML_INCLUDE为KML头文件路径,/PATH_TO_KSCASOLVER为kscasolver安装路径。
mpicc dmumps_kunpeng.c -o libdmumps.so -I /PATH_TO_KML_ADAPTER_INCLUDE -I /PATH_TO_KML_INCLUDE -L /PATH_TO_KSCASOLVER -lkscasolver --shared -fPIC
示例:
mpicc dmumps_kunpeng.c -o libdmumps.so -I ~/include -I ~/HPCKit/latest/kml/gcc/include -L ~/HPCKit/latest/kml/gcc/lib/neon -lkscasolver --shared -fPIC
- 在编译选项中将原先MUMPS的头文件路径和动态库路径修改为KML适配层的对应路径,并且重新编译应用,
mpicc program.c -I /PATH_TO_KML_INCLUDE -I /PATH_TO_KML_ADAPTER_INCLUDE -L /PATH_TO_KML_ADAPTER -ldmumps -L /PATH_TO_KSCASOLVER -lkscasolver -lkservice -lklapack_full -L /PATH_TO_KBLAS -lkblas -L /PATH_TO_KM -lkm -lm
- /PATH_TO_KML_INCLUDE为KML头文件路径。
- /PATH_TO_KML_ADAPTER_INCLUDE为KML求解器适配器的头文件MUMPS_kp.h所在路径。
- /PATH_TO_KML_ADAPTER为KML求解器适配器生成路径。
- /PATH_TO_KSCASOLVER为kscasolver安装路径。
- /PATH_TO_KBLAS为kblas安装路径。
- /PATH_TO_KM为km安装路径。
示例:
mpicc program.c -I ~/HPCKit/latest/kml/gcc/include -I ~/include -ldmumps -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_KM:/PATH_TO_KSCASOLVER:/PATH_TO_KBLAS:$LD_LIBRARY_PATH
示例:
export LD_LIBRARY_PATH=$PWD:~/HPCKit/latest/kml/gcc/lib/noarch:~/HPCKit/latest/kml/gcc/lib/neon:~/HPCKit/latest/kml/gcc/lib/neon/kblas/multi:$LD_LIBRARY_PATH
迁移前后,mumps的初始化接口与使用KML适配层的初始化接口不一样,mumps的初始化在传入A矩阵之前,而KML适配层需要在传入A矩阵之后。
迁移前:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | #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; } |
迁移后:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #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; } |