鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

迁移步骤

MUMPS提供C接口,KML_SCASOLVER同样也提供了C接口,直接进行适配层的迁移

  1. 将#include "dmumps_c.h"改为#include "MUMPS_kp.h"。
  2. 在适配层当前目录下生成适配层动态库。/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
  3. 在编译选项中将原先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
  4. 添加环境变量
    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;
}