简体   繁体   English

如何使用MAGMA搭配NVIDIA GPU卡代替CPU LAPACKE逆大矩阵

[英]How to use MAGMA with NVIDIA GPU card instead of CPU LAPACKE to inverse large matrix

I need to inverse large matrices and I would like to modify my current LAPACKE version routine in order to exploit the powerfull of a GPU NVIDIA Card.我需要对大型矩阵求逆,我想修改我当前的 LAPACKE 版本例程,以便利用 GPU NVIDIA 卡的强大功能。

Indeed, my LAPACKE routines works well for relative small matrices but not for large matrices.事实上,我的 LAPACKE 例程适用于相对较小的矩阵,但不适用于大型矩阵。

Below thr implementation of this LAPACKE routine:下面是这个 LAPACKE 例程的实现:

 #include <mkl.h>

// Passing Matrixes by Reference
void matrix_inverse_lapack(vector<vector<double>> const &F_matrix, vector<vector<double>> &F_output) {

  // Index for loop and arrays
  int i, j, ip, idx;

  // Size of F_matrix
  int N = F_matrix.size();

  int *IPIV = new int[N];

 // Output Diagonal block
  double *diag = new double[N];

  for (i = 0; i<N; i++){
    for (j = 0; j<N; j++){
      idx = i*N + j;
      arr[idx] = F_matrix[i][j];
    }
  }

  // LAPACKE routines
  int info1 = LAPACKE_dgetrf(LAPACK_ROW_MAJOR, N, N, arr, N, IPIV);
  int info2 = LAPACKE_dgetri(LAPACK_ROW_MAJOR, N, arr, N, IPIV);

 for (i = 0; i<N; i++){
    for (j = 0; j<N; j++){
      idx = i*N + j;
      F_output[i][j] = arr[idx];
    }
  }

  delete[] IPIV;
  delete[] arr;
}

with is called like this to inverse CO_CL matrix:像这样调用 with 来逆 CO_CL 矩阵:

matrix_inverse_lapack(CO_CL, CO_CL);

with CO_CL defined by: CO_CL 定义为:

vector<vector<double>> CO_CL(lsize*(2*Dim_x+Dim_y), vector<double>(lsize*(2*Dim_x+Dim_y), 0));

How can I use MAGMA for NVIDIA for inversing matrix in my case instead of using LAPACKE?在我的案例中,如何使用 NVIDIA 的 MAGMA 而不是使用 LAPACKE 来求逆矩阵?

UPDATE 1: I have donwloaded magma-2.6.1 and firstly, I have to modify the original Makefile:更新 1:我已经下载了magma-2.6.1 ,首先,我必须修改原来的 Makefile:

CXX = icpc -std=c++11 -O3 -xHost
CXXFLAGS = -Wall -c -I${MKLROOT}/include -I/opt/intel/oneapi/compiler/latest/linux/compiler/include -qopenmp -qmkl=parallel
LDFLAGS = -L${MKLROOT}/lib -Wl,-rpath,${MKLROOT}/lib -Wl,-rpath,${MKLROOT}/../compiler/lib -qopenmp -qmkl
SOURCES = main_intel.cpp XSAF_C_intel.cpp
EXECUTABLE = main_intel.exe

I didn't see mkl headers in magma-2.6.1 : nvcc and MKL are compatibles?我没有在magma-2.6.1中看到mkl标头: nvccMKL兼容吗?

Try using magma sgetri gpu - inverse matrix in single precision, GPU interface.尝试使用magma sgetri gpu - 单精度逆矩阵,GPU 接口。 This function computes in single precision the inverse A^−1 of an m × m matrix A.这个 function 以单精度计算 m × m 矩阵 A 的逆 A^−1。

magma_ssetmatrix ( m, m, a,m, d_a ,m, queue ); // copy a -> d_a
magmablas_slacpy ( MagmaFull ,m,m,d_a ,m,d_r ,m, queue ); // d_a - >d_r
// find the inverse matrix : d_a *X=I using the LU factorization
// with partial pivoting and row interchanges computed by
// magma_sgetrf_gpu ; row i is interchanged with row piv (i);
// d_a -mxm matrix ; d_a is overwritten by the inverse
gpu_time = magma_sync_wtime ( NULL );
magma sgetrf gpu( m, m, d a, m, piv, &info);
magma sgetri gpu(m,d a,m,piv,dwork,ldwork,&info);

The official documentation of NVIDIA contains quite a lot of examples, so you may also take a look at them: NVIDIA的官方文档中有很多例子,你也可以看看:

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM